ZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL0luc3RhbGxhdGlvbl9HdWlkZS5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmMmU2MQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL0luc3RhbGxhdGlvbl9HdWlkZS5odG1sCkBAIC0wLDAgKzEsMzQ5IEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzYuJm5ic3A7SW5zdGFsbGF0aW9uIEd1aWRlPC90aXRsZT4KKzxsaW5rIGhyZWY9ImJvb2suY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc2LjAiIG5hbWU9ImdlbmVyYXRvciI+Cis8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs1LiZuYnNwO1Byb2dyYW1lciBHdWlkZSI+Cis8bGluayByZWw9Im5leHQiIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzcuJm5ic3A7TmV3IGFuZCBOb3Rld29ydGh5Ij4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5DaGFwdGVyJm5ic3A7Ni4mbmJzcDtJbnN0YWxsYXRpb24gR3VpZGU8L3RoPgorPC90cj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNjAlIj4mbmJzcDs8L3RoPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzYuJm5ic3A7SW5zdGFsbGF0aW9uIEd1aWRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5zdGFsbGF0aW9uX0d1aWRlIj48L2E+Q2hhcHRlciZuYnNwOzYuJm5ic3A7SW5zdGFsbGF0aW9uIEd1aWRlPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InRvYyI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwjVG9vbHMiPlRvb2xzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwjQ29tcGxldGVfSURFIj5Db21wbGV0ZSBJREU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNFY2xpcHNlX2FuZF90aGVfQWdlbnRfTW9kZWxpbmdfVG9vbHMiPkVjbGlwc2UgYW5kIHRoZSBBZ2VudCBNb2RlbGluZyBUb29sczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI0V4dGVuc2lvbnMiPkV4dGVuc2lvbnM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNBc2NhcGUiPkFzY2FwZTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI1JlcGFzdCI+UmVwYXN0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI01vZGVscyI+TW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwjT2J0YWluaW5nX0V4YW1wbGVfTW9kZWxzIj5PYnRhaW5pbmcgRXhhbXBsZSBNb2RlbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNUZWFtX1Byb2plY3RfU2V0cyI+VGVhbSBQcm9qZWN0IFNldHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNGcm9tX1ZlcnNpb25fQ29udHJvbF9TeXN0ZW1zIj5Gcm9tIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlRvb2xzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJUb29scyI+PC9hPlRvb2xzPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb21wbGV0ZSBJREUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb21wbGV0ZV9JREUiPjwvYT5Db21wbGV0ZSBJREU8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IG1heSBhbHJlYWR5IGhhdmUgb2J0YWluZWQgYSBjb21wbGV0ZSBJREUgYnVuZGxlZCB3aXRoIEFNUCBhbmQgb3RoZXIgbW9kZWxpbmcgdG9vbHMuIFRoZSBwcm9qZWN0IGNvbnRyaWJ1dG9ycyBvZmZlciBvcGVuIHNvdXJjZSBhbmQgY29tbWVyY2lhbCB2ZXJzaW9ucyBvZiB0aGUgQU1QIHRvb2xzLCB3aGljaCB5b3UgY2FuIGZpbmQgYXQgdGhlaXIgc2l0ZXMuIElmIHNvLCB5b3UgY2FuIG1vc3RseSBpZ25vcmUgdGhpcyBjaGFwdGVyIHVubGVzcyB5b3Ugd2FudCB0byBpbnN0YWxsIGFuIG9wdGlvbmFsIGNvbXBvbmVudCBsaWtlIFJlcGFzdC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFY2xpcHNlIGFuZCB0aGUgQWdlbnQgTW9kZWxpbmcgVG9vbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFY2xpcHNlX2FuZF90aGVfQWdlbnRfTW9kZWxpbmdfVG9vbHMiPjwvYT5FY2xpcHNlIGFuZCB0aGUgQWdlbnQgTW9kZWxpbmcgVG9vbHM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IGNhbiBmaW5kIG1vcmUgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9hbXAvaW5zdGFsbGluZy8iIHRhcmdldD0iX25ldyI+aGVyZTwvYT4sIGJ1dCBoZXJlIGFyZSB0aGUgYmFzaWMgc3RlcHMuCisJCQkJPC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEVjbGlwc2UgZnJvbSAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzLyIgdGFyZ2V0PSJfbmV3Ij5oZXJlPC9hPi4gQU1QIHJlcXVpcmVzIHZlcnNpb24gMy41LnggKEdhbGxpZW8pIG9yIGhpZ2hlci4gVmVyc2lvbiAzLjYgKEhlbGxvcykgd2hpY2ggaXMgY3VycmVudGx5IGEgZGV2ZWxvcG1lbnQgKGJldGEpIHJlbGVhc2Ugd29ya3Mgd2VsbCB0b28uIFdlIHJlY29tbWVuZCB0aGUgIkNsYXNzaWMiIHJlbGVhc2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSBhcyB0aGUgb3RoZXIgcmVsZWFzZXMgaGF2ZSBhIGJ1bmNoIG9mIHN0dWZmIHlvdSB3b250JyBuZWVkLgorCQkJCQkJPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+QWRkIHVwZGF0ZSBzaXRlcyBmb3IgQU1QIGFuZCBBTVAgZGVwZW5kZW5jaWVzLiBTZWUgdGhlIHNjcmVlbnNob3QgYmVsb3cgYW5kIHRoZSAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9oZWxwLmVjbGlwc2Uub3JnL2dhbGlsZW8vdG9waWMvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdGFza3MvdGFza3MtMTI0Lmh0bSIgdGFyZ2V0PSJfbmV3Ij5FY2xpcHNlIERvY3VtZW50YXRpb248L2E+LiBUaGVyZSBhcmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSB1cGRhdGUgc2l0ZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSB0aGUgbW9zdCBzdGFibGUgdmVyc2lvbiBvZiB0aGUgdG9vbHNldCBvciB0aGUgImxhdGVzdCBhbmQgZ3JlYXRlc3QiLiBUaGUgdXBkYXRlIHNpdGVzIGFyZSBsaXN0ZWQgYmVsb3cuCisJCQkJCQk8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD4oT3B0aW9uYWwpIElmIHlvdSBpbnN0YWxsIGFuZCBBTVAgZXh0ZW5zaW9ucywgYWRkIFVwZGF0ZSBTaXRlcyBmb3IgdGhlbSAtLSB0aGV5J3JlIGFsc28gbGlzdGVkIGJlbG93LjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlNlbGVjdCB0aGUgZmVhdHVyZXMgdGhhdCB5b3Ugd2FudCB0byBpbnN0YWxsLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNsaWNrIHRoZSAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5OZXh0PC9zdHJvbmc+PC9zcGFuPiBidXR0b24sIHJldmlldyB0aGUgbGljZW5zZXMsIGFuZCB0aGVuIGNsaWNrIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkZpbmlzaDwvc3Ryb25nPjwvc3Bhbj4uCisJCQkJCQk8L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPHA+QWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0gdXBkYXRlIHNpdGVzOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+TWlsZXN0b25lcyZuYnNwOyhyZWNvbW1lbmRlZCk6Jm5ic3A7aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL21pbGVzdG9uZXM8YnI+CitJbnRlcmltJm5ic3A7KG5ld2VyKTombmJzcDtodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvaW50ZXJpbTxicj4KK05pZ2h0bHkmbmJzcDsoYmxlZWRpbmcmbmJzcDtlZGdlKTombmJzcDtodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvbmlnaHRseTxicj4KKworPC9wPgorPC9kaXY+Cis8cD5VcGRhdGUgc2l0ZXMgZm9yIEFNUCBFeHRlbnNpb25zPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5BR0YmbmJzcDszRCZuYnNwOyhyZWNvbW1lbmRlZCk6Jm5ic3A7aHR0cDovL2x3amdsLm9yZy91cGRhdGU8YnI+CitBTUYmbmJzcDtmb3ImbmJzcDtBc2NhcGUmbmJzcDsocmVjb21tZW5kZWQmbmJzcDtmb3ImbmJzcDtKYXZhJm5ic3A7ZGV2ZWxvcGVycyk6Jm5ic3A7aHR0cDovL2FzY2FwZS5zb3VyY2Vmb3JnZS5uZXQvZWNsaXBzZTxicj4KK0FNRiZuYnNwO2ZvciZuYnNwO1JlcGFzdCZuYnNwOyhmb3ImbmJzcDtwZW9wbGUmbmJzcDt1c2luZyZuYnNwO1JlcGFzdCk6Jm5ic3A7aHR0cDovL21pcnJvci5hbmwuZ292L3B1Yi9yZXBhc3RzaW1waG9ueS9zaXRlLnhtbCZuYnNwOyhub24mbmJzcDtQMik8YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+SW4gdGhlIGZvbGxvd2luZyBzY3JlZW5zaG90LCB3ZSd2ZSBhZGRlZCB0aGUgTFdKR0wgc2l0ZSAobm90IHNob3duKSBhcyB3ZWxsIGFzIHRoZSBBc2NhcGUgc2l0ZSAobm90IHNob3duKSwgYnV0IG5vdCB0aGUgUmVwYXN0IHNpdGUsIGFuZCB3ZSdyZSBhYm91dCB0byBpbnN0YWxsIHRoZSByZXNwZWN0aXZlIGZlYXR1cmVzLiA8L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Jlc291cmNlcy9BTVBVcGRhdGVTaXRlLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzxwPk9uY2UgeW91J3ZlIGRvbmUgdGhhdCwgc2VsZWN0IHRoZSAKKwkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+SGVscCAmZ3Q7IEhlbHAgQ29udGVudHM8L3N0cm9uZz48L3NwYW4+IG1lbnUsIGZpbmQgdGhlIEFnZW50IE1vZGVsaW5nIEd1aWRlIGFuZCBvcGVuIHRoaXMgb3ZlcnZpZXcgcGFnZSB3aXRoaW4gdGhhdCBndWlkZS4KKwkJCQk8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeHRlbnNpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRXh0ZW5zaW9ucyI+PC9hPkV4dGVuc2lvbnM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFzY2FwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFzY2FwZSI+PC9hPkFzY2FwZTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Gb3IgbGljZW5zaW5nIGFuZCBjb3B5cmlnaHQgcmVhc29ucyB3ZSBjYW4ndCBwcm92aWRlIGFsbCBvZiB0aGUgQXNjYXBlIHRvb2xzIGFuZCBtYW51YWwgb24gdGhlIEVjbGlwc2UgaG9zdGVkIEFnZW50IE1vZGVsaW5nIFByb2plY3Qgc2l0ZS4gTm9uZSBvZiB0aGVzZSB0b29scyBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBBTVAgKHRoZSBjb3JlIEFzY2FwZSBzdXBwb3J0IGlzIGFuIElQIGFwcHJvdmVkIHBhcnQgb2YgdGhlIEFNUCBkaXN0cmlidXRpb24pIGJ1dCB0aGV5J3JlIGhpZ2hseSByZWNvbW1lbmRlZC4gVGhlIEFzY2FwZSB0b29scyBpbmNsdWRlOjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BbiBleGNlbGxlbnQgTWFudWFsIGNvdmVyaW5nIHByb2dyYW1taW5nIEphdmEgbW9kZWxzIGluIEFzY2FwZSBhbmQgRXNjYXBlLiAoVGhlIEFQSSBpcyB0aGUgc2FtZS4pPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+U3VwcG9ydCBmb3IgY3JlYXRpbmcgQXNjYXBlIEphdmEgcHJvamVjdHMgYW5kIGV4ZWN1dGluZyB0aGUgU3dpbmctYmFzZWQgSmF2YSBBcHBsaWNhdGlvbnMuIFN3aW5nIGRlcGxveWVkIEFzY2FwZSBKYXZhIEFwcGxpY2F0aW9ucyBjYW4gYmUgYXMgc21hbGwgYXMgMTBNQiBhbmQgY2FuIGJlIGRlcGxveWVkIHRvIHRoZSB3ZWIuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+RWNsaXBzZSBiYXNlZCBJREUgc3VwcG9ydCBmb3IgcGxhaW4gSmF2YSBBc2NhcGUgcHJvamVjdHMuPC9wPgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzxwPlRoZSBBc2NhcGUgdXBkYXRlIHNpdGUgaXMgYXQ6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5odHRwOi8vYXNjYXBlLnNvdXJjZWZvcmdlLm5ldC9lY2xpcHNlPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPlRvIGluc3RhbGwgQXNjYXBlLCB1c2UgdGhlIHVwZGF0ZSBtYW5hZ2VyLiBTZWxlY3QgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5IZWxwICZndDsgSW5zdGFsbCBOZXcgU29mdHdhcmUuLi4iPC9zdHJvbmc+PC9zcGFuPiwgYWRkIHRoZSBBc2NhcGUgdXBkYXRlIHNpdGUsIHNlbGVjdCB0aGUgQXNjYXBlIGNhdGVnb3J5IGFuZCBjbGljayB0aGUgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5GaW5pc2g8L3N0cm9uZz48L3NwYW4+IGJ1dHRvbi4KKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvcmVzb3VyY2VzL0FzY2FwZVVwZGF0ZVNpdGUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlcGFzdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlcGFzdCI+PC9hPlJlcGFzdDwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgUmVwYXN0IHVwZGF0ZSBzaXRlIGlzIGF0OjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+aHR0cDovL21pcnJvci5hbmwuZ292L3B1Yi9yZXBhc3RzaW1waG9ueS9zaXRlLnhtbDxicj4KKworPC9wPgorPC9kaXY+Cis8cD5Nb3JlIGluZm9ybWF0aW9uIG9uIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHJlcGFzdCBjYW4gYmUgZm91bmQgCisJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9yZXBhc3Quc291cmNlZm9yZ2UubmV0L2RvY3MvZGV2ZWxvcG1lbnQuaHRtbCIgdGFyZ2V0PSJfbmV3Ij5oZXJlPC9hPi4gRm9sbG93IHRoZSBpbnN0cnVjaXRvbnMgZm9yICJDb25maWd1cmF0aW9uIEIiLgorCQkJCQk8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTW9kZWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJNb2RlbHMiPjwvYT5Nb2RlbHM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik9idGFpbmluZyBFeGFtcGxlIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik9idGFpbmluZ19FeGFtcGxlX01vZGVscyI+PC9hPk9idGFpbmluZyBFeGFtcGxlIE1vZGVsczwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGVyZSBpcyBhIGNoZWF0LXNoZWV0IGF2YWlsYWJsZSBmb3Igb2J0YWluaW5nIHRoZSBleGFtcGxlIG1vZGVscy4gSWYgeW91IHdvdWxkIHJhdGhlciBvYnRhaW4gdGhlbSB5b3Vyc2VsZiwgaGVyZSBpcyB0aGUgQ1ZTIGluZm9ybWF0aW9uOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJUZWFtIFByb2plY3QgU2V0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlRlYW1fUHJvamVjdF9TZXRzIj48L2E+VGVhbSBQcm9qZWN0IFNldHM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyB0ZWFtIHByb2plY3Qgc2V0cy4gU2VlIAorCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vaGVscC5lY2xpcHNlLm9yZy9nYWxpbGVvL3RvcGljL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL3Rhc2tzLWN2cy1wcm9qZWN0LXNldC5odG0iIHRhcmdldD0iX25ldyI+dGhpcyBkb2N1bWVudDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgcHJvamVjdCBzZXRzLgorCQkJCQk8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmh0dHA6Ly9lY2xpcHNlLm9yZy9hbXAvcHJvamVjdC1zZXRzL2FzY2FwZS5wc2Y8YnI+CitodHRwOi8vZWNsaXBzZS5vcmcvYW1wL3Byb2plY3Qtc2V0cy9lc2NhcGVBTUZFeGFtcGxlcy5wc2Y8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRnJvbSBWZXJzaW9uIENvbnRyb2wgU3lzdGVtcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZyb21fVmVyc2lvbl9Db250cm9sX1N5c3RlbXMiPjwvYT5Gcm9tIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkltcG9ydCB0aGUgQ1ZTIHByb2plY3RzIGZyb20gdGhlIEFNUCBwcm9qZWN0IHJlcG9zaXRvcnkuIEZvciBoZWxwLCBzZWUgCisJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9oZWxwLmVjbGlwc2Uub3JnL2hlbHAzMi9pbmRleC5qc3A/dG9waWM9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtNDBhLmh0bSIgdGFyZ2V0PSJfbmV3Ij50aGlzIHBhZ2U8L2E+LiBIZXJlIGFyZSB0aGUgZGV0YWlscyBmb3IgQ1ZTIEFjY2VzczoKKwkJCQkJPC9wPgorPHA+Q1ZTIFJlcG9zaXRvcnk6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5Db25uZWN0aW9uJm5ic3A7dHlwZToJcHNlcnZlcjxicj4KK1VzZXI6CWFub255bW91czxicj4KK1Bhc3N3b3JkOglbbm9uZV08YnI+CitIb3N0OglkZXYuZWNsaXBzZS5vcmc8YnI+CitQYXRoOgkvY3Zzcm9vdC9tb2RlbGluZzxicj4KK01vZHVsZToJL29yZy5lY2xpcHNlLmFtcDxicj4KKworPC9wPgorPC9kaXY+Cis8cD5BTUYgRXNjYXBlIE1vZGVsczo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPm9yZy5lY2xpcHNlLmFtcC9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlJm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPkFNRiBBc2NhcGUgYW5kIFJlcGFzdCBNb2RlbHM6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5vcmcuZWNsaXBzZS5hbXAvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmFzY2FwZSZuYnNwOzxicj4KK29yZy5lY2xpcHNlLmFtcC9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMucmVwYXN0Jm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPlRoZSBBc2NhcGUgZXhhbXBsZSBwcm9qZWN0cyBhcmUgYXZhaWxhYmxlIGF0IHRoZSBTb3VyY2Vmb3JnZSBTVk4gc2VydmVyLiBZb3UgY2FuIGdldCB0aGVtIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zLiBTZWUgdGhlIAorCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSIvd2lraS9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N1YnZlcnNpdmUvZG9jdW1lbnRhdGlvbi90ZWFtU3VwcG9ydC9maW5kX2NoZWNrX3dpei5waHBfU3VidmVyc2l2ZV9Vc2VyX0d1aWRlIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3VidmVyc2l2ZS9kb2N1bWVudGF0aW9uL3RlYW1TdXBwb3J0L2ZpbmRfY2hlY2tfd2l6LnBocCBTdWJ2ZXJzaXZlIFVzZXIgR3VpZGU8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIFNWTi4gKFlvdSdsbCBuZWVkIHRvIGluc3RhbGwgU3VidmVyc2lvbiBpZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LikKKwkJCQkJPC9wPgorPHA+RXNjYXBlIEphdmEgTW9kZWxzOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+aHR0cHM6Ly9hc2NhcGUuc3ZuLnNvdXJjZWZvcmdlLm5ldC9zdm5yb290L2FzY2FwZS9vcmcuYXNjYXBlLm1vZGVscy5icm9vazxicj4KK2h0dHBzOi8vYXNjYXBlLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9hc2NhcGUvb3JnLmFzY2FwZS5tb2RlbHMuZXhhbXBsZXM8YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+QXNjYXBlIChTd2luZy1iYXNlZCkgSmF2YSBNb2RlbHM6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5odHRwczovL2FzY2FwZS5zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3QvYXNjYXBlL29yZy5hc2NhcGUuZXNjYXBlLm1vZGVscy5leGFtcGxlczxicj4KK2h0dHBzOi8vYXNjYXBlLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9hc2NhcGUvb3JnLmFzY2FwZS5lc2NhcGUubW9kZWxzLmJyb29rPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj4KKzxocj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPkNoYXB0ZXImbmJzcDs1LiZuYnNwO1Byb2dyYW1lciBHdWlkZSZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7Ny4mbmJzcDtOZXcgYW5kIE5vdGV3b3J0aHk8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL0ludHJvZHVjdGlvbi5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvSW50cm9kdWN0aW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjYjYxMAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL0ludHJvZHVjdGlvbi5odG1sCkBAIC0wLDAgKzEsMzgxIEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzEuJm5ic3A7SW50cm9kdWN0aW9uPC90aXRsZT4KKzxsaW5rIGhyZWY9ImJvb2suY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc2LjAiIG5hbWU9ImdlbmVyYXRvciI+Cis8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7Mi4mbmJzcDtNb2RlbGVyIEd1aWRlIj4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5DaGFwdGVyJm5ic3A7MS4mbmJzcDtJbnRyb2R1Y3Rpb248L3RoPgorPC90cj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJpbmRleC5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRoIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI2MCUiPiZuYnNwOzwvdGg+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjIwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzEuJm5ic3A7SW50cm9kdWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW50cm9kdWN0aW9uIj48L2E+Q2hhcHRlciZuYnNwOzEuJm5ic3A7SW50cm9kdWN0aW9uPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InRvYyI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjUXVpY2tfU3RhcnQiPlF1aWNrIFN0YXJ0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjSW5zdGFsbCI+SW5zdGFsbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI1dlbGNvbWUuMjEiPldlbGNvbWUhPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjQ2hlYXQuMjEiPkNoZWF0ITwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0ZvbGxvd190aGVfVHV0b3JpYWwiPkZvbGxvdyB0aGUgVHV0b3JpYWw8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNGb2xsb3dfeW91cl9JbnRlcmVzdCI+Rm9sbG93IHlvdXIgSW50ZXJlc3Q8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNBQk1fUmVzZWFyY2hlcnMiPkFCTSBSZXNlYXJjaGVyczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0FCTV9Nb2RlbGVycyI+QUJNIE1vZGVsZXJzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjQUJNX0phdmFfRGV2ZWxvcGVycyI+QUJNIEphdmEgRGV2ZWxvcGVyczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0VjbGlwc2VfUGx1Z2luX0RldmVsb3BlcnMiPkVjbGlwc2UgUGx1Z2luIERldmVsb3BlcnM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjQWdlbnQtQmFzZWRfTW9kZWxpbmciPkFnZW50LUJhc2VkIE1vZGVsaW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjT3RoZXJfRG9tYWlucyI+T3RoZXIgRG9tYWluczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI1RoZV9BZ2VudF9Nb2RlbGluZ19QbGF0Zm9ybV8uMjhBTVAuMjkiPlRoZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSAoQU1QKTwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0FnZW50X01vZGVsaW5nX0ZyYW1ld29ya18uMjhBTUYuMjkiPkFnZW50IE1vZGVsaW5nIEZyYW1ld29yayAoQU1GKTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0FnZW50X0V4ZWN1dGlvbl9GcmFtZXdvcmtfLjI4QVhGLjI5Ij5BZ2VudCBFeGVjdXRpb24gRnJhbWV3b3JrIChBWEYpPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjQWdlbnRfR3JhcGhpY3NfRnJhbWV3b3JrXy4yOEFHRi4yOSI+QWdlbnQgR3JhcGhpY3MgRnJhbWV3b3JrIChBR0YpPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjRXNjYXBlIj5Fc2NhcGU8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0NyZWRpdHMiPkNyZWRpdHM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2Rpdj4KKzxwPkluIHRoaXMgbWFudWFsIHdlIHByb3ZpZGUgYW4gaW4tZGVwdGggdW5kZXJzdGFuZGluZyBvZiB3aGF0IGdvZXMgaW50byBhbiBBZ2VudCBNb2RlbCwgaG93IHlvdSBjYW4gdXNlIHRoZSBBZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgYW5kIHJlbGF0ZWQgdG9vbHMgdG8gZGVzaWduIG9uZSBhbmQgcHJlc2VudCB0dXRvcmlhbHMgdG8gZ2V0IHlvdSBzdGFydGVkLiBCdXQgYmVmb3JlIGdvaW5nIGludG8gZGV0YWlscywgbGV0J3MgdGFrZSBhIHF1aWNrIG92ZXJ2aWV3IGF0IHdoYXQgYWdlbnQtYmFzZWQgbW9kZWxpbmcgaXMgaXMgYW5kIGhvdyB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGNhbiBoZWxwIHlvdSB0byBkZXZlbG9wIG1vZGVscyBmb3IgQUJNIG9yIG90aGVyIHByb2JsZW0gZG9tYWlucy48L3A+Cis8cD5XZSBob3BlIHlvdSBlbmpveSB1c2luZyB0aGUgdG9vbCwgYW5kIHdlIGxvb2sgZm9yd2FyZCB0byB5b3VyIGNvbW1lbnRzIGFuZCBmZWVkYmFjayBhbmQgbW9zdCBvZiBhbGwgcGFydGljaXBhdGlvbiE8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUXVpY2sgU3RhcnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IlF1aWNrX1N0YXJ0Ij48L2E+UXVpY2sgU3RhcnQ8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91J3JlIHRoZSBraW5kIG9mIHBlcnNvbiB3aG8gbGlrZXMgdG8ganVtcCByaWdodCBpbiwgaGVyZSBhcmUgdGhlIGJhc2ljcy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5zdGFsbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ikluc3RhbGwiPjwvYT5JbnN0YWxsPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPklmIHlvdSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNvbXBsZXRlIEFnZW50IE1vZGVsaW5nIElERSwgc3VjaCBhcyBvbmUgb2ZmZXJlZCBieSB0aGUgcHJvamVjdCBjb250cmlidXRvcnMsIG9yIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIEFNUCBmcm9tIHRoZSBFY2xpcHNlIHVwZGF0ZSBzaXRlcywgeW91IGNhbiBvYnZpb3VzbHkgaWdub3JlIHRoaXMgc3RlcC4gT3RoZXJ3aXNlLCByZWZlciB0byB0aGUgSW5zdGFsbGF0aW9uIEd1aWRlIGF0IHRoZSBlbmQgb2YgdGhpcyBtYW51YWwuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iV2VsY29tZSEiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJXZWxjb21lLjIxIj48L2E+V2VsY29tZSE8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+V2hlbiB5b3UgZmlyc3Qgb3BlbiB0aGUgSURFIChvciB5b3UgZmlyc3QgaW5zdGFsbCB0aGUgdG9vbHMgZm9ybSBhbiB1cGRhdGUgc2l0ZSksIHlvdSB3aWxsIHNlZSBhIHdlbGNvbWUgc2NyZWVuLiBJZiB0aGUgc2NyZWVuIGlzbid0IHNob3dpbmcsIHNlbGVjdCB0aGUgCisJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkhlbHAgJmd0OyBXZWxjb21lPC9zdHJvbmc+PC9zcGFuPiBtZW51LiBDbGljayBvbiB0aGUgIk92ZXJ2aWV3IiwgIlNhbXBsZXMiIG9yICJUdXRvcmlhbHMiIGJ1dHRvbnMgdG8gYmVnaW4geW91ciBleHBsb3JhdGlvbi4KKwkJCQk8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDaGVhdCEiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDaGVhdC4yMSI+PC9hPkNoZWF0ITwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgQWdlbnQgTW9kZWxpbmcgdG9vbHMgY29tZSB3aXRoIGEgbnVtYmVyIG9mICJDaGVhdCBTaGVldHMiIHRvIGhlbHAgZ2V0IHlvdSBzdGFydGVkLiBZb3UgY2FuIGFjY2VzcyB0aGVtIGJ5IHNlbGVjdGluZyAKKwkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+SGVscCAmZ3Q7IENoZWF0IFNoZWV0cy4uLjwvc3Ryb25nPjwvc3Bhbj4uIFRoZW4gdW5kZXIgdGhlICJBZ2VudCBNb2RlbGluZyIgY2F0ZWdvcnksIHNlbGVjdCBhIGNoZWF0IHNoZWV0LCBzdWNoIGFzICJMb2FkIFNhbXBsZSBQcm9qZWN0cyIuCisJCQkJPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRm9sbG93IHRoZSBUdXRvcmlhbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZvbGxvd190aGVfVHV0b3JpYWwiPjwvYT5Gb2xsb3cgdGhlIFR1dG9yaWFsPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSB0b29scyBhbHNvIGNvbWUgd2l0aCBleHRlbnNpdmUgdHV0b3JpYWxzLiBTZWUgdGhlICJUdXRvcmlhbHMiIHNlY3Rpb24gZm9yIG1vcmUgaGVscCBvbiB0aGF0LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZvbGxvdyB5b3VyIEludGVyZXN0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRm9sbG93X3lvdXJfSW50ZXJlc3QiPjwvYT5Gb2xsb3cgeW91ciBJbnRlcmVzdDwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BTVAgaGFzIG1hbnkgcG90ZW50aWFsIGZhY2V0cyBhbmQgdXNlIGNhc2VzLiBDaGVjayBvdXQgdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBvZiB0aGUgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Li48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQUJNIFJlc2VhcmNoZXJzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQUJNX1Jlc2VhcmNoZXJzIj48L2E+QUJNIFJlc2VhcmNoZXJzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlJ1biBhbiBleGFtcGxlIG1vZGVsIHVzaW5nIHRoZSAiUnVuIGFuIEV4YW1wbGUgTW9kZWwiIGNoZWF0IHNoZWV0LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFCTSBNb2RlbGVycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFCTV9Nb2RlbGVycyI+PC9hPkFCTSBNb2RlbGVyczwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5DcmVhdGUgQWdlbnQtQmFzZWQgbW9kZWxzIHVzaW5nIHNpbXBsZSB2aXN1YWwgdG9vbHMgYW5kIGRlcGxveSB0aGVtIHRvIGEgbnVtYmVyIG9mIHBvcHVsYXIgQUJNIHBsYXRmb3JtcywgaW5jbHVkaW5nIEVzY2FwZS4gRm9sbG93IHRoZSB0dXRvcmlhbCBzZWN0aW9uIG9mIHRoZSBNb2RlbGVyJ3MgZ3VpZGUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQUJNIEphdmEgRGV2ZWxvcGVycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFCTV9KYXZhX0RldmVsb3BlcnMiPjwvYT5BQk0gSmF2YSBEZXZlbG9wZXJzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPldyaXRlICJQbGFpbiBPbGQgSmF2YSIgbW9kZWxzIHdpdGhpbiBhIGZ1bGwtZmVhdHVyZWQgYWdlbnQtYmFzZWQgbW9kZWxpbmcgZnJhbWV3b3JrLiBSZWFkIFByb2dyYW1tZXJzIEd1aWRlIGFuZCB0aGVuIHRyeSB0aGUgIkNyZWF0ZSBhbiBFc2NhcGUgSmF2YSBNb2RlbCIgY2hlYXQgc2hlZXQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRWNsaXBzZSBQbHVnaW4gRGV2ZWxvcGVycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkVjbGlwc2VfUGx1Z2luX0RldmVsb3BlcnMiPjwvYT5FY2xpcHNlIFBsdWdpbiBEZXZlbG9wZXJzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFYRiBhbmQgQUdGIHByb3ZpZGUgYSBudW1iZXIgb2YgZmVhdHVyZXMgYmFzZWQgYXJvdW5kIEVjbGlwc2UgdGVjaG5vbG9naWVzIHN1Y2ggYXMgR0VGLCBHRUYzRCwgQklSVCBDaGFydHMgYW5kIFplc3QuIEZvciBleGFtcGxlLCBBR0Ygc3VwcG9ydHMgZHluYW1pYyB2aXN1YWxpemF0aW9uIG9mIG9iamVjdHMgaW4gc3BhY2UsIGFuZCBBWEYgc3VwcG9ydHMgbWFuYWdlZCBVSSBhbmQgaGVhZGxlc3MgZXhlY3V0aW9uIGZvciBtb2RlbHMgb2YgYW55IGtpbmQuIFRoZXJlIGlzbid0IGN1cnJlbnRseSBhbnkgZ2VuZXJhbCBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBmZWF0dXJlcywgYnV0IHdlIGVuY291cmFnZSB5b3UgdG8gbG9vayBhdCB0aGUgQVBJcyBhbmQgYXQgRXNjYXBlJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlbS4gVGhleSdyZSBzdHJhaWdodGZvcndhcmQgYW5kIGNhbiBiZSB1c2VmdWwgZm9yIGEgdmFyaWV0eSBvZiBnZW5lcmFsIHNjaWVuY2UgcGxhdGZvcm0gbmVlZHMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50LUJhc2VkIE1vZGVsaW5nIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJBZ2VudC1CYXNlZF9Nb2RlbGluZyI+PC9hPkFnZW50LUJhc2VkIE1vZGVsaW5nPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSB0b29scyBpcyAiQWdlbnQtQmFzZWQgTW9kZWxpbmciIChBQk0pLiBBQk0gaXMgYW4gaW5ub3ZhdGl2ZSB0ZWNobmlxdWUgdXNlZCB0byBleHBsb3JlIGNvbXBsZXggcGhlbm9tZW5vbiBpbiBtYW55IGRvbWFpbnMsIGluY2x1ZGluZyBlY29ub21pY3MsIHNvY2lhbCBzY2llbmNlcywgYmlvbWVkaWNpbmUsIGVjb2xvZ3kgYW5kIGJ1c2luZXNzIG9wZXJhdGlvbnMuIEFCTXMgc2hhcmUgY2hhcmFjdGVyaXN0aWNzIHdpdGggb2JqZWN0IG1vZGVscywgYnV0IGFyZTo8L3A+Cis8ZGl2IGNsYXNzPSJ2YXJpYWJsZWxpc3QiPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InRlcm0iPlNwYXRpYWw8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+TW9kZWxzIGhhdmUgZXhwbGljaXQgZW52aXJvbm1lbnQocykgaW4gd2hpY2ggYWdlbnRzIGludGVyYWN0LiAoQW4gZW52aXJvbm1lbnQgbmVlZCBub3QgYmUgYSBwaHlzaWNhbCBsYW5kc2NhcGU7IG90aGVyIGV4YW1wbGVzIG9mIHNwYXRpYWwgcmVsYXRpb25zaGlwcyBpbmNsdWRlIHNvY2lhbCBuZXR3b3JrcyBvciBwb3NpdGlvbnMgd2l0aGluIGEgbG9naWMgc3lzdGVtLik8L3A+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InRlcm0iPlRlbXBvcmFsPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPk1vZGVscyBjaGFuZ2Ugb3ZlciBkaXNjcmV0ZSB1bml0cyBvZiB0aW1lLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+QXV0b25vbW91czwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5BZ2VudCBiZWhhdmlvcnMgYXJlIGFjdGl2YXRlZCBpbmRlcGVuZGVudGx5IGZyb20gb3RoZXIgb2JqZWN0IHJlcXVlc3RzLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+SGV0ZXJvZ2VuZW91czwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5BZ2VudHMgbWF5IHNoYXJlIGJlaGF2aW9yIGRlZmluaXRpb25zIGJ1dCBoYXZlIGFwcGFyZW50IGFuZCBkaXN0aW5jdCBzdGF0ZXMgYW5kIGJlaGF2aW9ycy48L3A+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InRlcm0iPkNvbGxlY3RpdmU8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+TW9kZWxzIGNvbnRhaW4gbGFyZ2UgY29tbXVuaXRpZXMgb2YgYWdlbnRzIHdoaWNoIGV4aGliaXQgY29sbGFib3JhdGl2ZSBhbmQgY29tcGV0aXRpdmUgYmVoYXZpb3JzLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+RW1lcmdlbnQ8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+QWdlbnRzIGhhdmUgY29sbGVjdGl2ZSBtYWNyby1iZWhhdmlvcnMgdGhhdCBhcmUgbm9uLW9idmlvdXMgZnJvbSBhZ2VudCBtaWNyby1zcGVjaWZpY2F0aW9ucy48L3A+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPHA+RXhpc3Rpbmcgc2NpZW50aWZpYyBtb2RlbHMgYXJlIHZlcnkgZ29vZCBhdCByZXByZXNlbnRpbmcgcmVsYXRpdmVseSBzaW1wbGUgc3lzdGVtcywgYnV0IGdlbmVyYWxseSBzcGVha2luZyBhcmVuJ3QgdmVyeSBnb29kIGF0IHJlcHJlc2VudGluZyBjb21wbGV4IHN5c3RlbXMuIFRoZSB3b3JsZCBpcyBmdWxsIG9mIGNvbXBsZXggc3lzdGVtcywgYW5kIG91ciBtaXN1bmRlcnN0YW5kaW5nIG9mIHRoZXNlIHN5c3RlbXMgaGFzIHByZXZlbnRlZCB1cyBmcm9tIGFkZHJlc3NpbmcgbWFueSBvZiB0aGUga2V5IGNoYWxsZW5nZXMgZmFjaW5nIHRoZSB3b3JsZCwgaW5jbHVkaW5nIHRoZSBnbG9iYWwgZmluYW5jaWFsIGNyaXNpcyBhbmQgY2xpbWF0ZSBjaGFuZ2UgLS0gaW4gZmFjdCBvbmNlIGNvdWxkIGFyZ3VlIHRoYXQgb3VyIG1pc3VuZGVyc3RhbmRpbmcgb2YgdGhlc2Ugc3lzdGVtcyBoYXMgc3Ryb25nbHkgY29udHJpYnV0ZWQgdG8gdGhlc2UgY3Jpc2VzLjwvcD4KKzxwPkFnZW50LUJhc2VkIE1vZGVscyAoQUJNcykgc2VlayB0byByZXByZXNlbnQgaW1wb3J0YW50IHJlYWwtd29ybGQgZHluYW1pY3MgYnkgZGVzaWduaW5nIGNvbW11bml0aWVzIG9mIHNvZnR3YXJlIGFnZW50cyB0aGF0IG1pbWljIHJlYWwgZW50aXRpZXMuIFJhdGhlciB0aGFuIG1ha2Ugc2ltcGxpZnlpbmcgYXNzdW1wdGlvbnMgYWJvdXQgc3VjaCBzeXN0ZW1zIGFuZCB0aGVuIHJlcHJlc2VudGluZyB0aGVtIGluIGVxdWF0aW9uIGZvcm0gb3IgYXMgb2ZmIHRoZSBzaGVsZiBhbGdvcml0aG1pYyBjb25zdHJ1Y3RzLCB0aGUgQUJNIHJlc2VhcmNoZXIgYWltcyB0byBpZGVudGlmeSBrZXkgYWdlbnQgc3RhdGUsIGludGVyYWN0aW9uIHNwYWNlcywgYW5kIGJlaGF2aW9ycy4gQWdlbnRzIGFyZSB0aGVuICJsZXQgbG9vc2UiIG9uIG91ciBjb21wdXRlcnMgYW5kIHdlIGV4cGxvcmUgd2hhdCBoYXBwZW5zIG5leHQuIFRoZSBjb21wdXRhdGlvbmFsIGhvcnNlcG93ZXIgZXhpc3RzIHRvZGF5IHRvIHNpbXVsYXRlIGxhcmdlIG51bWJlcnMgKGUuZy4gJmd0OyZndDsxMCkgb2YgaW50ZXJhY3RpbmcsIGFkYXB0aXZlIGFuZCBhdXRvbm9tb3VzIGFnZW50cyBidXQgb2Z0ZW4gZGVza3RvcCBjb21wdXRlcnMgYXJlIGFsbCB3ZSBuZWVkIHRvIGV4cGxvcmUgc2lnbmlmaWNhbnQgZG9tYWlucy4gQUJNcyBoYXZlIGJlZW4gZGVzaWduZWQgdG8gcmVwcmVzZW50IGFsbCBraW5kcyBvZiBpbXBvcnRhbnQgbmF0dXJhbCBzeXN0ZW1zLCBhdCBzY2FsZXMgcmVhY2hpbmcgZnJvbSBjZWxsdWxhciBtZWNoYW5pY3MgdG8gaW50ZXJuYXRpb25hbCB0cmFkZSBhbmQgYXJlIGJlaW5nIHVzZWQgdG8gc29sdmUgdHJ1bHkgaGFyZCBwcm9ibGVtcyBpbiBnb3Zlcm5tZW50LCBidXNpbmVzcywgYW5kIGFjYWRlbWlhLiBBQk1zIGFyZSBub3QgYSBzb2x1dGlvbiB0byBldmVyeSBwcm9ibGVtLCBidXQgdGhleSBjYW4gaGVscCB1cyB0byBhcHByZWNpYXRlIGFuZCBnYWluIHVuaXF1ZSBpbnNpZ2h0IGludG8gbWFueSBzeXN0ZW1zLCBhbmQgb2Z0ZW4gdGhleSBjYW4gaGVscCB1cyB0byBjb21lIHVwIHdpdGggYmV0dGVyIHByYWN0aWNhbCBkZWNpc2lvbnMgdGhhbiB3ZSBtaWdodCB1c2luZyBjbGFzc2ljIGFwcHJvYWNoZXMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iT3RoZXIgRG9tYWlucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iT3RoZXJfRG9tYWlucyI+PC9hPk90aGVyIERvbWFpbnM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TWFueSBraW5kcyBvZiBvYmplY3RzIHNoYXJlIGNoYXJhY3RlcmlzdGljcyBvZiBBQk0gYWdlbnRzIC0tIGFmdGVyIGFsbCwgc29mdHdhcmUgYWdlbnRzIGFyZSB1c2VkIGluIG1hbnkgb3RoZXIgY29udGV4dHMuIFRoZSBBZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgbWV0YS1tb2RlbGluZyBzdXBwb3J0IGlzIHBvdGVudGlhbGx5IHN1aXRhYmxlIChvciBleHRlbmRpYmxlKSBmb3IgYSBudW1iZXIgb2YgYXBwcm9hY2hlcyBvdXRzaWRlIG9mIEFCTTsgZm9yIGV4YW1wbGUgYnVzaW5lc3MgcnVsZXMsIG9iamVjdCBpbnRlcmFjdGlvbnMsIHN5c3RlbXMgZHluYW1pY3MgbW9kZWxzIGFuZCB0cmFkaXRpb25hbCBkaXNjcmV0ZSBldmVudCBtb2RlbHMuIFNpbWlsYXJseSwgQU1QIGV4ZWN1dGlvbiBhbmQgZ3JhcGhpYyBzdXBwb3J0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyBuYXR1cmFsIHN5c3RlbXMgYnV0IGNvdWxkIGFsc28gYmUgdXNlZCB0byBtYW5hZ2Ugb3RoZXIgc29mdHdhcmUgYWdlbnRzIC0tIGZvciBleGFtcGxlIGluZGVwZW5kZW50IHJlYXNvbmluZyB0YXNrcyBvciBkeW5hbWljIHZpc3VhbGl6YXRpb24gc3VwcG9ydC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJUaGUgQWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0gKEFNUCkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IlRoZV9BZ2VudF9Nb2RlbGluZ19QbGF0Zm9ybV8uMjhBTVAuMjkiPjwvYT5UaGUgQWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0gKEFNUCk8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIEVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUHJvamVjdCAoSW5jdWJhdGlvbikgb3IgIkFNUCIgcHJvdmlkZXMgdGhlIGNvcmUgc3VwcG9ydCBmb3IgYm90aCBvcGVuIHNvdXJjZSBhbmQgY29tbWVyY2lhbCBtb2RlbGluZyB0b29scy4gQU1QIGluIHR1cm4gaXMgYnVpbHQgdXBvbiBFbGlwc2UsIHRoZSBtb3N0IHBvd2VyZnVsLCB3ZWxsLXN1cHBvcnRlZCBhbmQgcG9wdWxhciBJbnRlZ3JhdGVkIERldmVsb3BtZW50IFBsYXRmb3JtIChJREUpIGF2YWlsYWJsZSBhbnl3aGVyZS48L3A+Cis8cD5BTVAgcHJvdmlkZXMgZXh0ZW5zaWJsZSBmcmFtZXdvcmtzIGFuZCBleGVtcGxhcnkgdG9vbHMgZm9yIHJlcHJlc2VudGluZywgZWRpdGluZywgZ2VuZXJhdGluZywgZXhlY3V0aW5nIGFuZCB2aXN1YWxpemluZyBBQk1zIGFuZCBhbnkgb3RoZXIgZG9tYWluIHJlcXVpcmluZyBzcGF0aWFsLCBiZWhhdmlvcmFsIGFuZCBmdW5jdGlvbmFsIGZlYXR1cmVzLiBBTVAgaGFzIHR3byBtYWluIHRoZW1lcyB0aGF0IGNvbXBsZW1lbnQgYnV0IGRvbid0IGRlcGVuZCBvbiBvbmUgYW5vdGhlciwgbW9kZWxpbmcgb2YgYWdlbnQgc3lzdGVtcyAoQU1GKSBhbmQgZXhlY3V0aW9uIGFuZCBleHBsb3JhdGlvbiBvZiB0aG9zZSBzeXN0ZW1zIChBWEYsIEFHRiBhbmQgRXNjYXBlKS48L3A+Cis8cD5UaGUgb3ZlcmFsbCBBTVAgYXJjaGl0ZWN0dXJlIGFuZCBwcm9qZWN0IGRlcGVuZGVuY2llcyBhcmUgc3VtbWFyaXplZCBpbiB0aGUgYXJjaGl0ZWN0dXJhbCBkaWFncmFtIGJlbG93OjwvcD4KKzxwPgorCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9BTVBBcmNoaXRlY3R1cmVEaWFncmFtLmpwZyI+PC9kaXY+Cis8cD4KKwkJCQorPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEZyYW1ld29yayAoQU1GKSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFnZW50X01vZGVsaW5nX0ZyYW1ld29ya18uMjhBTUYuMjkiPjwvYT5BZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgKEFNRik8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QU1GIHByb3ZpZGVzIGFuIEFCTSBtZXRhLW1vZGVsIHJlcHJlc2VudGF0aW9uLCBlZGl0b3IsIGdlbmVyYXRvciBhbmQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIFRoZSBBTUYgQWNvcmUgbWV0YS1tb2RlbCBpcyBzaW1pbGFyIHRvIEVNRiBFY29yZSBhbmQgZGVmaW5lZCBpbiBFY29yZSwgYnV0IHByb3ZpZGVzIGhpZ2gtbGV2ZWwgc3VwcG9ydCBmb3IgY29tcGxleCBhZ2VudHMuQU1GIGdlbmVyYXRlcyBjb21wbGV0ZSBleGVjdXRhYmxlIG1vZGVscyBmb3IgRXNjYXBlLCBBc2NhcGUgYW5kIFJlcGFzdCBTaW1waG9ueSwgYXMgd2VsbCBhcyBKYXZhIFNrZWxldG9ucyBhbmQgSW50ZXJmYWNlcywgSlVuaXQgdGVzdCBjYXNlcyBhbmQgZG9jdW1lbnRhdGlvbiBhbmQgaXMgZWFzaWx5IGV4dGVuc2libGUgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHRhcmdldHMuIEZvciBtb3JlIG9uIEFNRiwgc2VlIHRoZSBNb2RlbGVyIEd1aWRlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50IEV4ZWN1dGlvbiBGcmFtZXdvcmsgKEFYRikiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBZ2VudF9FeGVjdXRpb25fRnJhbWV3b3JrXy4yOEFYRi4yOSI+PC9hPkFnZW50IEV4ZWN1dGlvbiBGcmFtZXdvcmsgKEFYRik8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGV4ZWN1dGlvbiBmcmFtZXdvcmsgcHJvdmlkZXMgc2VydmljZXMgYW5kIFVJIGZvciBtb2RlbCBtYW5hZ2VtZW50LCBleGVjdXRpb24sIGFuZCB2aWV3cy4gQXJiaXRyYXJ5IHRvb2xraXRzIGNhbiBlYXNpbHkgaW50ZWdyYXRlIHdpdGggRWNsaXBzZSBhbmQgQVhGIGJ5IGltcGxlbWVudGluZyBwbHVnZ2FibGUgcHJvdmlkZXJzIGxpa2UgZW5naW5lcywgYWdlbnRzIGFuZCB2aWV3IHBhcnRzLiBBWEYgaXMgbm90IGp1c3QgZm9yIEFCTSAtLSBhbnlvbmUgd2hvIG5lZWRzIHN1cHBvcnQgZm9yIGV4ZWN1dGluZywgbWFuYWdpbmcgYW5kIHZpc3VhbGl6aW5nIGNvbGxlY3Rpb25zIG9mIG9iamVjdHMgbWF5IGZpbmQgaXQgdXNlZnVsLiBBWEYgdXNlciB0b29scyBhcmUgY292ZXJlZCBleHRlbnNpdmVseSBpbiB0aGUgVXNlciBHdWlkZSwgYW5kIHRoZSBmb3J0aGNvbWluZyBQbGF0Zm9ybSBEZXZlbG9wZXJzIEd1aWRlIHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBpbnRlZ3JhdGluZyBBWEYgaW4geW91ciBvd24gdG9vbHMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnQgR3JhcGhpY3MgRnJhbWV3b3JrIChBR0YpIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRfR3JhcGhpY3NfRnJhbWV3b3JrXy4yOEFHRi4yOSI+PC9hPkFnZW50IEdyYXBoaWNzIEZyYW1ld29yayAoQUdGKTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgZ3JhcGhpY3MgZnJhbWV3b3JrIGV4dGVuZHMgR0VGLCBHRUYzRCwgWmVzdCwgYW5kIHRoZSBCSVJUIGNoYXJ0aW5nIGVuZ2luZSB0byBzdXBwb3J0IHJlYWwtdGltZSB2aXN1YWxpemF0aW9uIG9mIGFuZCBpbnRlcmFjdGlvbiB3aXRoIGFnZW50IG1vZGVscy4gQUdGIGN1cnJlbnRseSBwcm92aWRlcyBzdXBwb3J0IGZvciAyRCwgMiAxLzIgRC4gYW5kIGdyYXBoIHN0cnVjdHVyZXMsIGFuZCB3aWxsIGJlIGV4dGVuZGVkIHRvIDMtRCwgR0lTIGFuZCBvdGhlcnMuIEFzIHdpdGggb3RoZXIgQU1QIGNvbXBvbmVudHMsIHRoZSBBR0YgZGVzaWduIGZvY3VzIGlzIHRvIHByb3ZpZGUgYW4gZXh0ZW5zaWJsZSBpbmZyYXN0cnVjdHVyZSBzbyB0aGF0IHBsYXRmb3JtIGFkb3B0ZXJzIGNhbiBlYXNpbHkgY3JlYXRlIHRoZWlyIG93biB2aWV3IGFuZCBlZGl0b3IgcGFydHMuIEFHRiB1c2VyIHRvb2xzIGFyZSBjb3ZlcmVkIGV4dGVuc2l2ZWx5IGluIHRoZSBVc2VyIEd1aWRlLCBhbmQgdGhlIGZvcnRoY29taW5nIFBsYXRmb3JtIERldmVsb3BlcnMgR3VpZGUgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGludGVncmF0aW5nIGFuZCBleHRlbmRpbmcgQUdGIGluIHlvdXIgb3duIHRvb2xzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkVzY2FwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkVzY2FwZSI+PC9hPkVzY2FwZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Fc2NhcGUgaXMgYW4gZXhlbXBsYXIgQUJNIHRvb2xzZXQuIEl0J3MgYmFzZWQgb24gQXNjYXBlLCB3aGljaCBoYXMgYmVlbiBpbiB1c2UgZm9yIG1vcmUgdGhhbiAxMCB5ZWFycy4gVGhlIGNvcmUgQVBJIGlzIHZlcnkgc3RhYmxlLCBhbmQgdGhhdCBzaG91bGQgZ2l2ZSB1c2VycyBhIHdheSB0byBleHBsb3JlIHRoZSBmZWF0dXJlcyBvZiBBTVAgd2l0aG91dCBjb25jZXJucyBhYm91dCBrZWVwaW5nIGluIHN5bmNoIHdpdGggdGhlIHJhcGlkbHkgZXZvbHZpbmcgQVhGIC9BR0YgQVBJLiBJdCBhbGxvd3MgbW9kZWxlcnMgdG8gY29kZSBpbiBKYXZhIGFuZC9vciBnZW5lcmF0ZSBtb2RlbHMgd2l0aCBBTUYgYW5kIHRoZW4gZXhlY3V0ZSB0aG9zZSBtb2RlbHMgd2l0aGluIHRoZSBzYW1lIGRldmVsb3BtZW50IGVudmlyb25tZW50LiBFc2NhcGUgaXMgdGhlIHByaW1hcnkgdGFyZ2V0IGZvciBtb3N0IG9mIHRoZSBtb2RlbHMgaW4gdGhpcyBndWlkZS4gVGhvc2UgdXNlcnMgaW50ZXJlc3RlZCBpbiB3cml0aW5nIGNvZGUgZGlyZWN0bHkgdG8gdGhlIEVzY2FwZSBBUEkgY2FuIHJlZmVyIHRvIHRoZSBQcm9ncmFtbWVyIEd1aWRlLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlZGl0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iQ3JlZGl0cyI+PC9hPkNyZWRpdHM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TWlsZXMgUGFya2VyIGlzIGEgY29uc3VsdGFudCBhbmQgc29mdHdhcmUgZGV2ZWxvcGVyIHdpdGggb3ZlciB0ZW4geWVhcnMgb2YgZXhwZXJpZW5jZSBpbiB0aGUgYWdlbnQtYmFzZWQgbW9kZWxpbmcgZmllbGQgYW5kIHR3ZW50eSB5ZWFycyBkZXZlbG9waW5nIG9iamVjdC1vcmllbnRlZCB0b29scyBhbmQgZnJhbWV3b3JrcyBhbmQgaXMgdGhlIGFyY2hpdGVjdCBhbmQgcHJvamVjdCBsZWFkIGZvciB0aGUgRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSAoSW5jdWJhdGlvbikuPC9wPgorPHA+TWV0YXNjYXBlLCBMTEMgaXMgdGhlIHByaW1hcnkgY29udHJpYnV0b3IgdG8gQU1QIGFuZCBwcm92aWRlcyBBZ2VudC1CYXNlZCBNb2RlbGluZyB0b29scywgaW5jbHVkaW5nIHNvcGhpc3RpY2F0ZWQgdG9vbHMgYmFzZWQgb24gdGhlIEFNRiBwbGF0Zm9ybSwgYW5kIGNvbXByZWhlbnNpdmUgY29uc3VsdGluZyBzZXJ2aWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gTWV0YXNjYXBlIHByb2R1Y3RzIGFuZCBzZXJ2aWNlcyB2aXNpdCAKKwkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9tZXRhc2NhcGVhYm0uY29tIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9tZXRhc2NhcGVhYm0uY29tPC9hPi4KKwkJCTwvcD4KKzxwPlRoZSBBTUYgbWV0YS1tb2RlbCBzdGFydGVkIGxpZmUgaW4gMjAwNyBhcyAKKwkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii93aWtpL2h0dHA6Ly93d3cuYWdlbnQyMDA1LmFubC5nb3YvMjAwNnByb2NwZGYvUGFya2VyX0FnZW50XzIwMDYucGRmIiB0YXJnZXQ9Il9uZXciPiJzY29yZSI8L2E+LCBhIGNvbXBvbmVudCBvZiB0aGUgUmVwYXN0IFNpbXBob255IGVudmlyb25tZW50IGFuZCB3YXMgY29udHJpYnV0ZWQgdW5kZXIgdGhlIEVQTCBieSBBcmdvbm5lIE5hdGlvbmFsIExhYnMuIEFNRiB3YXMgZnVydGhlciBkZXZlbG9wZWQgYnkgTWV0YXNjYXBlIHN0YXJ0aW5nIGluIDIwMDcgYXMgdGhlIE1ldGFBQk0gcHJvamVjdCwgYW5kIGl0IGFsb25nIHdpdGggd2hhdCBiZWNhc2UgQU1QIHdoZXJlIHdhcyBjb250cmlidXRlZCBieSBNZXRhc2NhcGUgdG8gRWNsaXBzZSBpbiAyMDA5LiBNZXRhc2NhcGUgY29udGludWVzIHRvIGJlIHRoZSBwcmltYXJ5IHNwb25zb3IgYW5kIGNvbnRyaWJ1dG9yIHRvIHRoZSBwcm9qZWN0LgorCQkJPC9wPgorPHA+VGhlIEFNUCBsb2dvIHdhcyBpbnNwaXJlZCBieSB0aGUgCisJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSIvd2lraS9odHRwOi8vc3dhcm0ub3JnX1N3YXJtX2xvZ28iIHRhcmdldD0iX25ldyI+aHR0cDovL3N3YXJtLm9yZyBTd2FybSBsb2dvPC9hPiBhbmQgaXMgdXNlZCB3aXRoIHRoZWlyIGtpbmQgcGVybWlzc2lvbi4KKwkJCTwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJuYXZmb290ZXIiPgorPGhyPgorPHRhYmxlIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIiB3aWR0aD0iMTAwJSI+Cis8dHI+Cis8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iaW5kZXguaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSI0MCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sIj5OZXh0PC9hPjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwJSI+QWdlbnQgTW9kZWxpbmcgR3VpZGUmbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7Q2hhcHRlciZuYnNwOzIuJm5ic3A7TW9kZWxlciBHdWlkZTwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvTW9kZWxlcl9HdWlkZS5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvTW9kZWxlcl9HdWlkZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGYxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9Nb2RlbGVyX0d1aWRlLmh0bWwKQEAgLTAsMCArMSw0MjM3IEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzIuJm5ic3A7TW9kZWxlciBHdWlkZTwvdGl0bGU+Cis8bGluayBocmVmPSJib29rLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cis8bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43Ni4wIiBuYW1lPSJnZW5lcmF0b3IiPgorPGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEd1aWRlIj4KKzxsaW5rIHJlbD0icHJldiIgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7MS4mbmJzcDtJbnRyb2R1Y3Rpb24iPgorPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJVc2VyX0d1aWRlLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7My4mbmJzcDtVc2VyIEd1aWRlIj4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5DaGFwdGVyJm5ic3A7Mi4mbmJzcDtNb2RlbGVyIEd1aWRlPC90aD4KKzwvdHI+Cis8dHI+Cis8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPlByZXY8L2E+Jm5ic3A7PC90ZD48dGggYWxpZ249ImNlbnRlciIgd2lkdGg9IjYwJSI+Jm5ic3A7PC90aD48dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjAlIj4mbmJzcDs8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzwvdGFibGU+Cis8aHI+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9ImNoYXB0ZXIiIHRpdGxlPSJDaGFwdGVyJm5ic3A7Mi4mbmJzcDtNb2RlbGVyIEd1aWRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTW9kZWxlcl9HdWlkZSI+PC9hPkNoYXB0ZXImbmJzcDsyLiZuYnNwO01vZGVsZXIgR3VpZGU8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0idG9jIj4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0FnZW50X01vZGVsaW5nX0ZyYW1ld29yayI+QWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjU3RydWN0dXJlIj5TdHJ1Y3R1cmU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3ZlcnZpZXdfMiI+T3ZlcnZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGV0YWlscyI+RGV0YWlsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNHZW5lcmFsIj5HZW5lcmFsPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0FnZW50cyI+QWdlbnRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0F0dHJpYnV0ZXNfMiI+QXR0cmlidXRlczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNTcGFjZXNfMiI+U3BhY2VzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjUmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGlhZ3JhbXMiPkRpYWdyYW1zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNBY3Rpb25zXzIiPkFjdGlvbnM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3ZlcnZpZXdfMyI+T3ZlcnZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjQ29uY2VwdHMiPkNvbmNlcHRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0tpbmRzX29mX0FjdGlvbnMiPktpbmRzIG9mIEFjdGlvbnM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRmxvdyI+RmxvdzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNTZWxlY3Rpb25zIj5TZWxlY3Rpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1dlYXZpbmciPldlYXZpbmc8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNEZXRhaWxzXzMiPkRldGFpbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjU2VsZWN0aW9uc18yIj5TZWxlY3Rpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1Jvb3RfQWN0aW9ucyI+Um9vdCBBY3Rpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0J1aWxkZXJzIj5CdWlsZGVyczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNDb21tYW5kcyI+Q29tbWFuZHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3RoZXIiPk90aGVyPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1F1ZXJ5X2FuZF9FdmFsdWF0aW9uX0lucHV0cyI+UXVlcnkgYW5kIEV2YWx1YXRpb24gSW5wdXRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjUmVmZXJlbmNlXzIiPlJlZmVyZW5jZTwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNEaWFncmFtc18yIj5EaWFncmFtczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0V4YW1wbGUiPkV4YW1wbGU8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNGdW5jdGlvbnMiPkZ1bmN0aW9uczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNPdmVydmlld180Ij5PdmVydmlldzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNEZXRhaWxzXzUiPkRldGFpbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjR2VuZXJhbF9GdW5jdGlvbnMiPkdlbmVyYWwgRnVuY3Rpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0xvZ2ljYWxfT3BlcmF0b3JzIj5Mb2dpY2FsIE9wZXJhdG9yczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNOdW1lcmljX09wZXJhdG9ycyI+TnVtZXJpYyBPcGVyYXRvcnM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjU3BhdGlhbCI+U3BhdGlhbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNSYW5kb20iPlJhbmRvbTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNHcmFwaGljIj5HcmFwaGljPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1RpbWUiPlRpbWU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjTWF0aCI+TWF0aDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNMaXN0Ij5MaXN0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0Rpc3RyaWJ1dGlvbiI+RGlzdHJpYnV0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRXhhbXBsZXMiPkV4YW1wbGVzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1NwYXRpYWxfMiI+U3BhdGlhbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNHcmFwaGljXzIiPkdyYXBoaWM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGlzdHJpYnV0aW9uXzIiPkRpc3RyaWJ1dGlvbjwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1JlZmVyZW5jZV8zIj5SZWZlcmVuY2U8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGlhZ3JhbXNfMyI+RGlhZ3JhbXM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iT3ZlcnZpZXciPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9Ik92ZXJ2aWV3Ij48L2E+T3ZlcnZpZXc8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SW4gdGhpcyBzZWN0aW9uIHdlIHByZXNlbnQgdGhlIGRlc2lnbiBvZiB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGFuZCBleHBsYWluIGhvdyBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbW9kZWxzIHRoYXQgYXJlIHRyYW5zcGFyZW50LCBjb21wb3NhYmxlIGFuZCBhZGFwdGFibGUuIEZ1bmRhbWVudGFsbHksIGFuIGFnZW50LWJhc2VkIG1vZGVsLCBvciAiQUJNIiwgaXMgY29tcG9zZWQgb2YgZml2ZSBwaWVjZXM6IEFnZW50cyBhbmQgQ29udGV4dCBBZ2VudHMsIEF0dHJpYnV0ZXMsIFNwYWNlcywgYW5kIEFjdGlvbnMuIFRoZSBmaXJzdCB0aHJlZSByZWZlciB0byBzdHJ1Y3R1cmFsIGNvbXBvbmVudHMsIHdoZXJlYXMgQWN0aW9ucyBkZWZpbmUgYmVoYXZpb3IuIEFnZW50IG1vZGVscyBhbHNvIGhhdmUgc3R5bGVzLCB3aGljaCBhcmUgYSBzcGVjaWFsIGtpbmQgb2YgQWN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBwb3J0cmF5IGFuIGFnZW50IGluIGEgdmlzdWFsaXphdGlvbi4gRmluYWxseSBBY3Rpb25zIG1ha2UgdXNlIG9mIEZ1bmN0aW9ucy4gV2UnbGwgZGVzY3JpYmUgb2YgdGhlc2UgY29tcG9uZW50cyBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEZyYW1ld29yayI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFnZW50X01vZGVsaW5nX0ZyYW1ld29yayI+PC9hPkFnZW50IE1vZGVsaW5nIEZyYW1ld29yazwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgRWNsaXBzZSBQbGF0Zm9ybSBwcm92aWRlcyBtYW55IHVuaXF1ZSBmZWF0dXJlcyB0aGF0IG1ha2UgaXQgaWRlYWwgZm9yIGFuIEFCTSBwbGF0Zm9ybS4gQU1GIHByb3ZpZGVzIGVhc3kgdG8gdXNlIGFuZCBwb3dlcmZ1bCB0b29scyBhbmQgdGVjaG5pcXVlcyBmb3IgZGVzaWduaW5nIEFnZW50LUJhc2VkIE1vZGVscywgaW5jbHVkaW5nIGEgY29tbW9uIHJlcHJlc2VudGF0aW9uLCBlZGl0b3JzLCBnZW5lcmF0b3JzIGFuZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC48L3A+Cis8cD5UaGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIChBTUYpIHByb3ZpZGVzIGhpZ2ggbGV2ZWwgcmVwcmVzZW50YXRpb25zIGZvciBjb21tb24gQUJNIGNvbnN0cnVjdHMsIGFuZCBpbnRyb2R1Y2VzIG5vdmVsIHdheXMgb2YgcmVwcmVzZW50aW5nIGFnZW50cyBhbmQgdGhlaXIgYmVoYXZpb3JzLiBBcyBkZXRhaWxlZCBpbiBvdGhlciBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGFuZCByZWxhdGVkIHRvb2xzIGhhdmUgYmVlbiBkZXNpZ25lZCB0byBhbGxvdyByZXNlYXJjaGVycyB0byBleHBsb3JlIGNvbXBsZXggbW9kZWxzIGluIGFuIGludHVpdGl2ZSB3YXkuIE9uZSBvZiBvdXIgbWFqb3IgZGVzaWduIGdvYWxzIGhhcyBiZWVuIHRvIGNyZWF0ZSB0b29scyB0aGF0IG5vbi1wcm9ncmFtbWVycyBjYW4gdXNlIHRvIGNyZWF0ZSBzb3BoaXN0aWNhdGVkIG1vZGVscy4gSXQgaGFzIGJlZW4gb3VyIGV4cGVyaWVuY2UgdGhhdCB1c2luZyBNb2RlbC1Ecml2ZW4gU29mdHdhcmUgRGV2ZWxvcG1lbnQgKE1EU0QpIHRlY2huaXF1ZXMgaW5jcmVhc2UgcHJvZHVjdGl2aXR5IGZvciBhbGwgZGV2ZWxvcGVycyByZWdhcmRsZXNzIG9mIHNraWxsIGxldmVsLiA8L3A+Cis8cD5UaGUgZm91bmRhdGlvbiBvZiB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGlzICJBY29yZSIuIFRoZSBjdXJyZW50IHZlcnNpb24gdXNlcyBhbiBpbnRlcmltIHZlcnNpb24gb2YgQWNvcmUgY2FsbGVkICJNZXRhQUJNIi4gV2UgcmVmZXIgdG8gdGhlIEFNRiBtb2RlbHMgYXMgIm1ldGEtbW9kZWxzIiBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgdG8gZGVmaW5lIAorCQkJCQk8c3BhbiBjbGFzcz0iaXRhbGljIj5ob3c8L3NwYW4+IEFnZW50LUJhc2VkIE1vZGVscyBhcmUgdGhlbXNlbHZlcyBtb2RlbGVkLiBGb3IgdGhvc2UgZmFtaWxpYXIgd2l0aCBFY2xpcHNlIE1vZGVsLURyaXZlbiBEZXZlbG9wbWVudCB0b29scywgQU1GIGlzIGFuYWxvZ291cyB0byBFTUYgYnV0IGlzIHRhcmdldGVkIHRvd2FyZCB0aGUgZGVzaWduIGFuZCBleGVjdXRpb24gb2YgbW9kZWxzIGNvbXBvc2VkIG9mIGFnZW50cy4gQWNvcmUgYW5kIE1ldGFBQk0gYXJlIGRlZmluZWQgaW4gRWNvcmUgYnV0IHByb3ZpZGUgYSBtb3JlIGRpcmVjdCBhbmQgaGlnaC1sZXZlbCBBQk0gcmVwcmVzZW50YXRpb24gb2YgYWdlbnRzLCBpbmNsdWRpbmcgc3BhdGlhbCwgYmVoYXZpb3JhbCBhbmQgZnVuY3Rpb25hbCBmZWF0dXJlcyBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIGNvbXBsZXRlIGV4ZWN1dGFibGUgbW9kZWxzIGZvciB0aGUgdGFyZ2V0IHBsYXRmb3Jtcy4gQU1GIGlzIGZ1bGx5IGludGVncmF0ZWQgd2l0aCB0aGUgRWNsaXBzZSBJREUgcGxhdGZvcm0sIGJ1dCBBY29yZSBtb2RlbHMgdGhlbXNlbHZlcyBuZWVkIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIGFueSBwYXJ0aWN1bGFyIHRlY2hub2xvZ3kgYmV5b25kIFhNTC9YU0QuCisJCQkJPC9wPgorPHA+TW9kZWxzIGRlc2lnbmVkIGluIEFNRiBhcmUgdHJhbnNwYXJlbnRseSBjb252ZXJ0ZWQgdG8gSmF2YSBjb2RlIGZvciBsZWFkaW5nIEFnZW50LUJhc2VkIE1vZGVsaW5nIHRvb2xzLCBzdWNoIGFzIHRoZSBFc2NhcGUgdG9vbHMgd2hpY2ggYXJlIGluY2x1ZGVkIGluIEFNUCBhbmQgYWxsb3cgZGlyZWN0IGV4ZWN1dGlvbiBvZiBtb2RlbHMgd2l0aGluIHRoZSBBTVAgZW52aXJvbm1lbnQsIGFuZCBSZXBhc3QgU2ltcGhvbnksIGFub3RoZXIgcG9wdWxhciBKYXZhIGJhc2VkIEFCTSB0b29sLiBUaGVzZSB0b29scyBjcmVhdGUgSmF2YSBjb2RlIHRoYXQgY2FuIHRoZW4gYmUgY29tcGlsZWQsIGV4ZWN1dGVkIGFuZCBldmVudCBtb2RpZmllZCBpbiB0aGVzZSBlbnZpcm9ubWVudHMganVzdCBhcyB3aXRoIGFueSBvdGhlciBKYXZhIHByb2dyYW0uIEFNRidzIGdlbmVyYXRpdmUgY2FwYWJpbGl0eSBpcyBkZXNpZ25lZCB0byBiZSBwbHVnZ2FibGUgYW5kIG1vZHVsYXIgc28gdGhhdCBvdGhlciBkZXZlbG9wZXJzIGNhbiBjcmVhdGUgQU1GIGdlbmVyYXRvcnMgZm9yIHRoZWlyIG93biB0b29scy4gSW4gZmFjdCwgdGFyZ2V0cyBjYW4gYmUgZGVzaWduZWQgdGhhdCBoYXZlIG5vIGluaGVyZW50IGRlcGVuZGVuY2llcyBvbiBFY2xpcHNlIG9yIGV2ZW4gb24gYSB0cmFkaXRpb25hbCBwbGF0Zm9ybS48L3A+Cis8cD5UaGUgQWNvcmUgLyBNZXRhQUJNIG1ldGEtbW9kZWwgaXMgbWFkZSB1cCBvZiB0aHJlZSBtYWluIHBhY2thZ2VzLiBUaGlzIGlzIGFsbCBiYXNlZCBvbiBNZXRhQUJNLCBhbmQgd2hpbGUgbmFtZXMgYW5kIGltcG9ydGFudCBkZXRhaWxzIHdpbGwgY2hhbmdlIGZvciBBY29yZSwgdGhlIGNvcmUgZGVzaWduIHNob3VsZCBiZSBxdWl0ZSBzaW1pbGFyLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3RydWN0dXJlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJTdHJ1Y3R1cmUiPjwvYT5TdHJ1Y3R1cmU8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik92ZXJ2aWV3Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iT3ZlcnZpZXdfMiI+PC9hPk92ZXJ2aWV3PC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgYW4gYWdlbnQtYmFzZWQgbW9kZWwgY2FuIGJlIHF1aXRlIHNpbXBsZS4gV2hpbGUgdGhlcmUgYXJlIG1hbnkgc3VidGxlIGNvbXBsZXhpdGllcyAgLS0gYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIG1hbnVhbCAtLSB3ZSBjYW4gY29uc3RydWN0IG1vc3QgbW9kZWxzIGZvbGxvd2luZyBzb21lIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZWxlZ2FudCBkZXNpZ24gcHJpbmNpcGxlcy4gQW5kIGluIGZhY3QsIG9uZSBvZiB0aGUgbWFpbiBnb2FscyBvZiB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGlzIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IGZyYW1ld29yayB0aGF0IGNhbiBzdXBwb3J0IHVzaW5nIHRob3NlIHByaW5jaXBsZXMgdG8gc3VwcG9ydCB0aGUgY3JlYXRpb24gb2YgbW9kZWxzIHRoYXQgY2FuIGJlIGVhc2lseSB1bmRlcnN0b29kLCBzaGFyZWQsIGFuZCB0aGF0IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSBhcyBjb21wb25lbnRzIGluIG90aGVyIG1vZGVscy48L3A+Cis8cD5Vbmxpa2UgdGhlIGFwcHJvYWNoIG9mIGEgdHJhZGl0aW9uYWwgT2JqZWN0IE9yaWVudGVkIGVudmlyb25tZW50LCB0aGUgZG9taW5hbnQgb3JnYW5pemluZyBwcmluY2lwYWwgZm9yIGFnZW50cyB3aXRoaW4gQU1GIGZvbGxvd3MgYSBjb21wb3NpdGlvbmFsIGhpZXJhcmNoaWNhbCBtb2RlbCwgbm90IGFuIGluaGVyaXRhbmNlIG1vZGVsLiAoSW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciB3aWxsIGJlIHN1cHBvcnRlZCBpbiBmb3J0aGNvbWluZyB2ZXJzaW9ucyBvZiBBY29yZSwgYnV0IGluIGEgbW9yZSBzb3BoaXN0aWNhdGVkLCBmbGV4aWJsZSBhbmQgZHluYW1pYyB3YXkgdGhhbiBpcyBzdXBwb3J0ZWQgYnkgdHJhZGl0aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMgSmF2YS4pIENvbnRleHRzIC0tIGFsc28gcmVmZXJyZWQgdG8gYXMgIlN3YXJtcyIgb3IgIlNjYXBlcyIsIGFyZSBzaW1wbHkgQWdlbnRzIHRoYXQgYXJlIGNhcGFibGUgb2YgY29udGFpbmluZyBvdGhlciBhZ2VudHMuIFdpdGggdGhpcyBiYXNpYyBjb25zdHJ1Y3QgLS0ga25vd24gYXMgYSBDb21wb3NpdGlvbiBpbiBkZXNpZ24gcGF0dGVybiBsYW5ndWFnZSAtLSBhZ2VudHMgYXJlIGFibGUgdG8gY29udGFpbiBvdGhlciBhZ2VudHMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGV0YWlscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRldGFpbHMiPjwvYT5EZXRhaWxzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHZW5lcmFsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR2VuZXJhbCI+PC9hPkdlbmVyYWw8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RXZlcnl0aGluZyByZXByZXNlbnRlZCBpbiBhbiBBY29yZSBtb2RlbCBuZWVkcyB0byBiZSByZWZlcnJlZCB0byBpbiBzb21lIHdheS4gSnVzdCBhcyBzb2Z0d2FyZSBjbGFzc2VzIGhhdmUgbmFtZXMsIEFjb3JlIHByb3ZpZGVzIGEgd2F5IHRvIGxhYmVsIGFuZCBkZXNjcmliZSBldmVyeSBlbnRpdHksIGJ1dCBpbiBhIHJpY2hlciBhbmQgbW9yZSBtYWludGFpbmFibGUgd2F5LiBBbGwgZW50aXRpZXMgaW4gQWNvcmUgLS0gaW5jbHVkaW5nIEFjdGlvbnMgYW5kIEZ1bmN0aW9ucyB3aGljaCB3ZSBkZXNjcmliZSBpbiB0aGUgbmV4dCB0d28gc2VjdGlvbnMgLS0gaGF2ZSBhIG51bWJlciBvZiBzaGFyZWQgdmFsdWVzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJOYW1lZCBFbnRpdGllcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5hbWVkX0VudGl0aWVzIj48L2E+TmFtZWQgRW50aXRpZXM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxhYmVsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTGFiZWwiPjwvYT5MYWJlbDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHJlYXNvbmFibHkgc2hvcnQsIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSBhZ2VudC4gRm9yIGV4YW1wbGUsICJUaW1iZXIgV29sZiIsICJFeGNoYW5nZSBUcmFkZXIiIG9yICJNb3ZlbWVudCBQcm9iYWJpbGl0eSIuIFRoZXNlIHNob3VsZCBiZSBkZWZpbmVkIHNvIHRoYXQgdGhleSBmaXQgaW4gd2VsbCB3aXRoIGF1dG8tZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBMYWJlbHMgbXVzdCBiZSB1bmlxdWUgdGhyb3VnaG91dCB0aGUgbW9kZWwuIChUaGlzIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzIGZvciBBY3Rpb24gbmFtZXMuKSBJZiB5b3UgdHJ5IHRvIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBuYW1lIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2UsICJDb3B5IiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG5hbWUuIDwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IklEIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSUQiPjwvYT5JRDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BbiBJRCBpcyBhbiBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBvYmplY3QgaW4gYSBzb2Z0d2FyZSBwcm9ncmFtLiBUaGlzIG1lYW5zIHRoYXQgaXQgbXVzdCBmb2xsb3cgY2VydGFpbiBydWxlcyBzdWNoIGFzIG5vLXNwYWNlcyBvciBub24gYWxwaGEtbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGUgZWRpdGluZyB0b29scyB3aWxsIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhpcyB2YWx1ZSBpcyBsZWdhbC4gTm90ZSB0aGF0IHdoZW4geW91IGVudGVyIGEgbGFiZWwsIGEgbGVnYWwgSUQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB5b3UhIFVzdWFsbHkgeW91IHdvbid0IG5lZWQgdG8gY2hhbmdlIHRoaXMsIGJ1dCB5b3UgbWlnaHQgaWYgZm9yIGV4YW1wbGUgeW91IHdhbnQgdGhlIHZhbHVlIHRvIG1hdGNoIHVwIHdpdGggc29tZSBkYXRhYmFzZSBvciBvdGhlciBleHRlcm5hbCByZXByZXNlbnRhdGlvbi4gU28gcmVhc29uYWJsZSB2YWx1ZXMgaGVyZSBtaWdodCBiZSAidGltYmVyV29sZiIgb3IgcGVyaGFwcyAiTVZNTlRfUFJCIiBpZiBzYXkgeW91J3JlIHRyeWluZyB0byBtYXRjaCB1cCB0byBzb21lIG9sZCBzdGF0aXN0aWNzIHJlY29yZHMgeW91IGhhdmUuIChOb3RlIHRoYXQgY3VycmVudGx5IElEcyBieSBkZWZhdWx0IHVzZSAiY2FtZWwgY2FzZSIsIGkuZS4gInRoaXNJc0FuRXhhbXBsZU9mQ2FtZWxDYXNlIiB0byBtYXRjaCB3aXRoIEphdmEgdmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zLCBidXQgdGhpcyBpcyBsaWtlbHkgdG8gY2hhbmdlLikgTGlrZSBsYWJlbHMsIElEcyBuZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIG1vZGVsLCBhbmQgdGhlIGVkaXRpbmcgdG9vbHMgd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgaWQgaWYgeW91IGF0dGVtcHQgdG8gZ2l2ZSB0d28gZW50aXRpZXMgdGhlIHNhbWUgaWQuPC9wPgorPHA+QW5kIG1vc3QgZW50aXRpZXMgYWxzbyBkZWZpbmU6PC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVzY3JpcHRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZXNjcmlwdGlvbiI+PC9hPkRlc2NyaXB0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgY29tcGxldGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0LiBEb24ndCBvdmVybG9vayB0aGlzIC0tIGl0IGlzIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHlvdXIgbW9kZWwuIFRoZSBkZXNjcmlwdGlvbiB3aWxsIHNob3cgdXAgaW4geW91ciBhdXRvLWdlbmVyYXRlZCBodG1sIGRvY3VtZW50YXRpb24sIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYW5kIGV2ZW4gaW4geW91ciBydW5uaW5nIG1vZGVsLiBZb3Ugc2hvdWxkIGluY2x1ZGUgZW5vdWdoIGluZm9ybWF0aW9uIHRoYXQgbW9kZWwgdXNlcnMgd2lsbCB1bmRlcnN0YW5kIHdoYXQgdGhlIGVudGl0eSBpcyBmb3IgYW5kIHdoYXQgaXQgZG9lcyB3aXRob3V0IHJlZmVycmluZyBlbHNld2hlcmUuIFRoaXMgaXMgYWxzbyB3aGVyZSBhbnkgYXR0cmlidXRpb25zIGFuZCByZWZlcmVuY2VzIHNob3VsZCBnby4gWW91IGNhbiBwdXQgaHRtbCB0YWdzIGluIGhlcmUgLS0gc3VjaCBhcyBocmVmJ3MgdG8gZXh0ZXJuYWwgcGFwZXJzLCBidXQga2VlcCB0aG9zZSB0byBhIG1pbmltdW0gYXMgdGhleSB3b24ndCBiZSByZW5kZXJlZCBhcyBodG1sIGluIGFsbCBjb250ZXh0cy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQbHVyYWwgTGFiZWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJQbHVyYWxfTGFiZWwiPjwvYT5QbHVyYWwgTGFiZWw8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHBsdXJhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnRpdHkuIFRoaXMgY2FuIGJlIGEgc3VycHJpc2luZ2x5IHVzZWZ1bCB0aGluZyB0byBoYXZlIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGFuZCBzb2Z0d2FyZSBjb2RlLCBzbyBpdCdzIHdvcnRoIG1haW50YWluaW5nLiBUaGUgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBhZGQgYW4gInMiIGF0IHRoZSBlbmQgb2YgdGhlIGxhYmVsIHlvdSd2ZSBlbnRlcmVkIGFib3ZlLCBidXQgeW91IGNoYW5nZSBpdCB0byB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZS4gRm9yIGV4YW1wbGUgIlBlcnNvbiIsIG9yICJUaW1iZXIgV29sdmVzIi48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRzIj48L2E+QWdlbnRzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaW1wbGUgQWdlbnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2ltcGxlX0FnZW50cyI+PC9hPlNpbXBsZSBBZ2VudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QW4gQWdlbnQgaXMgc2ltcGx5IGEgc29mdHdhcmUgb2JqZWN0IHRoYXQgaGFzIGF1dG9ub21vdXMgYmVoYXZpb3IgYW5kIChnZW5lcmFsbHkgc3BlYWtpbmcpIGV4aXN0cyB3aXRoaW4gc29tZSBzZXQgb2Ygc3BhY2VzLiBCeSBhdXRvbm9tb3VzLCB3ZSBtZWFuIHRoYXQgYWdlbnRzIG1ha2UgdGhlIGNob2ljZSBhYm91dCB3aGVuIGFuZCBob3cgdG8gZXhlY3V0ZSBhIGJlaGF2aW9yLCBhcyBvcHBvc2VkIHRvIGhhdmUgdGhhdCBjb250cm9sbGVkIGZyb20gImFib3ZlIiwgc28gdG8gc3BlYWsuIExpa2UgYW55IHNvZnR3YXJlIG9iamVjdHMsIGFnZW50cyBoYXZlIGF0dHJpYnV0ZXMgKGZpZWxkcykgYW5kIGFjdGlvbnMgKG1ldGhvZHMpIGFzc29jaWF0ZWQgd2l0aCB0aGVtLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBdHRyaWJ1dGVzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQXR0cmlidXRlcyI+PC9hPkF0dHJpYnV0ZXM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QXMgZGVzY3JpYmVkIGluIHRoZSBhdHRyaWJ1dGUgc2VjdGlvbnMgYWJvdmUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWN0aW9ucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFjdGlvbnMiPjwvYT5BY3Rpb25zPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkRlc2NyaWJlZCBpbiB0aGUgIkFjdGlvbnMiIHNlY3Rpb24uPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3R5bGVzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU3R5bGVzIj48L2E+U3R5bGVzPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNwZWNpYWwgYWN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBob3cgdG8gZHJhdyBhbiBhZ2VudCBncmFwaGljYWxseSBhcyBhbHNvIGRlc2NyaWJlZCBpbiB0aGUgIkFjdGlvbnMiIHNlY3Rpb24gYW5kIGRldGFpbGVkIGluIHRoZSAiRnVuY3Rpb25zIiBzZWN0aW9uLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29udGV4dCBBZ2VudHMgKENvbnRleHRzKSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbnRleHRfQWdlbnRzXy4yOENvbnRleHRzLjI5Ij48L2E+Q29udGV4dCBBZ2VudHMgKENvbnRleHRzKTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BcyBkZXRhaWxlZCBhYm92ZSwgYWdlbnRzIGFsc28gZm9ybSB0aGUgYmFzaWMgc3RydWN0dXJhbCBjb21wb25lbnQgb2YgYW4gYWdlbnQtYmFzZWQgbW9kZWwuIFRvIGdldCBhbiBpZGVhIGZvciBob3cgdGhpcyB3b3JrcywgaGF2ZSBhIGxvb2sgYXQgdGhlICJFcGlkZW1pY1JlZ2lvbmFsLm1ldGFhYm0iIG1vZGVsLiBOb3RlIHRoYXQgaW4gZnV0dXJlIHJlbGVhc2VzLCB3ZSB3aWxsIHByb2JhYmx5IHJlZmVyIHRvIENvbnRleHRzIGFzICJTY2FwZXMiLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBZ2VudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBZ2VudHNfMiI+PC9hPkFnZW50czwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYWdlbnRzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjb250ZXh0LiBGb3IgZXhhbXBsZSwgYSBjb250ZXh0IHJlcHJlc2VudGluZyBhIGNpdHkgbWlnaHQgY29udGFpbiBhbiBJbmRpdmlkdWFsIEFnZW50IGZvciBkZWZpbmluZyBhbGwgaW5kaXZpZHVhbHMgaW4gdGhlIG1vZGVsLCBhbmQgYSBWZWhpY2xlIGFnZW50IGRlZmluaW5nIGFsbCB2ZWhpY2xlcy4gTm90ZSB0aGF0IHdoZW4gd2UgcmVmZXIgdG8gYW4gYWdlbnQgaW4gdGhpcyBjb250ZXh0LCB3ZSBtZWFuIGEgZ2VuZXJhbCB0eXBlIG9yIGNsYXNzIG9mIGFnZW50LCBub3QgdGhlIGFnZW50IGl0c2VsZi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTcGFjZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTcGFjZXMiPjwvYT5TcGFjZXM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNldCBvZiBhbGwgc3BhY2VzIGNvbnRhaW5lZCBvciBzdWJzdW1lZCBieSB0aGUgYWdlbnQuIEZvciBleGFtcGxlLCBhIGNvbnRleHQgcmVwcmVzZW50aW5nIGEgY2l0eSBtaWdodCBjb250YWluIGEgZ2VvZ3JhcGhpY2FsIHNwYWNlIGFuZCBhIHRyYW5zcG9ydGF0aW9uIG5ldHdvcmsgc3BhY2UuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkF0dHJpYnV0ZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBdHRyaWJ1dGVzXzIiPjwvYT5BdHRyaWJ1dGVzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFnZW50cyBuZWVkIHNvbWUgd2F5IHRvIHJlcHJlc2VudCB0aGVpciBpbnRlcm5hbCBzdGF0ZS4gRm9yIGV4YW1wbGUsIGFuIGFnZW50IGluIGFuIGVjb25vbWljIG1vZGVsIG1pZ2h0IGhhdmUgYSB3ZWFsdGggYXR0cmlidXRlLCBhbmQgYW4gYWdlbnQgaW4gYW4gZWNvbG9neSBtb2RlbCBtaWdodCBoYXZlIGEgcXVhbnRpdHkgb2YgZm9vZCBhbmQgYSBwYXJ0aWN1bGFyIHZpc2lvbiByYW5nZS4gVGhlc2Ugc3RhdGVzIGFyZSByZXByZXNlbnRlZCBhcyBhdHRyaWJ1dGVzIGp1c3QgYXMgYWxsIHNvZnR3YXJlIG9iamVjdHMgZG8uIEluIGFuIGFnZW50IG1vZGVsLCB3ZSBrZWVwIHJpY2hlciBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBhdHRyaWJ1dGVzIGFuZCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZW0gYXQgYSBoaWdoZXIgbGV2ZWwuIEZvciBleGFtcGxlLCByYXRoZXIgdGhhbiBzcGVjaWZ5IHRoYXQgYSByZWFsIHZhbHVlIGlzIGEgImRvdWJsZSIsIGEgImZsb2F0IiBvciBhICJiaWcgbnVtYmVyIiwgd2UgcmVwcmVzZW50IHRoZW0gYXMgIlJlYWxzIiBzbyB0aGF0IHRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy4gVGhpcyBtaWdodCBhbGxvdyB1cyBmb3IgaW5zdGFuY2UgdG8gZW5zdXJlIHRoYXQgYSBtb2RlbCdzIGJlaGF2aW9yIGlzIG5vdCBkZXBlbmRlbnQgb24gYSBwYXJ0aWN1bGFyIG1hY2hpbmUgaW1wbGVtZW50YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4gQWxzbywgbm90ZSB0aGF0IGF0dHJpYnV0ZXMgb25seSByZXByZXNlbnQgc28tY2FsbGVkICJwcmltaXRpdmUiIHZhbHVlcyAtLSB0aGF0IGlzLCBhY3R1YWwgbWVhc3VyYWJsZSBmZWF0dXJlcyBvZiBhIHBhcnRpY3VsYXIgYWdlbnQgYnV0IG5vdCBhbiBhZ2VudCdzIHJlbGF0aW9uc2hpcCB0byBvdGhlciBhZ2VudHMgb3Igb2JqZWN0cy4gU2VlIHRoZSBkaXNjdXNzaW9uIGFib3V0IG5ldHdvcmtzIGZvciBtb3JlIG9uIHRoaXMga2V5IHRvcGljLjwvcD4KKzxwPkhlcmUgYXJlIHRoZSBiYXNpYyB0eXBlcyBvZiBhdHRyaWJ1dGVzIGF2YWlsYWJsZSBpbiBBY29yZSBtb2RlbHM6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkJhc2ljIEF0dHJpYnV0ZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCYXNpY19BdHRyaWJ1dGVzIj48L2E+QmFzaWMgQXR0cmlidXRlczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BdHRyaWJ1dGVzIGFyZSBzaW5nbGUgdmFsdWVzIHRoYXQgYSBnaXZlbiBhZ2VudCBjb250YWlucy4gRm9yIGV4YW1wbGUsIGFuIGFnZW50IG1pZ2h0IGhhdmUgYW4gIkFnZSIgYXR0cmlidXRlLiBJbiB0aGlzIHNlY3Rpb24gd2UgZ28gb3ZlciB0aGUgdmFsdWVzIHlvdSBjYW4gc2V0IGZvciB0aGUgYXR0cmlidXRlcy4gRm9yIHRob3NlIHdpdGggYSB0ZWNuaWNhbCBiZW50LCBub3RlIHRoYXQgd2UgYXJlIHRlY2huaWNhbGx5IGRlc2NyaWJpbmcgdGhlIG1ldGEtYXR0cmlidXRlcyBmb3IgdGhlIG1ldGEtY2xhc3MgIlNBdHRyaWJ1dGUiLiBCdXQgaXQgaXMgZmFyIHRvbyBjb25mdXNpbmcgdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZXMgb2YgYXR0cmlidXRlcyEgU28gd2UnbGwganVzdCByZWZlciB0byB0aGUgYXR0cmlidXRlcyB0aGF0IGFueSBvZiBvdXIgbW9kZWwgY29tcG9uZW50cyBhcyAidmFsdWVzIi48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVHlwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlR5cGUiPjwvYT5UeXBlPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZXNlIGNhbiBiZSBhbnlvbmUgb2YgdGhlIGZvbGxvd2luZzogPC9wPgorPGRpdiBjbGFzcz0idmFyaWFibGVsaXN0Ij4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJ0ZXJtIj4KKwkJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5Cb29sZWFuPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPkEgdmFsdWUgdGhhdCBpcyBzaW1wbHkgdHJ1ZSBvciBmYWxzZS4gTm90ZSB0aGF0IHVubGVzcyB0aGlzIHZhbHVlIHJlYWxseSBpcyBhIHNpbXBsZSBiaW5hcnkgdmFsdWUsIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RhdGUgaW5zdGVhZC4gKFNlZSBkZXRhaWxzIGJlbG93LikgRm9yIGV4YW1wbGUsIHJhdGhlciB0aGFuIHJlcHJlc2VudGluZyBnZW5kZXIgYXMgYSAnRmVtYWxlJyBib29sZWFuIHZhbHVlLCBkZWZpbmUgYSAnR2VuZGVyJyBzdGF0ZSB3aXRoIHZhbHVlcyAnTWFsZScgYW5kICJGZW1hbGUnLiBHZW5lcmF0ZWQgYXJ0aWZhY3RzIGFuZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgbXVjaCBjbGVhcmVyLCBhbmQgeW91J2xsIGJlIGFibGUgdG8gZWFzaWx5IG1vZGlmeSB0aGUgbW9kZWwgbGF0ZXIgaWYgZm9yIGV4YW1wbGUgeW91IGRpc2NvdmVyIHRoYXQgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gcG90ZW50aWFsIGdlbmRlciBjYXRlZ29yaWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdXIgbW9kZWwuPC9wPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJ0ZXJtIj4KKwkJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5JbnRlZ2VyPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPkEgZGlzY3JldGUgd2hvbGUgbnVtYmVyIHZhbHVlLCBzdWNoIGFzICIxMDAiLCAiLTEiLCAiMTAwMjk5MjAiLiBJdCdzIGdlbmVyYWxseSBhIGdvb2QgaWRlYSB0byByZXByZXNlbnQgYW55IHZhbHVlIHRoYXQgY2FuIG5ldmVyIGhhdmUgYSBkZWNpbWFsIHZhbHVlIGFzIGFuIGludGVnZXIuPC9wPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJ0ZXJtIj4KKwkJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5SZWFsPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPkEgY29udGludW91cyBudW1iZXIgdmFsdWUuIFdoaWxlIHRoZXNlIGFyZSB0eXBpY2FsbHkgcmVwcmVzZW50ZWQgaW4gc29mdHdhcmUgYXMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgdGhleSBjYW4gY29uY2VpdmFibHkgcmVwcmVzZW50IG51bWJlcnMgYXQgYW55IGFyYml0cmFyeSBwcmVjaXNpb24gYW5kIGluIGFueSBzY2hlbWUuIE5vdGUgdGhhdCB3aGlsZSB0ZWNobmljYWxseSBzcGVha2luZyB3ZSBzaG91bGQgYmUgcmVwcmVzZW50aW5nIGlycmF0aW9uYWwgbnVtYmVycywgdGhpcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgYW5kIHVzZXJzIHNob3VsZCBzaW1wbHkgdXNlIHRoZSBjbG9zZXN0IGRlY2ltYWwgYXBwcm94aW1hdGlvbi48L3A+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InRlcm0iPgorCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlN5bWJvbDwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCQkJCTwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5BIHN0cmluZyByZXByZXNlbnRpbmcgc29tZSBzdGF0ZS4gTW9yZSBwcmVjaXNlbHksIGEgY29tcHV0YXRpb25hbGx5IGFyYml0cmFyeSB2YWx1ZSB3aXRoIGNvbnRleHR1YWwgbWVhbmluZy4gVGhpcyBjb3VsZCBiZSBhbnkga2luZCBvZiBpZGVudGlmaWVyLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSBpdCB0byBzdG9yZSBzb21lIGtpbmQgb2YgaW5wdXQgY29kaW5nIGZyb20gZGF0YSB0aGF0IGlzIHRoZW4gY29udmVydGVkIGludG8gYW4gb2JqZWN0IHN0YXRlLiBPciBpdCBjb3VsZCBzaW1wbHkgYmUgYW4gYWdlbnQncyBuYW1lLiBCdXQgdGhlb3JldGljYWxseSAodGhvdWdoIHRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpIG9uZSBjb3VsZCBpbWFnaW5lIGEgc3ltYm9sIHVzaW5nIGFuIGlkaW9ncmFtLCBhbiBpY29uIG9yIGV2ZW4gYSBzb3VuZCB0aGF0IGlkZW50aWZpZXMgb3IgcmVwcmVzZW50cyB0aGUgYWdlbnQgaW4gcXVlc3Rpb24uPC9wPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzxwPihVbmRlZmluZWQgYW5kIE51bWVyaWMgdHlwZXMgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGhpbiBhIHdlbGwtZGVmaW5lZCBtb2RlbC4pPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVmYXVsdCBWYWx1ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRlZmF1bHRfVmFsdWUiPjwvYT5EZWZhdWx0IFZhbHVlPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW55IG1vZGVsIHJ1bi4gVGhlIGF0dHJpYnV0ZSBtYXkgb2YgY291cnNlIGJlIGFzc2lnbmVkIGEgZGlmZmVyZW50IHZhbHVlIGluIGFuIEluaXRpYWxpemUgcnVsZSwgYnV0IGl0cyBhIGdvb2QgaWRlYSB0byBzcGVjaWZ5IG9uZSBoZXJlLiBJdCdzIE9LIHRvIGxlYXZlIGl0IGJsYW5rLCBpbiB3aGljaCBjYXNlIGEgc2Vuc2libGUgJ2VtcHR5JyB2YWx1ZSB3aWxsIGJlIGFzc2lnbmVkLCBpLmUuIGZhbHNlIGZvciBCb29sZWFuLCAwIGZvciBJbnRlZ2VycyBhbmQgUmVhbHMsIGFuZCBhbiBlbXB0eSBzdHJpbmcgZm9yIFN5bWJvbC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHYXRoZXIgRGF0YSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdhdGhlcl9EYXRhIj48L2E+R2F0aGVyIERhdGE8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SGVyZSB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciBleGVjdXRpbmcgbW9kZWxzIHNob3VsZCBjb2xsZWN0IGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIHRoZSBkYXRhLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNlbGVjdCB0aGlzIHZhbHVlIGFzIHRydWUgZm9yIGEgJ1dlYWx0aCcgYXR0cmlidXRlLCBFc2NhcGUgd2lsbCBhdXRvbWF0aWNhbGx5IGtlZXAgdHJhY2sgb2YgbWluaW11bSwgbWF4aW11bSwgYXZlcmFnZSwgc3VtIGFuZCBvcHRpb25hbGx5IHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgdmFyaWFuY2UgYWNyb3NzIGFsbCBhZ2VudHMgZm9yIGVhY2ggbW9kZWwgZXhlY3V0aW9uIHBlcmlvZC4gQWxsIG9mIHRoZXNlIHN0YXRpc3RpY3Mgd2lsbCB0aGVuIGJlIHNlbGVjdGFibGUgd2l0aCBhIG1vdXNlIGNsaWNrIHRvIGFwcGVhciBpbiB5b3VyIG1vZGVsIGNoYXJ0cyBhdCBydW50aW1lLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkltbXV0YWJsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkltbXV0YWJsZSI+PC9hPkltbXV0YWJsZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGlzIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHlvdSBleHBlY3QgdGhlIG1vZGVsIHZhbHVlIHRvIGNoYW5nZS4gSWYgeW91IGtub3cgdGhhdCBpdCB3b24ndCBvciBzaG91bGRuJ3QsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRydWUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVyaXZlZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRlcml2ZWQiPjwvYT5EZXJpdmVkPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgZGVyaXZlZCBhdHRyaWJ1dGUgaXMgb25lIHdob3NlIHZhbHVlIGlzIGRldGVtcmluZWQgc29sZWx5IGJhc2VkIG9uIG90aGVyIGFnZW50IGF0dHJpYnV0ZXMuIEEgZGVyaXZlZCB2YWx1ZSBpcyBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgRGVyaXZlIHJvb3QgYWN0aW9uIHdoaWNoIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZWRpdG9yLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIERlcml2ZSBhY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4gQW4gYXR0cmlidXRlIGNhbm5vdCBiZSBib3RoIGRlcml2ZWQgYW5kIGltbXV0YWJsZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJVbml0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlVuaXRzIj48L2E+VW5pdHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U3BlY2lmaWVzIHdoYXQgdGhlIGF0dHJpYnV0ZSBpcyBhY3R1YWxseSBtZWFzdXJpbmcuIEZvciBleGFtcGxlLCBpZiB5b3UncmUgZGVmaW5pbmcgYW4gYXR0cmlidXRlIGZvciAiV2VhbHRoIiBpbiB0aGUgY29udGV4dCBvZiBhIG1vZGVsIG9mIHRoZSB3b3JsZCBlY29ub215LCB5b3UgbWlnaHQgc3BlY2lmeSAiVVNEIi4gSWYgeW91J3JlIGRlZmluaW5nICJBZ2UiLCB5b3UgbWlnaHQgc3BlY2lmeSAiWWVhcnMiLCBmb3IgIk1hc3MiICJLZyIuIExpa2UgZGVzY3JpcHRpb24sIHRoaXMgdmFsdWUgaXMgb2Z0ZW4gb3Zlcmxvb2tlZCwgYnV0IGNhbiBiZSBjcml0aWNhbGx5IGltcG9ydGFudCB0byBhbGxvd2luZyB5b3Vyc2VsZiBhbmQgb3RoZXJzIHRvIHVuZGVyc3RhbmQgYW5kIGNvcnJlY3RseSBjYWxpYnJhdGUgYSBtb2RlbC4gTm90ZSB0aGF0IHRoaXMgd2lsbCBhbHNvIGFsbG93IHlvdSB0byBzaW1wbGlmeSB2YXJpYWJsZSBuYW1lcyAtLSBpbnN0ZWFkIG9mIHVzaW5nICJBZ2UgaW4gWWVhcnMiLCB5b3UgY2FuIHNpbXBseSBzcGVjaWZ5ICJBZ2UiIGFuZCB0aGUgYXBwcm9wcmlhdGUgdW5pdC4gSXQgbWF5IGJlIG9idmlvdXMgdG8geW91IHRoYXQgeW91ciBtb2RlbCBpcyBjb25jZXJuZWQgd2l0aCBhZ2UgaW4geWVhcnMsIGJ1dCBhIHVzZXIgd2hvIG5lZWRzIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZ3JhbnVsYXJpdHkgd2lsbCBiZSBncmF0ZWZ1bCBmb3IgbW9yZSBjbGFyaXR5LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQXJyYXlzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQXJyYXlzIj48L2E+QXJyYXlzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFycmF5cyBhcmUgc2ltcGx5IGF0dHJpYnV0ZXMgd2l0aCB6ZXJvIG9yIG1vcmUgZW50cmllcy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHRocmVlIFJlYWwgbnVtYmVycyByZXByZXNlbnRpbmcgdGhlIFJlZCBHcmVlbiBhbmQgQmx1ZSBjb2xvciBjb21wb25lbnRzIGZvciBhbiBvYmplY3QuIE5vdGUgdGhhdCBpZiB5b3UgZmluZCB5b3Vyc2VsZiBkZWZpbmluZyB2ZXJ5IGNvbXBsZXggc2V0cyBvZiBhcnJheXMsIGl0cyBsaWtlbHkgdGhhdCB3aGF0IHlvdSByZWFsbHkgd2FudCB0byBkZWZpbmUgaXMgYSBuZXcgYWdlbnQgd2l0aCBhdHRyaWJ1dGVzIGZvciBlYWNoIGFycmF5LiBJbiBhZGRpdGlvbiB0byB3aGF0IGlzIGRlZmluZWQgYWJvdmUsIGFycmF5cyBzcGVjaWZ5OjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaXplIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2l6ZSI+PC9hPlNpemU8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIG51bWJlciBvZiB2YWx1ZXMgdGhhdCB0aGUgYXJyYXkgYXR0cmlidXRlIHdpbGwgY29udGFpbi48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlN0YXRlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlN0YXRlcyI+PC9hPlN0YXRlczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TdGF0ZXMgcmVwcmVzZW50IGFueSBhZ2VudCBxdWFsaXR5IHRoYXQgbWF5IHRha2Ugb24gb25lIG9mIGEgbnVtYmVyIG9mIHdlbGwgZGVmaW5lZCB2YWx1ZXMuIEZvciBleGFtcGxlLCBhbiAiSWNlIENyZWFtIENvbnN1bWVyIiBBZ2VudCBtaWdodCBjb250YWluIGEgc3RhdGUgb2YgIkljZSBDcmVhbSBQcmVmZXJlbmNlIiB3aXRoIG9wdGlvbnMgb2YgIkNob2NvbGF0ZSIsICJWYW5pbGxhIiBhbmQgIkdpbmdlciIuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlN0YXRlIE9wdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdGF0ZV9PcHRpb25zIj48L2E+U3RhdGUgT3B0aW9uczwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5DcmVhdGUgbmV3IG9wdGlvbnMgZm9yIHN0YXRlcyBieSBhZGRpbmcgdGhlbSB0byB0aGUgc3RhdGUgbm9kZS4gU3RhdGVzIGFyZSBzaW1wbGUgZGVzY3JpYmVkIGl0ZW1zLiBEb24ndCBmb3JnZXQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uISBTdGF0ZXMgYWxzbyBoYXZlPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVmYXVsdCBPcHRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZWZhdWx0X09wdGlvbiI+PC9hPkRlZmF1bHQgT3B0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPnVubGlrZSBmb3IgcmVndWxhciBhdHRyaWJ1dGVzLCB0aGlzIG9wdGlvbiBpcyBub3Qgb3B0aW9uYWwhIFNpbXBseSBwaWNrIGEgc3RhdGUgb3B0aW9uIHRvIGJlIGFzc2lnbmVkIHRoYXQgdGhlIGFnZW50IHdpbGwgdGFrZSBpZiBubyBvdGhlciBvcHRpb24gaGFzIGJlZW4gYXNzaWduZWQuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYWNlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNwYWNlc18yIj48L2E+U3BhY2VzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFsbCBjb250ZXh0cyBjYW4gY29udGFpbiBzcGFjZXMuIFNwYWNlcyBwcm92aWRlIGFuIGVudmlyb25tZW50IGluIHdoaWNoIGFnZW50cyBjYW4gaGF2ZSBhIHBoeXNpY2FsIG9yIG5vdGlvbmFsIGxvY2F0aW9uIGFuZCB1cG9uIHdoaWNoIHRoZXkgY2FuIGludGVyYWN0IHdpdGggb25lIGFub3RoZXIgYW5kIHRoZWlyIGVudmlyb25tZW50LiBBZ2VudHMgY2FuIGV4aXN0IGluIG1vcmUgdGhhbiBvbmUgc3BhY2UgYXQgYSB0aW1lLCBhbmQgYSBnaXZlbiBhZ2VudCBuZWVkIG5vdCBleGlzdCBpbiBldmVyeSBzcGFjZS4gKE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBSZXBhc3QgU2ltcGhvbnkgbm90aW9uIG9mIHByb2plY3Rpb25zLCB0aG91Z2ggdGhlIHR3byByZXByZXNlbnRhdGlvbmFsIGFwcHJvYWNoZXMgYXJlIGdlbmVyYWxseSBjb21wYXRpYmxlLikgQWdlbnRzIG5lZWQgbm90IHJlcHJlc2VudCBleHBsaWNpdCwgInJlYWwiIHNwYXRpYWwgc3RydWN0dXJlcyBzdWNoIGFzIGEgbGFuZHNjYXBlLCB0aG91Z2ggdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIG1vc3QgY29tbW9uIHVzZS4gVGhleSBjYW4gYWxzbyByZXByZXNlbnQgcmVsYXRpb25hbCBhbmQgc3RhdGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBiZWxpZWYgc3BhY2Ugb3IgYSBzb2NpYWwgbmV0d29yay4gVGhlcmUgYXJlIGZvdXIga2luZHMgb2Ygc3BhY2UgcmVwcmVzZW50ZWQ6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYWNlIChDb250aW51b3VzKSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNwYWNlXy4yOENvbnRpbnVvdXMuMjkiPjwvYT5TcGFjZSAoQ29udGludW91cyk8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SW4gdGhlIG1vZGVsaW5nIHRvb2xzLCB3ZSBzaW1wbHkgcmVmZXIgdG8gdGhpcyBhcyBhICJTcGFjZSIgYXMgaXQgaXMgcmVwcmVzZW50cyB0aGUgZ2VuZXJhbCBjb25jZXB0IG9mIGEgc3BhY2UuIEEgc3BhY2UgaXMgc2ltcGx5IHNvbWV0aGluZyB0aGF0IGNvbnRhaW5zIG9iamVjdHMgd2l0aCBjZXJ0YWluIGxvY2F0aW9ucyBhbmQgZXh0ZW50cyBhbmQgaGFzIGEgY2VydGFpbiBudW1iZXIgb2YgZGltZW5zaW9ucy4gVGhlIHNwYWNlIGlzIGNvbnRpbnVvdXMsIGluIHRoZSBzZW5zZSB0aGF0IG9iamVjdHMgY2FuIGJlIHBsYWNlZCBhbnl3aGVyZSB3aXRoIGFyYml0cmFyeSBwb3NpdGlvbi4gU3BhY2VzIGhvbGQgYXR0cmlidXRlcywgd2hpY2ggc2ltcGx5IGRlZmluZSB0aGVpciBkaW1lbnNpb25zLS0gc2VlIGJlbG93LjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJCb3JkZXIgUnVsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkJvcmRlcl9SdWxlIj48L2E+Qm9yZGVyIFJ1bGU8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSB2YWx1ZSByZXByZXNlbnRpbmcgd2hhdCBoYXBwZW5zIHRvIGFuIGFnZW50IHdoZW4gdGhhdCBhZ2VudCBpcyBhc2tlZCB0byBtb3ZlIGJleW9uZCBpdHMgZXh0ZW50LjwvcD4KKzxkaXYgY2xhc3M9InZhcmlhYmxlbGlzdCI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+CisJCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UGVyaW9kaWM8L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCQk8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+V2hlbiBlbmNvdW50ZXJpbmcgYW4gZWRnZSwgdGhlIGFnZW50IHdpbGwgdHJlYXQgdGhlIHNwYWNlIGFzIHdyYXBwaW5nIGFyb3VuZCB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgc3BhY2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYWdlbnQgYXQgbG9jYXRpb24gezEsMn0gKDAtYmFzZWQpIHdpdGhpbiBhIE1vb3JlIHNwYWNlIChzZWUgZ3JpZCBkaXNjdXNzaW9uIGJlbG93KSBvZiBzaXplIHsxMCwxMH0gaXMgYXNrZWQgdG8gZmluZCBzb21lIG90aGVyIGFnZW50IHdpdGhpbiBkaXN0YW5jZSAzLCB0aGUgYWdlbnQgbG9vayBpbiB0aGUgc3F1YXJlIGRlZmluZWQgYmV0d2VlbiB7OCw5fSBhbmQgezQsNX0uIEFuIGFnZW50IGFza2VkIHRvIG1vdmUgYmV5b25kIHRoZSBjb25maW5lcyBvZiB0aGUgc3BhY2Ugd2lsbCBzaW1wbHkgc3RvcCB3aGVuIGl0IHJlYWNoZXMgdGhlIGVkZ2UuIFlvdSBjYW4gaW1hZ2luZSB0aGlzIGFzIHRha2luZyBhIHBpZWNlIG9mIGdyYXBoIHBhcGVyIGFuZCBjb25uZWN0aW5nIHRoZSBvcHBvc2l0ZSBlZGdlcy4gWW91IGNhbid0IGFjdHVhbGx5IGRvIHRoYXQgd2l0aCBwYXBlciwgYnV0IGlmIHlvdSBjb3VsZCB5b3Ugd291bGQgaGF2ZSBhIHRvcm9pZGFsIChkb251dCkgc2hhcGUgaW4gdGhyZWUgZGltZW5zaW9ucyBkZWZpbmluZyB0aGUgc2hhcGUgaW4gdHdvLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+CisJCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+QVBlcmlvZGljPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPldoZW4gZW5jb3VudGVyaW5nIGFuIGVkZ2UsIHRoZSBhZ2VudCB0cmVhdHMgaXQgYXMgdGhlIGVkZ2Ugb2YgdGhlIHNwYWNlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFnZW50IGF0IGxvY2F0aW9uIHsxLDJ9IGlzIGFza2VkIHRvIGZpbmQgc29tZSBvdGhlciBhZ2VudCB3aXRoaW4gZGlzdGFuY2UgMywgdGhlIGFnZW50IGxvb2sgYmV0d2VlbiB7MCwwfSBhbmQgezQsNX0uIEFuIGFnZW50IGFza2VkIHRvIG1vdmUgYmV5b25kIHRoZSBjb25maW5lcyBvZiB0aGUgc3BhY2Ugd2lsbCBzaW1wbHkgc3RvcCB3aGVuIGl0IHJlYWNoZXMgdGhlIGVkZ2UuPC9wPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzxwPlRoZSAiU3RyaWN0IiBhbmQgIkJvdW5jeSIgdmFsdWVzIGFyZSBvYnNvbGV0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpbWVuc2lvbmFsaXR5Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGltZW5zaW9uYWxpdHkiPjwvYT5EaW1lbnNpb25hbGl0eTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhhdCB0aGUgc3BhY2UgaGFzLiBBZnRlciBzZWxlY3RpbmcgYSBkaW1lbnNpb25hbGl0eSwgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIHRvIHJlcHJlc2VudCBlYWNoIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBlbnRlciAzIGhlcmUsIHlvdSB3aWxsIGhhdmUgYW4gYXR0cmlidXRlIGZvciBYLCBZLCBhbmQgWi4gQmUgc3VyZSB0byBlbnRlciBkZWZhdWx0IHZhbHVlcyBoZXJlLCBhcyB0aGV5IHdpbGwgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3BhY2UuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHcmlkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR3JpZCI+PC9hPkdyaWQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBncmlkIGlzIHRlY2huaWNhbGx5IGEgcmVndWxhciBsYXR0aWNlIHN0cnVjdHVyZS4gQ3VycmVudGx5LCBvbmx5IHJlY3RpbGluZWFyIHN0cnVjdHVyZXMgYXJlIHN1cHBvcnRlZCwgaS5lLiBhIE9uZS1kaW1lbnNpb25hbCB2ZWN0b3IsIGEgdHdvLWRpbWVuc2lvbmFsIGdyaWQsIGEgdGhyZWUtZGltZW5zaW9uYWwgY3ViZSBhbmQgc28gb24uIChUaG91Z2ggbm9uZSBvZiB0aGUgY3VycmVudCB0YXJnZXQgcGxhdGZvcm1zIHN1cHBvcnQgbi1kIHNwYWNlcyB5ZXQuKSA8L3A+Cis8cD5MaWtlIGNvbnRpbnVvdXMgc3BhY2VzLCBhIGdyaWQgaGFzIGEgYm9yZGVyIHJ1bGUgYW5kIGRpbWVuc2lvbmFsaXR5LiBBIGdyaWQgaGFzIGEgY291cGxlIG9mIG90aGVyIGltcG9ydGFudCB2YWx1ZXM6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik11bHRpLU9jY3VwYW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTXVsdGktT2NjdXBhbnQiPjwvYT5NdWx0aS1PY2N1cGFudDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Eb2VzIHRoZSBncmlkIGFsbG93IG1vcmUgdGhhbiBvbmUgYWdlbnQgdG8gb2NjdXB5IGl0IGF0IGEgdGltZT8gVGhpcyB2YWx1ZSBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhbm90aGVyIG1lY2hhbmlzbSBpbiBmdXR1cmUgcmVsZWFzZXMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTmVpZ2hib3Job29kIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTmVpZ2hib3Job29kIj48L2E+TmVpZ2hib3Job29kPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB3aGF0IGNvbnN0aXR1dGVzIGEgcmVnaW9uIHdpdGhpbiBhIHBhcnRpY3VsYXIgZGlzdGFuY2UgZnJvbSB0aGUgYWdlbnQuIFRoZSB2YWx1ZSBmb3IgdGhpcyBpcyBvZnRlbiBjcml0aWNhbCBpbiBvYnRhaW5pbmcgcGFydGljdWxhciBiZWhhdmlvciBmcm9tIGEgbW9kZWwsIGFuZCBzaG91bGRuJ3QgYmUgb3Zlcmxvb2tlZC4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHZhbHVlczo8L3A+Cis8ZGl2IGNsYXNzPSJ2YXJpYWJsZWxpc3QiPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InRlcm0iPgorCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkV1Y2xpZGVhbjwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCQkJCTwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5UaGUgZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIGNlbGxzIGlzIHRha2VuIHRvIGJlIHRoZSAicmVhbCIgZGlzdGFuY2UuIEZvciBleGFtcGxlLCBpZiBhbiBhZ2VudCB3YXMgd2l0aGluIGEgY2hlc3MgYm9hcmQsIGFuZCB3ZSB3YW50ZWQgdG8gZmluZCBhbGwgYWdlbnRzIHdpdGhpbiBkaXN0YW5jZSB0aHJlZSBvZiBpdCwgd2UgY291bGQgZGV0ZXJtaW5lIHRoYXQgYnkgdGFraW5nIGEgc3RyaW5nIG9mIGxlbmd0aCAzLCB0YWNraW5nIGl0IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNvdXJjZSBzcXVhcmUsIGFuZCBpbmNsdWRpbmcgYWxsIGNlbGxzIHdob3NlIGNlbnRlcnMgd2UgY2FuIHJlYWNoIHdpdGggdGhlIG90aGVyIHN0cmluZyBlbmQuIE5vdGUgdGhhdCBhbHRob3VnaCBFdWNsaWRlYW4gc3BhY2UgbWF5IHNlZW0gdGhlIG1vc3QgcmVhc29uYWJsZSBuZWlnaGJvcmhvb2QgY29uZmlndXJhdGlvbiB0byBjaG9vc2UsIHRoaXMgcmVhbGx5IGlzbid0IHRoZSBjYXNlLiBFdWNsaWRlYW4gc3BhY2UgaXMgY29udGludW91cyB3aGVyZWFzIGdyaWQgc3BhY2UgaXMgZGlzY3JldGUsIGFuZCBtYXBwaW5nIHRoZSB0d28gdG8gZWFjaCBvdGhlciBjYW4gY3JlYXRlIHVuZXhwZWN0ZWQgaXNzdWVzLiBTdGlsbCwgdGhpcyBpcyBhIGdvb2QgY2hvaWNlIGZvciBtb2RlbHMgcmVwcmVzZW50aW5nIG5vdGlvbmFsIHJlYWwgc3BhY2VzLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+CisJCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+TW9vcmU8L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCQk8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+SGVyZSwgdGhlIGRpc3RhbmNlIGJldHdlZW4gYW55IHR3byBjZWxscyBpcyBkZWZpbmVkIGJ5IHRoZSBudW1iZXIgb2YgZWRnZSAKKwkJCQkJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+b3I8L3NwYW4+IGNvcm5lciBhZGphY2VudCBjZWxscyBjcm9zc2VkIHRvIGdldCBiZXR3ZWVuIHRoZW0uIFRvIGNvbnRpbnVlIHRoZSBjaGVzcyBib2FyZCBhbmFsb2d5LCB0aGlzIGlzIHRoZSBzZXQgb2YgbW92ZXMgdGhhdCBhIGtpbmcgY2FuIG1ha2UuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1hcCB3ZWxsIHRvIHJlYWwgc3BhY2UgYXQgYWxsLCBhcyBhIGNlbGwgYXQgZGlzdGFuY2UgMSBpbiBhIG1vb3JlIHNwYWNlIGlzIGF0IGRpc3RhbmNlIHNxcnQoMikgaW4gInJlYWwiIHNwYWNlLgorCQkJCQkJCQkJCTwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+CisJCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Vm9uLU5ldW1hbm48L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCQk8L3NwYW4+Cis8L2R0PgorPGRkPgorPHA+SGVyZSwgdGhlIGRpc3RhbmNlIGJldHdlZW4gYW55IHR3byBjZWxscyBpcyBkZWZpbmVkIGJ5IHRoZSBudW1iZXIgb2YgZWRnZSBhZGphY2VudCBjZWxscyBjcm9zc2VkIHRvIGdldCBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgdGhlIHNldCBvZiBtb3ZlcyB0aGF0IGEgcm9vayBtaWdodCBtYWtlIG9uIGEgY2hlc3MgYm9hcmQgLS0gaWYgYSByb29rIGNvdWxkIG9ubHkgbW92ZSBvbmUgc3F1YXJlIGF0IGEgdGltZS4gSXQgaXMgYWxzbyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIE1hbmhhdHRhbiBkaXN0YW5jZSBmb3IgdGhlIHNlbGYtZXZpZGVudCByZWFzb24uPC9wPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTmV0d29yayI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5ldHdvcmsiPjwvYT5OZXR3b3JrPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgbmV0d29yayByZXByZXNlbnRzIGEgc2V0IG9mIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhZ2VudHMsIGluIGEgZ3JhcGggc3RydWN0dXJlLiBUaGUgY29uY2VwdCBpcyBwcmV0dHkgc2ltcGxlLCBidXQgbm90ZSB0aGF0IGEgbmV0d29yayBpcyBhY3R1YWxseSBhIGNyaXRpY2FsIHBhcnQgb2YgbWFueSBBTUYgbW9kZWxzLiBUaGlzIGlzIGJlY2F1c2Ugd2UgdXNlIG5ldHdvcmtzIHRvIHJlcHJlc2VudCBhbnkga2luZCBvZiByZWZlcmVuY2VzIGJldHdlZW4gYWdlbnRzLiBZb3UgbWF5IGhhdmUgbm90aWNlZCBpbiB0aGUgZGlzY3Vzc2lvbiBhYm91dCBhdHRyaWJ1dGVzIHRoYXQgdGhlcmUgaXMgbm8gZ2VuZXJpYyAib2JqZWN0IiB0eXBlIGZvciBhbiBhdHRyaWJ1dGUuIEluIGZhY3QsIGF0dHJpYnV0ZXMgb25seSBjb250YWluIHByaW1pdGl2ZSB2YWx1ZXMuIFNvIHdlIHdpbGwgdXNlIG5ldHdvcmtzIHRvIGRvIHRoZSBraW5kcyBvZiB0aGluZ3MgdGhhdCB3ZSB3b3VsZCBvZnRlbiB1c2Ugb2JqZWN0IHJlZmVyZW5jZXMgZm9yIGluIGEgdHJhZGl0aW9uYWwgT2JqZWN0LU9yaWVudGVkIG1vZGVsLiBGb3IgZXhhbXBsZSwgaWYgYW4gYWdlbnQgaXMgYSBtZW1iZXIgb2YgYSBmYW1pbHksIHJhdGhlciB0aGFuIGhhdmUgdGhhdCBhZ2VudCBoYXZlIGEgbWVtYmVyIGF0dHJpYnV0ZSBvZiAiZmFtaWx5IiB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSAiRmFtaWx5IiBvYmplY3QsIHRoZSBtb2RlbGVyIHdvdWxkIGNyZWF0ZSBhICJGYW1pbHkgTWVtYmVycyIgbmV0d29yayBhbmQgY29ubmVjdCBhZ2VudCdzIHRvIHRoZWlyIGZhbWlsaWVzIGFzIGFwcHJvcHJpYXRlLiBUaGlzIGltcGxpZXMgdGhhdCBuZXR3b3JrIG1lbWJlcnMgY2FuIGNvbnRhaW4gbWVtYmVycyBvZiBtYW55IGRpZmZlcmVudCB0eXBlcy48L3A+Cis8cD5BIG5ldHdvcmsgaGFzIG9ubHkgb25lIHZhbHVlIHRvIHNwZWNpZnk6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpcmVjdGVkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlyZWN0ZWQiPjwvYT5EaXJlY3RlZDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGlzIGluZGljYXRlcyB3aGV0aGVyIGNvbm5lY3Rpb25zIGJldHdlZW4gYWdlbnRzIGFyZSBvbmUtd2F5IG9yIHR3by13YXkuIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UsIHRoZW4gaWYgYSBjb25uZWN0aW9uIGlzIG1hZGUgYmV0d2VlbiBhbiBhZ2VudCBBIGFuZCBhbiBhZ2VudCBCLCBhbmQgYWdlbnQgQiBzZWFyY2hlcyB3aXRoaW4gZGlzdGFuY2UgMSwgYWdlbnQgQiB3aWxsIGZpbmQgYWdlbnQgQS4gSWYgdGhpcyB2YWx1ZSBpcyB0cnVlLCBhZ2VudCBBIGNhbiBmaW5kIGFnZW50IEIsIGJ1dCBhZ2VudCBCIGNhbiBub3QgZmluZCBhZ2VudCBBLiAoVW5sZXNzIG9mIGNvdXJzZSBzb21lIG90aGVyIHBhdGggbGVhZHMgQiB0byBBLik8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikdlb2dyYXBoeSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ikdlb2dyYXBoeSI+PC9hPkdlb2dyYXBoeTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIGdlb2dyYXBoeSByZXByZXNlbnRzIGEgcGh5c2ljYWwgbGFuZHNjYXBlLiBIZXJlIHdlIGFzc3VtZSB0aGF0IHRoYXQgbGFuZHNjYXBlIGlzIGdvaW5nIHRvIGJlIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYW5kIHJlcHJlc2VudGF0aW9uYWwgc2NoZW1lIC0tIHR5cGljYWxseSBhIEdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBTeXN0ZW0uIFdlJ2xsIGRlc2NyaWJlIGhvdyB0byB3b3JrIHdpdGggR0lTIGluIG1vcmUgZGV0YWlsIHdoZW4gd2UgZGlzY3VzcyBidWlsZGVyIGFjdGlvbnMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlZmVyZW5jZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlZmVyZW5jZSI+PC9hPlJlZmVyZW5jZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlhZ3JhbXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaWFncmFtcyI+PC9hPkRpYWdyYW1zPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZvciByZWFkZXJzIGZhbWlsaWFyIHdpdGggVU1MIGFuZCBtZXRhLW1vZGVsaW5nLCB0aGUgZm9sbG93aW5nIGRpYWdyYW1zIGdpdmUgbW9yZSBkZXRhaWwgb24gdGhlIHN0cnVjdHVyYWwgZGVzaWduLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNZXRhLUNsYXNzZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNZXRhLUNsYXNzZXMiPjwvYT5NZXRhLUNsYXNzZXM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+T3VyIGZpcnN0IGRpYWdyYW0gZGVwaWN0cyB0aGUgY29yZSBzdHJ1Y3R1cmFsIGRlc2lnbiBvZiB0aGUgbW9kZWwuIDwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9zdHJ1Y3R1cmUvU3RydWN0dXJlQ29tcGxleERpYWdyYW0ucG5nIj48L2Rpdj4KKzxwPiAKKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5UaGVyZSZuYnNwO3NlZW1zJm5ic3A7dG8mbmJzcDtiZSZuYnNwO2EmbmJzcDtsb3QmbmJzcDtnb2luZyZuYnNwO29uJm5ic3A7aGVyZSwmbmJzcDtidXQmbmJzcDt0aGUmbmJzcDtiYXNpYyZuYnNwO2NvbXBvbmVudHMmbmJzcDthcmUmbmJzcDtwcmV0dHkmbmJzcDtzdHJhaWdodGZvcndhcmQmbmJzcDthcyZuYnNwO3dlJm5ic3A7Y2FuJm5ic3A7c2VlJm5ic3A7aW4mbmJzcDt0aGUmbmJzcDtuZXh0Jm5ic3A7ZGlhZ3JhbS48YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iS2V5IENvbGxhYm9yYXRpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iS2V5X0NvbGxhYm9yYXRpb25zIj48L2E+S2V5IENvbGxhYm9yYXRpb25zPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9zdHJ1Y3R1cmUvU3RydWN0dXJlU2ltcGxlRGlhZ3JhbS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+Q29yZSZuYnNwO2ludGVyYWN0aW9ucyZuYnNwO2FyZSZuYnNwO2luJm5ic3A7UmVkLiZuYnNwO1RoZSZuYnNwO21ldGEtbW9kZWwmbmJzcDtzdHJ1Y3R1cmUmbmJzcDtpcyZuYnNwO2Vzc2VudGlhbGx5Jm5ic3A7YSZuYnNwO0NvbXBvc2l0ZSZuYnNwO3BhdHRlcm4uJm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRldGFpbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZXRhaWxzXzIiPjwvYT5EZXRhaWxzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5FdmVyeSBtb2RlbCBoYXMgYXQgaXRzIHJvb3QgYSBDb250ZXh0IChTY2FwZSkuIENvbnRleHRzIGFyZSBBZ2VudHMgdGhhdCBhcmUgY2FwYWJsZSBvZiBjb250YWluaW5nIG90aGVyIEFnZW50cyAoaW5jbHVkaW5nIG90aGVyIGNvbnRleHRzLCBuYXR1cmFsbHkpLiA8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD4oTWV0YS1sZXZlbCkgQ29udGV4dHMgY29udGFpbiAobWV0YS1sZXZlbCkgQWdlbnRzIGF0IHRoZSBtb2RlbCAoZGVzaWduLXRpbWUpIGxldmVsLiAgQXQgcnVudGltZSwgKG1vZGVsLWxldmVsKSBDb250ZXh0IGluc3RhbmNlcyBkZWZpbmVkIGluIGEgKG1ldGEtbGV2ZWwpIFNDb250ZXh0IHdpbGwgY29udGFpbiAobW9kZWwtbGV2ZWwpIGFnZW50IGluc3RhbmNlcyBvZiB0aGUgZGVmaW5lZCAobWV0YS1sZXZlbCkgU0FnZW50LiBUaGlzIHNvdW5kcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgaXMsIHNvIGxldCdzIGxvb2sgYXQgYSBzaW1wbGUgZXhhbXBsZS4gU3VwcG9zZSB3ZSBjcmVhdGUgYSBuZXcgQ29udGV4dCwgYW5kIGdpdmUgaXQgYSBsYWJlbCBvZiAiV2lraSBFeGFtcGxlIi4gV2l0aGluIHRoYXQgQ29udGV4dCwgd2UgY3JlYXRlIGFuIEFnZW50IGFuZCBnaXZlIGl0IGEgbGFiZWwgb2YgIkluZGl2aWR1YWwiIGFuZCBhbm90aGVyIEFnZW50IHdpdGggdGhlIGxhYmVsICJCbG9jayIuIEF0IHJ1bnRpbWUgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgZXhlY3V0aW5nIHRoZSBtb2RlbCB3ZSB3aWxsIGhhdmUgb25lIFdpa2lFeGFtcGxlIG1vZGVsIGluc3RhbmNlICB3aGljaCBjb250YWlucyBhIG51bWJlciBvZiBJbmRpdmlkdWFscy48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BZ2VudHMgY29udGFpbiBBdHRyaWJ1dGVzLCBzdWNoIGFzIFZpc2lvbiBhbmQgQWdlLiBDb250ZXh0IGF0dHJpYnV0ZXMgb2Z0ZW4gcmVwcmVzZW50IGlucHV0IHBhcmFtZXRlcnMgZm9yIGNvbnRhaW5lZCBhZ2VudHMuIEZvciBleGFtcGxlLCBvdXIgV2lraSBBZ2VudCBDb250ZXh0IG1pZ2h0IGNvbnRhaW4gYW4gSW5kaXZpZHVhbCBDb3VudCBhcyB3ZWxsIGFzIGEgTWluaW11bSBBZ2UgYW5kIE1heGltdW0gQWdlLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNvbnRleHRzIGNhbiBjb250YWluIFByb2plY3Rpb25zIChTcGFjZXMpLCB3aGljaCByZXByZXNlbnQgc29tZSBraW5kIG9mIHNwYXRpYWwgb3Igc3RydWN0dXJhbCBpbnRlcmFjdGlvbiBzcGFjZSBmb3IgdGhlIGFnZW50czsgZWl0aGVyIGEgZ3JpZCwgYSBjb250aW51b3VzIChldWNsaWRlYW4pIHNwYWNlLCBvciBhIG5ldHdvcmsgKGdyYXBoKSBvciBnZW9ncmFwaGljIHNwYWNlIG9mIHNvbWUga2luZC4gRm9yIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBhIENpdHkgdGhhdCBjb250YWlucyBCbG9ja3MgYW5kIHRoYXQgYW4gSW5kaXZpZHVhbCBjYW4gbW92ZSBhcm91bmQgd2l0aGluLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkFnZW50cyBhcmUgQWN0YWJsZSBhbmQgdGh1cyBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGJlaGF2aW9ycyBjYWxsZWQgIkFjdGlvbnMiLCBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZSBuZXh0IHNlY3Rpb24uIEFjdGlvbnMgY2FuIGRlc2NyaWJlIGluZGl2aWR1YWwgYmVoYXZpb3IsIGFuZCBhdCB0aGUgQ29udGV4dCAoU2NhcGUpIGxldmVsIGNhbiBkZWZpbmUgaG93IG1lbWJlciBBZ2VudHMgYW5kIFByb2plY3Rpb25zIGFyZSBjcmVhdGVkLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlN0eWxlcyBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciBkZWZpbmluZyBnZW5lcmljIHZpc3VhbGl6YXRpb24gYmVoYXZpb3IgZm9yIEFnZW50cyBhbmQgc28gYXJlIGFsc28gQWN0YWJsZS4gRm9yIGV4YW1wbGUsIGFuIEFnZW50IG1pZ2h0IGhhdmUgYW4gQWN0aW9uIHRoYXQgc2F5cyBlZmZlY3RpdmVseSAiZHJhdyBhIHJlZCBjaXJjbGUgc2hhZGVkIHJlZCBmb3IgdGhlIHdlYWx0aCBvZiB0aGUgYWdlbnQiLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBY3Rpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJBY3Rpb25zXzIiPjwvYT5BY3Rpb25zPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFjdGlvbnMgYXJlIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGFuIGFnZW50IG1vZGVsLiBXaGlsZSBBZ2VudHMsIEF0dHJpYnV0ZXMgYW5kIFNwYWNlcyBkZWZpbmUgd2hhdCB3ZSdyZSBtb2RlbGluZywgaXQgaXMgQWN0aW9ucyB0aGF0IGdpdmUgdGhlIG1vZGVscyBsaWZlLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPdmVydmlldyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik92ZXJ2aWV3XzMiPjwvYT5PdmVydmlldzwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BY3Rpb25zIGFsbG93IHRoZSBkZWZpbml0aW9uIG9mIGJlaGF2aW9yIGZvciBhZ2VudHMgYXQgYSB2ZXJ5IGhpZ2ggbGV2ZWwuIFlvdSBjYW4gdGhpbmsgb2YgYWN0aW9ucyBhcyBiZWluZyBhbmFsb2dvdXMgdG8gbWV0aG9kcyBpbiBhIHRyYWRpdGlvbmFsIG9iamVjdC1vcmllbnRlZCBtb2RlbCBidXQgdGhhdCBhbmFsb2d5IG9ubHkgZ29lcyBzbyBmYXIuIEluIHRoZSBzYW1lIHdheSB0aGF0IG1ldGhvZHMgYXJlIGRlZmluZWQgYXMgcGFydCBvZiBvYmplY3RzLCBhY3Rpb25zIGJlbG9uZyB0byBwYXJ0aWN1bGFyIGFnZW50cy4gKFRob3VnaCBldmVuIG1vcmUgZXhwcmVzc2l2ZSB3YXlzIG9mIGRlZmluaW5nIGFjdGlvbnMgYXJlIGNvbnRlbXBsYXRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuKSBJbiB0aGUgbmV4dCBzZWN0aW9uIHdlIGdvIGludG8gZGV0YWlsIGFib3V0IHdoYXQgQWN0aW9ucyBhcmUgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbGwgYWdlbnQgYmVoYXZpb3IuIFRoZXkgYXJlIGFsc28gY29uY2VwdHVhbGx5IG1vcmUgY2hhbGxlbmdpbmcgYXMgdW5saWtlIHdpdGggc3RydWN0dXJlIHRoZXkgaGF2ZSBubyBkaXJlY3QgYW5hbG9naWVzIHRvIHBhc3QgYWdlbnQgcmVwcmVzZW50YXRpb25zLjwvcD4KKzxwPkFuIGFjdGlvbiBwcm92aWRlcyBzaW1wbGUsIHdlbGwtZGVmaW5lZCBkZXRhaWxzIHRoYXQgYSBtb2RlbCBjYW4gdXNlIHRvIGRldGVybWluZSB3aGF0IHN0ZXBzIHRvIHRha2UgaW4gbW9kZWwgZXhlY3V0aW9uLiBUaGF0IGRlZmluaXRpb24gc2VlbXMgZ2VuZXJhbCBlbm91Z2ggdG8gYmUgYWxtb3N0IHVzZWxlc3MsIGJ1dCBpdHMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCBhbiBhY3Rpb24gaXMgbm90IGVxdWl2YWxlbnQgdG8gYW4gaW5zdHJ1Y3Rpb24sIGEgbWV0aG9kIG9yIGEgcXVlcnkuIEluIGZhY3QsIGFjdGlvbnMgY2FuIGhhdmUgYXNwZWN0cyBvZiBhbGwgb2YgdGhlc2UuIEJ1dCBhbiBhY3Rpb24gaXMgbm90IGluIGl0c2VsZiBhbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIGV4YWN0bHkgCisJCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPmhvdzwvc3Bhbj4gdGhlIG1vZGVsaW5nIGVuZ2luZSBzaG91bGQgZG8gc29tZXRoaW5nIC0tIGluc3RlYWQgYW4gYWN0aW9uIHJlcHJlc2VudHMgCisJCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPndoYXQ8L3NwYW4+IHRoZSBtb2RlbGVyIGludGVuZHMgZm9yIHRoZSBhZ2VudHMgdG8gZG8uIChUZWNobmljYWxseSwgd2UgbWlnaHQgc2F5IHRoYXQgQWN0aW9ucyB0YWtlcyBhICJkZWNsYXJhdGl2ZSIgYXBwcm9hY2ggaW5zdGVhZCBvZiBhbiAnaW1wZXJhdGl2ZScgYXBwcm9hY2gsIGJ1dCB0aGF0J3Mgbm90IHF1aXRlIHRydWUsIGJlY2F1c2UgYWN0aW9ucyBkbyBhbGxvdyB1cyB0byBkZWZpbmUgYmVoYXZpb3IgaW4gYSByaWNoZXIgd2F5IHRoYW4gbW9zdCBkZWNsYXJhdGl2ZSBhcHByb2FjaGVzLCBhbmQgbWFueSBhY3Rpb24gY29uc3RydWN0cyBtYXAgZGlyZWN0bHkgdG8gaW1wZXJhdGl2ZSBhcHByb2FjaGVzLikKKwkJCQk8L3A+Cis8cD5BY3Rpb25zIGFyZSBjb25uZWN0ZWQgdG9nZXRoZXIgaW4gYSBzZXJpZXMgb2Ygc291cmNlcyBhbmQgdGFyZ2V0cy4gKFRlY2huaWNhbGx5LCBhbiBhY3ljbGljIGRpcmVjdGVkIGdyYXBoLikgSW4gYW4gYWJzdHJhY3Qgc2Vuc2UgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgYW55IHByb2dyYW1taW5nIGxhbmd1YWdlIGlzIGRlZmluZWQgYWx0aG91Z2ggdGhhdCBzdHJ1Y3R1cmUgaXNuJ3QgdXN1YWxseSBvYnZpb3VzIGJlY2F1c2Ugb2YgdGhlIGNvbnN0cmFpbnRzIG9mIHRleHR1YWwgcmVwcmVzZW50YXRpb25zLiBCdXQgdW5saWtlIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZSwgaW4gQWN0aW9ucyBpdCBpcyBub3QgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgKHRoZSBwcm9jZXNzb3IpIHRoYXQgbW92ZXMgZnJvbSBvbmUgaW5zdHJ1Y3Rpb24gdG8gdGhlIG5leHQsIGJ1dCB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBhY3Rpb24uIEluIHRoaXMgd2F5LCBhY3Rpb24gcmVzdWx0cyAiZmxvdyIgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSBhY3Rpb24gaW50byB0aGUgbmV4dCBhY3Rpb24uPC9wPgorPHA+V2h5IGFyZSB0aGVzZSBkaXN0aW5jdGlvbnMgYmV0d2VlbiB0cmFkaXRpb25hbCBPYmplY3QtT3JpZW50ZWQgYW5kIHRoZSBBY3Rpb24gYXBwcm9hY2hlcyBpbXBvcnRhbnQ/IFRoZXkgZ2l2ZSB1cyB0aGUgYWR2YW50YWdlcyBvZiBzaW1wbGljaXR5LCBjbGFyaXR5IGFuZCBmbGV4aWJpbGl0eSB0aGF0IAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii93aWtpL2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0YWZsb3dfcHJvZ3JhbW1pbmciIHRhcmdldD0iX25ldyI+ZGF0YS1mbG93IGFwcHJvYWNoZXM8L2E+IGxpa2Ugc3ByZWFkc2hlZXRzIGFuZCBzb21lIHF1ZXJ5IGxhbmd1YWdlcyBoYXZlLCBidXQgd2l0aCBsZXNzIHJlc3RyaWN0aW9ucy4gQXQgdGhlIHNhbWUgdGltZSwgdGhleSBjYW4gYnJpbmcgdXMgbXVjaCBvZiB0aGUgcG93ZXIgYW5kIGV4cHJlc3NpdmVuZXNzIG9mIAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii93aWtpL2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnVuY3Rpb25hbF9wcm9ncmFtbWluZyIgdGFyZ2V0PSJfbmV3Ij5mdW5jdGlvbmFsIGxhbmd1YWdlczwvYT4gbGlrZSBMaXNwIG9yIAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii93aWtpL2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9naWNhbF9wcm9ncmFtbWluZyIgdGFyZ2V0PSJfbmV3Ij5sb2dpY2FsIGxhbmd1YWdlczwvYT4gbGlrZSBQcm9sb2csIGJ1dCB3aXRob3V0IHRoZSBsZXZlbCBvZiBjb21wbGV4aXR5IGFuZCBvYnNjdXJpdHkgdGhhdCBzdWNoIGxhbmd1YWdlcyBjYW4gaGF2ZS4KKwkJCQk8L3A+Cis8cD5XZSBjYW4gZ2V0IGEgYmV0dGVyIGlkZWEgZm9yIGhvdyBBY3Rpb25zIHdvcmsgYnkgdGhpbmtpbmcgYWJvdXQgaG93IGEgc3ByZWFkc2hlZXQgd29ya3MuIEluIGEgc3ByZWFkc2hlZXQsIHdlIG1pZ2h0IGRlZmluZSBhIGNlbGwgQSB0aGF0IGFkZHMgdXAgYSByb3cgb2YgZGF0YSwgc2F5ICJJbmNvbWUiLiBXZSBtaWdodCBkZWZpbmUgYW5vdGhlciBjZWxsIEMgKCJQcm9maXQiKSB0aGF0IHRha2VzIEEgYW5kIGFkZHMgaXQgdG8gYW5vdGhlciBjZWxsIEIgdGhhdCBhZGRzIHVwIGFub3RoZXIgcm93IG9mIGRhdGEgKCJFeHBlbnNlcyIpLiBOb3csIGlmIHdlIGNoYW5nZSBhIHZhbHVlIGluIGFueSBvZiB0aGUgcm93cywgYWxsIG9mIHRoZSBvdGhlciByb3dzIGFyZSBhZGRlZCB1cCBhbmQgd2UgZ2V0IHRoZSByZXN1bHRzIGluIEEgYW5kIEIgdXBkYXRlZCBhdXRvbWF0aWNhbGx5LiBXZSBuZXZlciBoYWQgdG8gd3JpdGUgY29kZSB0aGF0IHNhaWQgc29tZXRoaW5nIGxpa2UgImZvciBlYWNoIGNlbGwgaW4gcm93IFgsIHdoZXJlLi4uIi4gSW4gZmFjdCwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgCisJCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPmhvdzwvc3Bhbj4gb3VyIFNwcmVhZHNoZWV0IHByb2dyYW0gYWRkcyB1cCB0aGUgbnVtYmVycyAtLSBpdCBjb3VsZCBoYXZlIGFkZGVkIHRoZW0gYWxsIHVwIGF0IG9uY2UgYnV0IGluIGJhY2t3YXJkIG9yZGVyLCBvciBzdG9yZWQgYSBydW5uaW5nIHRvdGFsIHNvbWV3aGVyZSBhbmQgdXBkYXRlZCBqdXN0IHRoZSBkaWZmZXJlbmNlIGluIHZhbHVlIGZvciB0aGUgY2VsbCB3ZSBjaGFuZ2VkIC0tIHdoYXQgd2UgY2FyZSBhYm91dCBpcyAKKwkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+d2hhdDwvc3Bhbj4gdGhlIHJlc3VsdCBpcywgYW5kIHdoZXRoZXIgaXQgaXMgY29ycmVjdC4KKwkJCQk8L3A+Cis8cD5CdXQgQWN0aW9ucyBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gYSBzcHJlYWRzaGVldCwgYmVjYXVzZSB3aGF0IGlzIGZsb3dpbmcgZnJvbSBBY3Rpb24gQSB0byBBY3Rpb24gQiBpcyBub3QganVzdCBhIG51bWJlciwgYnV0IGFueSBtb2RlbCBjb21wb25lbnQgc3VjaCBhcyBhIHNwYWNlIG9yIGEgc2V0IG9mIGFnZW50cyB0aGF0IHdlIG5lZWQgdG8gdXNlIGluIHRhcmdldCBhY3Rpb25zLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbmNlcHRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29uY2VwdHMiPjwvYT5Db25jZXB0czwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5JbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGRlc2NyaWJlIGhvdyBtb2RlbGVycyBjYW4gYXNzZW1ibGUgYWN0aW9ucyBpbnRvIHNldHMgb2YgYmVoYXZpb3IgdGhhdCBhY2NvbXBsaXNoIGNvbXBsZXggdGFza3Mgb24gaW50ZXJyZWxhdGVkIGFnZW50cyBhbmQgc3BhY2VzIG92ZXIgdGltZS48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iS2luZHMgb2YgQWN0aW9ucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IktpbmRzX29mX0FjdGlvbnMiPjwvYT5LaW5kcyBvZiBBY3Rpb25zPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzx0YWJsZSBpZD0iTjEwMkI5Ij4KKzx0cj4KKwkJCQkJCQkKKzx0ZD5CZWZvcmUgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzIG9mIGhvdyBlYWNoIEFjdGlvbnMgd29yayB0b2dldGhlciwgb3IgdGhlIHZhcmlvdXMga2luZHMgb2YgQWN0aW9ucywgaXQgd2lsbCBiZSBoZWxwZnVsIHRvIHRha2UgYSBicm9hZCBvdmVydmlldyBvZiBob3cgdGhleSBhbGwgZml0IHRvZ2V0aGVyLiBBcyBkaXNjdXNzZWQgYWJvdmUsIGFjdGlvbnMgYXJlIHN0cnVuZyB0b2dldGhlciBpbiBhIHNlcXVlbmNlIG9yIGZsb3cuIFRoZXkncmUgYWx3YXlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhvdWdoIHRob3NlIHBhcnRzIGNhbiBiZSBhc3NlbWJsZWQgYW5kIGludGVybWl4ZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5cy4gRmlyc3QsIHdlIHNlYXJjaCBmb3IgYSBjb2xsZWN0aW9uIG9mIGFnZW50cywgYW5kIHRoZW4gd2UgZG8gc29tZXRoaW5nIHdpdGggdGhhdCBzZWxlY3Rpb24uIFdlIHJlZmVyIHRvIHRoZXNlIHR3byBwYXJ0cyBhcyBTZWxlY3Rpb25zIGFuZCBDb21tYW5kcy4gKEZvciB0aGUgdGVjaG5pY2FsbHkgbWluZGVkLCBhbm90aGVyIHVzZWZ1bCB3YXkgb2YgbG9va2luZyBhdCB0aGUgQWN0aW9ucyBhcHByb2FjaCBpcyBhcyBhIFF1ZXJ5IFRyYW5zZm9ybWF0aW9uIGxhbmd1YWdlLCBhcyB3aXRoIFNRTCBhbmQgU3RvcmVkIFByb2NlZHVyZXMuICBFeGNlcHQgYWdhaW4sIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyaWVzIGFsb25nIHdpdGggdGhlIHRyYW5zZm9ybWF0aW9ucyBmbG93IHRocm91Z2ggZnJvbSBvbmUgcXVlcnkgdG8gdGhlIG5leHQuKSBTZWxlY3Rpb25zIGZpbmQgdGhlIGFnZW50cyB3ZSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoLCBhbmQgdGhlIGNvbW1hbmRzIGRvIGl0LiBXZSBuZWVkIHNvbWUgd2F5IHRvIHN0YXJ0IHRoZSB3aG9sZSBjaGFpbiBvZiBhY3Rpb25zIG9mZiwgYW5kIHNvIHdlIGhhdmUgYSBraW5kIG9mIFNlbGVjdGlvbiBjYWxsZWQgYSBSb290IFNlbGVjdGlvbiwgb3Igc2ltcGx5IGEgUm9vdC4gU2Vjb25kbHksIHdlIG5lZWQgc29tZSB3YXkgdG8gYWN0dWFsbHkgbWFrZSB0aGUgYWdlbnRzIGV4aXN0IGluIHRoZSBtb2RlbCBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIHdlIGhhdmUgYSBDcmVhdGUgQWdlbnRzIGFjdGlvbi4gRmluYWxseSwgd2UgaGF2ZSBzcGVjaWFsIGNvbW1hbmRzIGNhbGxlZCBidWlsZGVycyB0aGF0IGFsbG93IHVzIHRvIGNyZWF0ZSB0aGUgc3BhY2VzIHRoYXQgdGhlIGFnZW50cyB3aWxsIG9jY3VweS4gVGhlIHZhcmlvdXMgYWN0aW9ucyBhcmUgZGlzY3Vzc2VkIGluIGRlcHRoIGluIHRoZSBEZXRhaWxzIHNlY3Rpb24uIFRoZSBkaWFncmFtIGF0IHRoZSByaWdodCBkZXBpY3RzIGhvdyBhY3Rpb25zIHJlbGF0ZSB0byBvbmUgYW5vdGhlciAtLSBpdCBkb2VzIG5vdCBpbmNsdWRlIHNvbWUgYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBtb3JlIHJlY2VudGx5LjwvdGQ+CisJCQkJCQkJPHRkPgorCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zQmxvY2tzLnBuZyI+PC9kaXY+IAorCQkJCQkJCQorPC90ZD4KKwkJCQkJCQorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJGbG93Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRmxvdyI+PC9hPkZsb3c8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Rmlyc3QsIGxldCdzIGxvb2sgYXQgaG93IGFjdGlvbnMgZGVmaW5lIHRoZSBiYXNpYyBwYXRoIHRoYXQgYWdlbnRzIHRha2UgZHVyaW5nIGEgbW9kZWwgcnVuLiBBcyB3aXRoIGFueSBwcm9ncmFtbWluZyBsYW5ndWFnZSwgdGhlIHBhdGggd2UgdGFrZSB0aHJvdWdoIHRoZSBwcm9ncmFtIHNwZWNpZmljYXRpb24gaXMgd2hhdCBkZXRlcm1pbmVzIG91ciBzdGF0ZSB3aGVuIHdlIGdldCB0aGVyZS4gSW4gYSBwdXJlIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtLCB0aGUgcGF0aCBqdXN0IGRlZmluZXMgdGhlIGNvbnRyb2wgZmxvdyAtLSB3aGF0IHdlIGFyZSBkb2luZy4gVGhlIGFjdHVhbCBzdGF0ZSBvZiBvdXIgbW9kZWwgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIG9iamVjdCBpdHNlbGYuIElmIHdlIGNhbGwgYSBtZXRob2QgQiBmcm9tIGFub3RoZXIgbWV0aG9kIEEsIHdlJ2xsIGJlIHJlbHlpbmcgb24gbWV0aG9kIEEgdG8gc2V0IHRoZSB2YWx1ZXMgdGhhdCB3ZSBuZWVkIGludG8gdGhlIG9iamVjdCBzdGF0ZSBpdHNlbGYuIEluIGEgcHVyZWx5IGZ1bmN0aW9uYWwgcHJvZ3JhbSB0aGUgcGF0aCBkZWZpbmVzIGhvdyB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoIHdoYXRldmVyIGhhcyBiZWVuIGV4cGxpY2l0bHkgcGFzc2VkIGluIHRvIGEgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiBjYWxsZWQsIHRoYXQgaXMgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuIEluIGZhY3QsIG1vc3QgbGFuZ3VhZ2VzIHN1Y2ggYXMgSmF2YSBjb21iaW5lIGFzcGVjdHMgb2YgYm90aCBhcHByb2FjaGVzLjwvcD4KKzxwPkluIEFjdGlvbnMsIHRoZSBwYXRoIGl0c2VsZiBpbXBsaWNpdGx5IGNhcnJpZXMgYWxsIG9mIHRoZSBjb250ZXh0IG9mIHByaW9yIGV4ZWN1dGlvbiB3aXRoIGl0LiBUaGlzIG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzdG9yaW5nIGNvbnRleHQgaW4gdGhlIG9iamVjdCAtLSBhcyB3ZSB3b3VsZCBpbiBhbiBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2UgLS0gb3IgcGFzc2luZyB0aGUgY29ycmVjdCB2YWx1ZXMgZnJvbSBvbmUgbWV0aG9kIGNhbGwgdG8gdGhlIG5leHQgYXMgd2Ugd291bGQgaW4gYSBmdW5jdGlvbmFsIGxhbmd1YWdlLiBJbnN0ZWFkLCBBY3Rpb25zIGNhbiB1c2UgdGhlIGltcGxpY2l0IGNvbnRleHQgb2YgdGhlIHBhdGggb2YgZmxvdyB0byBkZXRlcm1pbmUgd2hhdCB0aGUgY3VycmVudCBzdGF0ZSBvZiBleGVjdXRpb24gaXMuCisJCQkJCQlBbiBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSBBY3Rpb25zIGRlc2lnbiBpcyB0aGF0IGxvb3Agc3RydWN0dXJlcyBhcmUgbm90IGFsbG93ZWQgLS0gdGhhdCBpcywgZmxvd3MgYXJlIGFjeWNsaWMuIEFuIGFjdGlvbiBjYW4gbmV2ZXIgaGF2ZSBhbiBhbmNlc3RvciB0YXJnZXQgKHRoYXQgaXMgdGFyZ2V0cywgdGFyZ2V0cyBvZiB0YXJnZXRzLCBldGMuLikgdGhhdCBoYXMgYXMgb25lIG9mIGl0cyBhbmNlc3RvcnMgdGhhdCBzYW1lIGFjdGlvbi4gQXMgeW91J2xsIHNlZSwgYWN0aW9ucyBkb24ndCB0eXBpY2FsbHkgCisJCQkJCQk8c3BhbiBjbGFzcz0iaXRhbGljIj5uZWVkPC9zcGFuPiBsb29wIHN0cnVjdHVyZXMuIEJ5IGZhciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGxvb3BzIGluIGNvbnZlbnRpb25hbCBwcm9ncmFtbWluZyBsYW5nYXVnZXMgaXMgdG8gbG9vcCB0aHJvdWdoIGNvbGxlY3Rpb25zIG9mIG9iamVjdHMuIEFzIHNlbGVjdGlvbnMgKHNlZSBiZWxvdykgcmVmZXIgdG8gdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGFnZW50cywgYW55IGFjdGlvbnMgb24gYSBzZWxlY3Rpb24gYXBwbHkgdG8gYWxsIG1lbWJlcnMgb2YgdGhhdCBjb2xsZWN0aW9uLiBSZWN1cnNpdmUgc3RydWN0dXJlcyBhcmUgbmVlZGVkIGZvciBzb21lIHBhcnRpY3VsYXIgdXNhZ2VzIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgcmVsZWFzZXMsIGJ1dCBub3QgdGhyb3VnaCBhbiBleHBsaWNpdCBsb29waW5nIGNvbnN0cnVjdC4KKwkJCQkJPC9wPgorPHRhYmxlIGlkPSJOMTAyRDciPgorPHRyPgorCQkJCQkJCQorPHRkPkFnYWluLCBiZWhhdmlvcnMgaW4gQWN0aW9ucyBhcmUgYWx3YXlzIGRlZmluZWQgYnkgYSBzZXQgb2YgCisJCQkJCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPnNlbGVjdGlvbnM8L3NwYW4+IGFuZCAKKwkJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+cXVlcmllczwvc3Bhbj4uIEluIHRoZSBkaWFncmFtIHRvIHRoZSByaWdodCwgd2UgY2FuIHNlZSB0aGUgcGF0dGVybi4gRmlyc3QsIHdlIGRlZmluZSBhIFJvb3QgU2VsZWN0aW9uIGZvciBhIFJ1bGUsIFNjaGVkdWxlIG9yIG90aGVyIHRyaWdnZXJpbmcgZXZlbnQuIFRoZW4sIHdlIG1pZ2h0IGFkZCBhIHNlcmllcyBvZiBRdWVyeSBhbmQgTG9naWMgQWN0aW9ucyB0byBkZWZpbmUgdGhlIHNwZWNpZmljIGFnZW50cyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiBUaGVzZSBhcmUgYWxsIHBhcnQgb2YgdGhlIFNlbGVjdGlvbi4gTmV4dCwgd2UgbWlnaHQgZGVmaW5lIGEgc2VyaWVzIG9mIENvbW1hbmRzIHRvIGRldGVybWluZSB3aGF0IHRvIGRvIHdpdGggdGhvc2UgYWdlbnRzLiBPciwgd2UgY291bGQgdXNlIHRoZSByZXN1bHQgb2YgdGhhdCBzZWxlY3Rpb24gdG8gaW1tZWRpYXRlbHkgZGVmaW5lIGFub3RoZXIgc2VsZWN0aW9uLCBmb3IgZXhhbXBsZSBpZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhbiBhZ2VudCB0aGF0IGlzIG5lYXIgYW5vdGhlciBhZ2VudC4KKwkJCQkJCQk8L3RkPgorCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlcXVlbmNlLnBuZyI+PC9kaXY+CisJCQkJCQkJCis8L3RkPgorCQkJCQkJCis8L3RyPgorPC90YWJsZT4KKzx0YWJsZSBpZD0iTjEwMkYxIj4KKzx0cj4KKwkJCQkJCQkKKzx0ZD5UaGUgZGlhZ3JhbSB0byB0aGUgcmlnaHQgZGVwaWN0cyBhIHNpbXBsZSBleGFtcGxlLiBIZXJlLCB3ZSBjcmVhdGUgYSBydWxlLCBhbmQgdGhlbiBjaGVjayB0aGUgcmVzdWx0cyBvZiB0d28gcXVlcmllcy4gRm9yIGFueSBhZ2VudHMgdGhhdCBtZWV0IHRob3NlIGNyaXRlcmlhLCB3ZSdsbCBldmFsdWF0ZSBzb21lIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZWlyIHN0YXRlLCBhbmQgdGhlbiBzZXQgc29tZSB2YWx1ZSBvbiB0aGVtLjwvdGQ+CisJCQkJCQkJPHRkPgorCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2ltcGxlU2VxdWVuY2UucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIGlkPSJOMTAzMDMiPgorPHRyPgorCQkJCQkJCQorPHRkPkluIHRoaXMgbmV4dCBleGFtcGxlLCB3ZSdsbCBmaXJzdCBjcmVhdGUgdGhlIHJ1bGUsIGFuZCB0aGVuIGNyZWF0ZSBhIG5ldyBzZWxlY3Rpb24gd2l0aCBhIHNldCBvZiBjcml0ZXJpYS4gRmluYWxseSwgd2UnbGwgZG8gYSBtb3ZlIGJhc2VkIG9uIHRob3NlIHF1ZXJpZXMuPC90ZD4KKwkJCQkJCQk8dGQ+CisJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9hY3Rpb25zL0FjdGlvbnNTaW1wbGVTZXF1ZW5jZTIucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPHA+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSd2ZSBkZWZpbmVkIGEgc2V0IG9mIGFjdGlvbnMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMuIFdlIGhhdmUgYSBzZWxlY3Rpb24sIGEgZmV3IHF1ZXJpZXMgYW5kIGEgY291cGxlIG9mIGxvZ2ljIG9wZXJhdG9ycyBsZWFkaW5nIHRvIGEgU2V0IEFjdGlvbi4gV2UnbGwgZGVzY3JpYmUgaW4gZGV0YWlsIGJlbG93IGhvdyBMb2dpYyBBY3Rpb25zIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgYWN0aW9ucyB0byBhc3NlbWJsZSBhbnkga2luZCBvZiBxdWVyeSBzdHJ1Y3R1cmUgbmVlZGVkLiBCdXQgZm9yIG5vdywgd2UnbGwgZm9jdXMgb24gdGhlIGNvbnRyb2wgZmxvdyBpdHNlbGYuPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zRmxvd1NpbXBsZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+QXMgeW91IGhhdmUgcHJvYmFibHkgYWxyZWFkeSBndWVzc2VkLCB0aGUgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgU2V0IEFjdGlvbiBhcHBsaWVkIHRvIHRoZW0gY291bGQgdGFrZSBvbmUgb2YgdHdvIHBhdGhzIHRocm91Z2ggdGhlIEFjdGlvbiBmbG93LiBSZWFkZXJzIHdpdGggZXhwZXJpZW5jZSB3aXRoIHByb2dyYW1taW5nIG9yIGZvcm1hbCBsb2dpYyB3aWxsIG5vdGUgdGhhdCB0aGlzIGxvb2tzIGp1c3QgbGlrZSBhIHBhcnNlIHRyZWUsIGFuZCB3aGlsZSB0aGF0J3MgYmFzaWNhbGx5IHdoYXQgaXQgaXMsIHRoZXJlIGFyZSBpbXBvcnRhbnQgZGlmZmVyZW5jZXMuIEZvciBleGFtcGxlLCBpZiB3ZSBsb29rZWQgYXQgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgYXMgYSBkZWZpbml0aW9uIG9mIGNvbnRyb2wgZmxvdyBmb3IgYSBzaW5nbGUgYWdlbnQgd2UnZCB0YWtlIHRoZW0gdG8gYmUgZXF1aXZhbGVudC4gQm90aCB3b3VsZCBldmFsdWF0ZSB0aGUgc3RhdGVtZW50IChRdWVyeSAxIEFORCBRdWVyeSAyKSBPUiBRdWVyeSAzIGZvciBlYWNoIGFnZW50LjwvcD4KKzxwPgorCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc0Zsb3dVbmlvbi5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+V2l0aGluIEFjdGlvbnMgaW4gbWFueSBjYXNlcyB0aGVzZSB0d28gYXBwcm9hY2hlcyB3aWxsIGFsc28gYWN0IGVxdWl2YWxlbnRseS4gSWYgd2UgYXJlIHNpbXBseSBzZXR0aW5nIGEgdmFsdWUsIGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBhbiBhZ2VudCBnZXRzIHRvIHRoYXQgU2V0IEFjdGlvbiwgYXMgbG9uZyBhcyBpdCBnZXRzIHRoZXJlLiBBbGwgc291cmNlcyB0aGF0IGZsb3cgaW50byBhIGdpdmVuIHRhcmdldCBBY3Rpb24gYWN0IGxpa2UgYSBsb2dpY2FsIHVuaW9uIHNpbmNlIGFueSBvZiB0aGUgcGF0aHMgbWlnaHQgcmVhY2ggdGhhdCB0YXJnZXQuIEJ1dCBub3RlIHRoYXQgd2UgaGF2ZSB0d28gZmxvd3MgbW92aW5nIGluIHBhcmFsbGVsIGluIHRoZSBmbG93IG9uIHRoZSByaWdodC4gV2hhdCBoYXBwZW5zIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIAorCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+Ym90aDwvc3Bhbj4gYnJhbmNoZXMgYXJlIHRydWU/IEFzIHRoZSBzZXQgb2YgYWdlbnRzIGZsb3cgdGhyb3VnaCBlYWNoIGJyYW5jaCB0aGUgU2V0IEFjdGlvbiBvbiB0aGUgbGVmdCB3aWxsIGJlIGV2YWx1YXRlZCBvbmNlLCB3aGlsZSB0aGUgb25lIG9uIHRoZSByaWdodCB3aWxsIGJlIGV2YWx1YXRlZCB0d2ljZS4gQWdhaW4sIHRoaXMgb2Z0ZW4gZW5kcyB1cCB3aXRoIHRoZSBzYW1lIGJlaGF2aW9yLCBidXQgbm90IGFsd2F5cy4gSWYgZm9yIGV4YW1wbGUsIHRoZSBldmFsdWF0ZSBBY3Rpb24gdXNlcyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHdlIGFyZSBzZXR0aW5nIGFzIGlucHV0LCB3ZSBjYW4gZ2V0IGRpZmZlcmVudCByZXN1bHRzLiBPZiBjb3Vyc2UsIHlvdSBjYW4gd3JpdGUgY29kZSBpbiBhbnkgbGFuZ3VhZ2UgdGhhdCBhY2NvbXBsaXNoZXMgdGhlIHNhbWUgdGhpbmcsIGJ1dCB0aGUgY29kZSB3aWxsIGxvb2sgcXVpdGUgZGlmZmVyZW50LiBGb3IgZXhhbXBsZSwgaWYgd2Ugd3JvdGUgdGhlIHNhbWUgYmFzaWMgbG9naWMgaW4gSmF2YSwgaW4gdGhlIGZpcnN0IGNhc2Ugd2UnZCBoYXZlIHNvbWV0aGluZyBsaWtlOgorCQkJCQk8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmlmJm5ic3A7KChxdWVyeTEuZXZhbHVhdGUoKSZuYnNwOyZhbXA7JmFtcDsmbmJzcDtxdWVyeTIuZXZhbHVhdGUoKSkmbmJzcDt8fCZuYnNwO3F1ZXJ5My5ldmFsdWF0ZSgpKSZuYnNwO3s8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkb1NvbWV0aGluZygpOzxicj4KK308YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+SW4gdGhlIHNlY29uZCB3ZSdkIGhhdmU6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5pZiZuYnNwOyhxdWVyeTEuZXZhbHVhdGUoKSZuYnNwOyZhbXA7JmFtcDsmbmJzcDtxdWVyeTIuZXZhbHVhdGUoKSkmbmJzcDt7PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZG9Tb21ldGhpbmcoKTs8YnI+Cit9PGJyPgoraWYmbmJzcDsocXVlcnkzLmV2YWx1YXRlKCkpJm5ic3A7ezxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2RvU29tZXRoaW5nKCk7PGJyPgorfTxicj4KKworPC9wPgorPC9kaXY+Cis8cD5UaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUsIGJ1dCB3aXRoIG11bHRpcGxlIGJyYW5jaGVzIHN1Y2ggY29kZSBkZXNpZ24gaXNzdWVzIGNhbiBxdWlja2x5IGdyb3cgY29tcGxleC4gVGhlIGZsb3cgYXBwcm9hY2ggYWxsb3dzIHVzIHRvIGV4cHJlc3MgdGhpbmdzIGluIGEgd2F5IHRoYXQgaXMgb2Z0ZW4gbW9yZSBuYXR1cmFsIGFuZCBleHByZXNzaXZlLiBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIGtlZXAgaW4gbWluZCB3aGVuIGRlc2lnaW5nIGFjdGlvbiBmbG93cyBpcyB0byBzZWUgdGhlIGZsb3cgYXMgcmVwcmVzZW50aW5nIGEgc2VsZWN0aW9uIG9mIGFnZW50cyBtb3ZpbmcgdGhyb3VnaCBzdHJlYW1zIGluZGVwZW5kZW50bHkuIEluIHRoZSBBY3Rpb25zIGV4YW1wbGUgd2UgZXhwcmVzc2VkIGJvdGggYXBwcm9hY2hlcyBpbiBuZWFybHkgdGhlIHNhbWUgd2F5LCBleGNlcHQgaW4gdGhlIGNhc2Ugb24gdGhlIGxlZnQgd2UgdXNlZCBhIFVuaW9uIEFjdGlvbiB0byBicmluZyB0aGUgdHdvIGJyYW5jaGVzIG9mIGZsb3cgYmFjayB0b2dldGhlci48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2VsZWN0aW9ucyI+PC9hPlNlbGVjdGlvbnM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VsZWN0aW9ucyBhcmUgYSBrZXkgY29uY2VwdCBpbiBBY3Rpb25zLiBQdXQgc2ltcGx5LCBzZWxlY3Rpb25zIGRlZmluZSB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yIGFuZCB3aGVyZS4gVGhleSBhcmUgZGVmaW5lZCBieSBhIGNvbWJpbmF0aW9uIG9mIFNlbGVjdCwgUXVlcnkgYW5kIExvZ2ljIEFjdGlvbnMuIEVhY2ggdGltZSB3ZSBjcmVhdGUgYSBuZXcgU2VsZWN0IEFjdGlvbiwgd2UgZGVmaW5lIGEgbmV3IHNlbGVjdGlvbi4gUXVlcmllcyBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZmluZSBzZWxlY3Rpb25zIGVpdGhlciBpbW1lZGlhdGVseSBhZnRlciBvciBsYXRlciBpbiB0aGUgQWN0aW9uIGZsb3csIGFzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiBMb2dpYyBBY3Rpb25zIGFyZSB1c2VkIHRvIGNvbWJpbmUgYW5kIG9yZ2FuaXplIHRoZSBBY3Rpb24gZmxvdyBkZWZpbmVkIGJ5IFF1ZXJ5IEFjdGlvbnMuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHRocmVlIHBpZWNlcyB3b3JrIHRvZ2V0aGVyLCB3ZSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGlkZWEgb2Ygc2VsZWN0aW9uIGJvdW5kYXJpZXMuPC9wPgorPHRhYmxlIGlkPSJOMTAzM0YiPgorPHRyPgorCQkJCQkJCQorPHRkPkEgc2VsZWN0aW9uIGJvdW5kYXJ5IGRldGVybWluZXMgdGhlIHNldCBvZiBzZWxlY3Rpb24gYWN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IGFnZW50cyB0byBhcHBseSB0YXJnZXQgYWN0aW9ucyB0by4gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbSwgd2UgY2FuIHNlZSB0aGUgZXh0ZW50IG9mIHRoZSBib3VuZGFyeSBmb3IgYSBzdHJhaWdodGZvcndhcmQgc2VsZWN0aW9uLjwvdGQ+CisJCQkJCQkJPHRkPgorCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnlTaW1wbGUucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIGlkPSJOMTAzNTEiPgorPHRyPgorCQkJCQkJCQorPHRkPkVhY2ggdGltZSB3ZSBjcmVhdGUgYSBuZXcgc2VsZWN0aW9uLCB3ZSBkZWZpbmUgYSBuZXcgc2V0IG9mIGJvdW5kYXJpZXMuIEluIHRoZSBkaWFncmFtIHRvIHRoZSByaWdodCwgU2VsZWN0aW9uIDEgYW5kIFNlbGVjdGlvbiAyIGVhYWNoIHN0YXJ0IHdpdGggYSBuZXcgU2VsZWN0IEFjdGlvbi4gPC90ZD4KKwkJCQkJCQk8dGQ+CisJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9hY3Rpb25zL0FjdGlvbnNTZWxCb3VuZGFyeTJQYXJ0cy5wbmciPjwvZGl2PiAKKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPHA+QnV0IGJvdW5kYXJpZXMgY2FuIGJlIGRlZmluZWQgZm9yIGEgZ3JvdXAgb2YgYWN0aW9ucyBieSBhIFF1ZXJ5IEFjdGlvbnMgYXMgd2VsbC4gVGhpcyBpcyBiZWNhdXNlIFF1ZXJ5IEFjdGlvbnMgY2FuIGJlIGRpcmVjdGx5IHBhcnQgb2YgYSBzZWxlY3Rpb24gZGVmaW5pdGlvbiwgYnV0IHRoZXkgY2FuIGFsc28gcmVmaW5lIHNlbGVjdGlvbnMuIFdlJ2xsIHNlZSBob3cgdGhhdCB3b3JrcyBiZWxvdy4gU28gd2hlcmUgZG9lcyBvbmUgc2VsZWN0aW9uIGJvdW5kYXJ5IGVuZCBhbmQgdGhlIG5leHQgb25lIGJlZ2luPyBUaGUgc2ltcGxlIHJ1bGUgaXMgdGhhdCB0aGUgZW5kIG9mIHRoZSBib3VuZGFyeSBpcyBkZWZpbmVkIGZvciBhIGdpdmVuIEFjdGlvbiBieSB0aGUgcGxhY2Ugd2hlcmU6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkEgUXVlcnkgQWN0aW9uIGlzIG5vdCBmb2xsb3dlZCBieSBhIExvZ2ljIEFjdGlvbiwgb3I8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BIExvZ2ljIEFjdGlvbiBpcyBub3QgZm9sbG93ZWQgYnkgYW5vdGhlciBMb2dpYyBBY3Rpb248L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPHRhYmxlIGlkPSJOMTAzNkUiPgorPHRyPgorCQkJCQkJCQorPHRkPkluIG90aGVyIHdvcmRzLCBhcyBzb29uIGFzIGEgTG9naWMgQWN0aW9uIG9jY3VycyBpbiBhIHBhdGggbGVhZGluZyB0byBhbiBBY3Rpb24sIGFueSBmb2xsb3dpbmcgUXVlcnkgd2lsbCBkZWZpbmUgYSBuZXcgYm91bmRhcnksIGFzIHNob3duIGluIHRoZSBleGFtcGxlIHRvIHRoZSByaWdodC4gPC90ZD4KKwkJCQkJCQk8dGQ+CisJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9hY3Rpb25zL0FjdGlvbnNTZWxCb3VuZGFyeTExQS5wbmciPjwvZGl2PgorCQkJCQkJCQorPC90ZD4KKwkJCQkJCQorPC90cj4KKzwvdGFibGU+Cis8cD5Ob3RlIHRoYXQgd2UgcmVmZXIgdG8gIlNlbGVjdGlvbiAxIiBhbmQgU2VsZWN0aW9uIDFBIi4gVGhpcyBpcyBiZWNhdXNlIFNlbGVjdGlvbiAxQSBpcyBhIHJlZmluZW1lbnQgb2YgU2VsZWN0aW9uIDEgYWxvbmcgaXRzIHBhcnRpY3VsYXIgcGF0aCBvZiBmbG93LiBXaGVuIGEgcXVlcnkgYXBwZWFycyBmb3IgdGhlIHNhbWUgc2VsZWN0aW9uIGJ1dCBwYXN0IGEgcGFydGljdWxhciBib3VuZGFyeSwgeW91IGNhbiB0aGluayBvZiBpdCBhcyBhIHNvcnQgb2YgZmlsdGVyIG9uIHRoZSBzZWxlY3Rpb24gY29udGVudHMuIFdlIGRvbid0IGhhdmUgYSAiU2VsZWN0aW9uIDIiIGhlcmUgYmVjYXVzZSBhbnkgQWN0aW9ucyB0aGF0IHJlZmVyIHRvICJTZWxlY3Rpb24gMSIgYWxvbmcgdGhlIGN1cnJlbnQgcGF0aCBvZiBmbG93IHdpbGwgYmUgYWN0aW5nIG9uIHRoZSBzZWxlY3Rpb24gZGVmaW5lZCBieSBTZWxlY3Rpb24gMSBhbmQgU2VsZWN0aW9uIDFBLjwvcD4KKzxwPlRoZXNlIHJ1bGVzIGFsbG93IGFjdGlvbnMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgc2ltcGxlc3QgcG9zc2libGUgd2F5LCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlaXIgaW1wbGljYXRpb24gYXMgdGhleSByZXN1bHQgaW4gYmVoYXZpb3IgdGhhdCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2hhdCBzb21lb25lIHVzZWQgdG8gYW5kIGltcGVyYXRpdmUgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQgc3VjaCBhcyBKYXZhIG1pZ2h0IGV4cGVjdC4gSW4gYSBzaW1wbGUgY2FzZSB0aGUgZGlzdGluY3Rpb24gbWlnaHQgbm90IG1hdHRlci4gRm9yIGV4YW1wbGUsIGlmIHdlIGFyZSB1c2luZyBhIFF1ZXJ5IDEgdG8gdGVzdCB3aGV0aGVyIGFuIGFnZW50J3MgYXR0cmlidXRlIGEgPT0geCBhbmQgYXR0cmlidXRlIGIgPT0geSwgd2Ugd291bGQgZ2V0IHRoZSBzYW1lIG91dGNvbWUgaWYgd2UgcGxhY2VkIGludGVyc2VjdGVkIHRoZSBxdWVyaWVzIGFzIGlmIHdlIHNpbXBseSBwdXQgdGhlbSBpbiBzZXF1ZW5jZS4gSW50ZXJuYWxseSB3ZSB3b3VsZCBhY3R1YWxseSBiZSBzZWFyY2hpbmcgZm9yIGFnZW50cyB3aXRoIGEgPT0geCwgYW5kIAorCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+dGhlbjwvc3Bhbj4gdGFraW5nIHRob3NlIGFnZW50cyBhbmQgY2hvb3NpbmcgdGhvc2UgYWdlbnRzIHdpdGggYj09eSwgYnV0IHRoZSBvdXRjb21lIHdvdWxkIGJlIHRoZSBzYW1lLiBCdXQgY29uc2lkZXIgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgY2FzZSwgd2hlcmUgd2UgYXJlIHNlYXJjaGluZyBmb3IgbmVpZ2hib3JpbmcgYXZhaWxhYmxlIGNlbGxzLgorCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9hY3Rpb25zL0FjdGlvbnNTZWxCb3VuZGFyeUNvbXBsZXgucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzxwPkluIHRoZSBmaXJzdCBjYXNlLCB3ZSBleGVjdXRlIGEgc2VhcmNoIGZvciBhbGwgYWdlbnRzIHRoYXQgbWVldCB0aGUgdHdvIGNyaXRlcmlhLiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlcmUgYXJlIAorCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+YW55PC9zcGFuPiBuZWlnaGJvcmluZyBjZWxscyB3aGljaCBhcmUgYXZhaWxhYmxlLCB3ZSdyZSBndWFyYW50ZWVkIHRvIGZpbmQgb25lIChyYW5kb20pIGNlbGwuIEluIHRoZSBzZWNvbmQgY2FzZSwgd2UgZmlyc3Qgc2VhcmNoIGZvciBhbGwgY2VsbHMgdGhhdCBhcmUgbmVpZ2hib3JzLiBUaGlzIHdpbGwgbWF0Y2ggYW55IGFnZW50cyB0aGF0IGluY2x1ZGUgYm90aCBhdmFpbGFibGUgYW5kIG5vbiBhdmFpbGFibGUgYWdlbnRzLiBOb3csIGF0IHRoaXMgcG9pbnQgc2luY2Ugb3VyIHNlYXJjaCByZXR1cm5zIG9uZSBhZ2VudCAoaW4gdGhlIGN1cnJlbnQgQU1GIGRlc2lnbiAtLSByaWNoZXIgYmVoYXZpb3Igd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZSkgdGhlIHJhbmRvbWx5IHNlbGVjdGVkIGFnZW50IGNvdWxkIGJlIGVpdGhlciBhdmFpbGFibGUgb3Igbm90LiBTbyBpbiB0aGUgc2Vjb25kIGNhc2UsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoIG5vIGNlbGwgdG8gbW92ZSB0bywgYW5kIHRodXMgbWFrZSBubyBtb3ZlIGF0IGFsbC4gVGhpcyB0aGVuIGJlY29tZXMgYW4gaW1wb3J0YW50IGFzcGVjdCBvZiBtb2RlbCBkZXNpZ24uIEZvciBleGFtcGxlLCBpZiBvbmUgd2VyZSBkZWZpbmluZyBhIG1vZGVsIHdoZXJlIG5laWdoYm9ycyBwbGF5ZWQgYSBnYW1lIHdpdGggZWFjaCBvdGhlciwgb25lIG1pZ2h0IHdhbnQgdG8gaW5zdHJ1Y3QgYWdlbnRzIHRvIHBsYXkgdGhlIGdhbWUgb25seSB3aXRoIG5laWdoYm9ycyB0aGF0IGhhdmUgYSBjZXJ0YWluIHdlYWx0aCB0aHJlc2hvbGQuIEluIHRoZSByZWFsLXdvcmxkIHNpdHVhdGlvbiB0aGF0IHdlIGFyZSBtb2RlbGluZywgd2UgbWlnaHQgc2ltcGx5IHNlYXJjaCBmb3IgbmVpZ2hib3JzIHdobyBhcmUgb3ZlciBhIGdpdmVuIHdlYWx0aCB0aHJlc2hvbGQgYW5kIHRoZW4gcGxheSB0aGUgZ2FtZSB3aXRoIHRoZW0uIFRoaXMgd291bGQgaW1wbHkgdGhhdCBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBhZ2VudCdzIHdlYWx0aCBpcyBvcGVuIGtub3dsZWRnZS4gT3IsIHdlIG1pZ2h0IHNpbXBseSBzZWxlY3QgYSByYW5kb20gbmVpZ2hib3IsIGFuZCBhc2sgdGhhdCBuZWlnaGJvciB0byBwbGF5IGEgZ2FtZSB3aXRoIHVzLiBVcG9uIGRpc2NvdmVyaW5nIHRoYXQgb3VyIG5laWdoYm9yIGRvZXMgbm90IG1lZXQgb3VyIHdlYWx0aCBjcml0ZXJpYSwgd2Ugd291bGQgdGhlbiBjaG9vc2Ugbm90IHRvIHBsYXkgd2l0aCB0aGVtLiBIZXJlIHdlIGFyZSBtb2RlbGluZyBhIGNvc3QgaW4gdGltZSB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYW5vdGhlciBhZ2VudCdzIHdlYWx0aCwgYmVjYXVzZSB3ZSBtaWdodCBtaXNzIGFuIG9wcG9ydHVuaXR5IHRvIHBsYXkgdGhlIGdhbWUgd2l0aCBhbm90aGVyIGFnZW50IG9uIHRoYXQgcm91bmQuCisJCQkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IldlYXZpbmciPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJXZWF2aW5nIj48L2E+V2VhdmluZzwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8dGFibGUgaWQ9Ik4xMDM5OSI+Cis8dHI+CisJCQkJCQkJCis8dGQ+Tm93LCBsZXQncyBwdXQgdGhlIGNvbmNlcHRzIG9mIEFjdGlvbnMgc2VxdWVuY2VzIGFuZCBib3VuZGFyaWVzIHRvZ2V0aGVyIHRvIHNlZSBob3cgd2UgY2FuIGVhc2lseSBkZWZpbmUgY29tcGxleCBpbnRlcmFjdGlvbnMgYmV0d2VlbiBtdWx0aXBsZSBzZWxlY3Rpb25zLiBXaGVuIHdlIGRlZmluZSBhIFNlbGVjdCwgdGhlIHN0YXRlIG9mIGl0cyBzZWxlY3Rpb24gZmxvd3MgdGhyb3VnaCBhbmQgd2l0aCBhbnkgc3Vic2VxdWVudCBzZWxlY3Rpb25zLiBTbyBmb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSBhIFJvb3QgQWN0aW9uIHJ1bGUsIGFuZCB0aGVuIGRvIGEgc2VsZWN0aW9uIGJhc2VkIG9uIGl0LCB3ZSdsbCBoYXZlIGFjY2VzcyB0byB0aGUgYWdlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCBhcyB3ZWxsIGFzIGFsbCBvZiB0aGUgc3Vic2VxdWVudCBzZWxlY3Rpb25zLiBXZSBjYW4gcmVmZXIgdG8gYW55IHByZXZpb3VzIHNlbGVjdGlvbiBmb3IgYW55IHN1YnNlcXVlbnQgYWN0aW9uLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBzZXR0aW5nIHRoZSB2YWx1ZSBmb3IgdGhlIHJ1bGUgYWdlbnQsIHdlIG1pZ2h0IGluc3RlYWQgc2V0IGEgdmFsdWUgZm9yIGFuIGFnZW50IHdlJ3ZlIGZvdW5kIGluIGEgdGFyZ2V0IHNlbGVjdGlvbi48L3RkPgorCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmdTZXRBbm90aGVyLnBuZyI+PC9kaXY+CisJCQkJCQkJCis8L3RkPgorCQkJCQkJCis8L3RyPgorPC90YWJsZT4KKzx0YWJsZSBpZD0iTjEwM0FCIj4KKzx0cj4KKwkJCQkJCQkKKzx0ZD5JbnB1dHMgdG8gZnVuY3Rpb25zIGFsc28gdXNlIHNlbGVjdGlvbnMuIChXZSdsbCBkaXNjdXNzIG1vcmUgZGV0YWlscyBpbiB0aGUgZnVuY3Rpb25zIHNlY3Rpb24uKSBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdlJ3JlIGFkZGluZyB0aGUgd2VhbHRoIG9mIHRoZSBTZWxlY3Rpb24gMSBhZ2VudCB0byB0aGUgd2VhbHRoIG9mIHRoZSBTZWxlY3Rpb24gMiBhZ2VudCBhbmQgdXNpbmcgdGhhdCB2YWx1ZSB0byBzZXQgc29tZSBvdGhlciB2YWx1ZS4gKEhlcmUsIHBlcmhhcHMgd2UgYXJlIG1vZGVsaW5nIGFuIGFnZW50IGluIGEgd2lubmVyIHRha2VzIGFsbCBnYW1lLCBpbiB3aGljaCBjYXNlIHdlJ2QgYWxzbyBhZGQgYSBTZXQgQWN0aW9uIG9uIFNlbGVjdGlvbiAyIGFuZCBzZXQgdGhlIHNlY29uZCBhZ2VudCdzIHdlYWx0aCB0byAwLik8L3RkPgorCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmdFdmFsdWF0ZS5wbmciPjwvZGl2PgorCQkJCQkJCQorPC90ZD4KKwkJCQkJCQorPC90cj4KKzwvdGFibGU+Cis8dGFibGUgaWQ9Ik4xMDNCRCI+Cis8dHI+CisJCQkJCQkJCis8dGQ+QnV0IHdlIGNhbiBhbHNvIHVzZSBzZWxlY3Rpb25zIGluIGRlZmluaW5nIFF1ZXJ5IEFjdGlvbnMgdGhlbXNlbHZlcy4gU28gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzZWxlY3QgYSBuZWlnaGJvciBhZ2VudCBhbmQgdGhlbiBjb21wYXJlIHRoZSBhZ2Ugb2Ygb3VyIFJ1bGUgYWdlbnQgd2l0aCB0aGUgYWdlIG9mIHRoZSBTZWxlY3Rpb24gMiBhZ2VudC4gSWYgYW5kIG9ubHkgaWYgdGhvc2UgYWdlcyBhcmUgdGhlIHNhbWUgd2lsbCB3ZSBleGVjdXRlIHRoZSB0YXJnZXQgU2V0IEFjdGlvbi4gVGhpcyBleGFtcGxlIGFsc28gZGVtb25zdHJhdGVzIHdoeSB3ZSByZWZlciB0byB0aGUgZGF0YSBmbG93IGFzIHdlYXZpbmcuIFF1ZXJ5IEFjdGlvbnMgY2FuIGJlIHVzZWQgdG8gcmVmaW5lIHNlbGVjdGlvbnMgYXQgYW55IHBvaW50IGluIHRoZSBkYXRhIGZsb3cuIFNlbGVjdGlvbnMgYW5kIHRoZWlyIHVzZXMgYXJlIGludGVyd292ZW4gdGhyb3VnaG91dCBhbiBhY3Rpb24gc2VxdWVuY2UuPC90ZD4KKwkJCQkJCQk8dGQ+CisJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9hY3Rpb25zL0FjdGlvbnNXZWF2aW5nMUEucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIGlkPSJOMTAzQ0YiPgorPHRyPgorCQkJCQkJCQorPHRkPkZpbmFsbHksIHdlIGNhbiBwdXQgYWxsIG9mIHRoZXNlIGNvbmNlcHRzIHRvZ2V0aGVyIGJ5IHdlYXZpbmcgc2VsZWN0aW9ucyB0b2dldGhlciB3aXRoIGZsb3dzLiBBcyB3ZSBkaXNjdXNzZWQgaW4gdGhlIGZsb3cgc2VjdGlvbiwgaWYgd2UgdXNlIG11bHRpcGxlIHBhdGhzIGluIHRoZSBRdWVyeSwgdGhlIGFnZW50cyB0aGF0IGZsb3cgdGhyb3VnaCBmcm9tIGFueSBwcmlvciBRdWVyeSBjYW4gZm9sbG93IG11bHRpcGxlIHBhdGhzIGF0IG9uY2UuIEFuZCBhcyB3ZSBkaXNjdXNzZWQgaW4gdGhlIHNlbGVjdGlvbiBzZWN0aW9uLCB0aGUgc2VsZWN0aW9uIGFuZCBpdHMgYm91bmRhcmllcyBkZXRlcm1pbmUgd2hhdCBhZ2VudHMgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGggYXQgYW55IGdpdmVuIGV2YWx1YXRpb24gcG9pbnQgaW4gdGhlIGZsb3cuIENvbnNpZGVyIHRoZSBleGFtcGxlIHRvIHRoZSByaWdodC4gQXMgd2UnbGwgc2VlIGluIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBlYWNoIEFjdGlvbiBiZWxvdywgVHJhbnNmb3JtYXRpb24gQWN0aW9ucyBzdWNoIGFzIE1vdmUgb3IgQ29ubmVjdCB0YWtlIG11bHRpcGxlIHNlbGVjdGlvbnMuIFRoZSBmaXJzdCBzZWxlY3Rpb24gZGVmaW5lcyB0aGUgc2V0IG9mIGFnZW50cyB0aGF0IHdpbGwgYmUgcGVyZm9ybWluZyB0aGUgYWN0aW9uLiBJbiB0aGUgY2FzZSBvZiBhIE1vdmUgYWdlbnQsIHRoaXMgcmVmZXJzIHRvIHRoZSBtb3Zlci4gVGhlIHNlY29uZCBzZWxlY3Rpb24sIHdoaWNoIGZvciBNb3ZlIHdlIGNhbGwgImRlc3RpbmF0aW9uIiwgcmVmZXJzIHRvIHRoZSBzZWxlY3Rpb24gdGhhdCB3aWxsIGJlIHJlY2VpdmluZyB0aGUgYWN0aW9uLiBJbiB0aGUgY2FzZSBvZiBtb3ZlbWVudCB0aGlzIGlzIHRoZSBhZ2VudCBvciBsb2NhdGlvbiB0aGF0IHRoZSBSdWxlIGFnZW50IHdpbGwgYmUgbW92aW5nIHRvLiBJZiB3ZSBmb2xsb3cgdGhlIGZsb3dzIHRocm91Z2gsIHdlIGNhbiBub3RlIHR3byBpbXBvcnRhbnQgb3V0Y29tZXMgb2Ygb3VyIG1vZGVsIGRlc2lnbiAtLSBhIFJ1bGUgYWdlbnQgbWlnaHQgbW92ZSB0d2ljZSBpZiBpdCBtZWV0cyB0aGUgY3JpdGVyaWEgZm9yIGJvdGggdGhlIGJsdWUgcGF0aCBhbmQgdGhlIHJlZCBwYXRoIGFuZCB0aGF0IGl0IG1pZ2h0IG1vdmUgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gZWFjaCB0aW1lLjwvdGQ+CisJCQkJCQkJPHRkPgorCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZzIucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEZXRhaWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGV0YWlsc18zIj48L2E+RGV0YWlsczwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8dGFibGUgaWQ9Ik4xMDNFNSI+Cis8dHI+CisJCQkJCQkKKzx0ZD5JbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGRpZyBpbnRvIHRoZSBzcGVjaWZpYyByb2xlIG9mIGVhY2ggb2YgdGhlIEFjdGlvbnMuIEZyb20gdGhlIGRlc2lnbiBkaXNjdXNzaW9uIHdlIGhvcGVmdWxseSBoYXZlIHNvbWUgc2Vuc2Ugb2YgaG93IHRoZXNlIGFsbCBmaXQgdG9nZXRoZXIgaW4gZ2VuZXJhbC4gQWdhaW4sIHRoZSBibG9jayBkaWFncmFtIHRvIHRoZSByaWdodCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBob3cgdGhlIHZhcmlvdXMgYWN0aW9ucyBhcmUgcmVsYXRlZCwgYnV0IGl0IGlzIG1pc3Npbmcgc29tZSBvZiB0aGUgbW9yZSByZWNlbnQgYWN0aW9ucyBzdWNoIGFzIERpZmZ1c2lvbiwgUGVyZm9ybSwgRGVyaXZlIGFuZCBDYXVzZS4gWW91IG1pZ2h0IHdhbnQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIG1ldGEtY2xhc3MgZGlhZ3JhbXMgaW4gdGhlIHJlZmVyZW5jZSBzZWN0aW9uIGFzIHdlbGwuPC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zQmxvY2tzLnBuZyI+PC9kaXY+IAorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25zXzIiPjwvYT5TZWxlY3Rpb25zPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgc2VsZWN0aW9uIGRlZmluZXMgYSBwYXJ0aWN1bGFyIHNldCBvZiBhZ2VudHMgdGhhdCB3ZSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoLiBTZWxlY3Rpb25zIGFyZSBtYWRlIHVwIG9mIHRoZSBTZWxlY3QgYWN0aW9uIGl0c2VsZiwgYWxvbmcgd2l0aCBRdWVyeSBhbmQgTG9naWMgYWN0aW9ucy4gV2hlbiB3ZSByZWZlciB0byBhIHNlbGVjdGlvbiBpbiBhbnkgdGFyZ2V0IGNvbW1hbmQsIHdlIGFyZSByZWZlcnJpbmcgdG8gdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGV4dCBvZiB3aGVyZSB3ZSBoYXZlIGRlZmluZWQgdGhlIGJlaGF2aW9yLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3QiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3QiPjwvYT5TZWxlY3Q8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QXMgd2UgZGlzY3Vzc2VkIGFib3ZlLCB3aGVuIHdlIHJlZmVyIHRvIGEgU2VsZWN0LCB3ZSdyZSBhY3R1YWxseSByZWZlcnJpbmcgdG8gdGhlIHNlbGVjdGlvbiBhcyBhIHdob2xlIGxlYWRpbmcgdXAgdG8gdGhlIGN1cnJlbnQgYWN0aW9uLiBUaGUgU2VsZWN0IEFjdGlvbiBpdHNlbGYgaXMgdXNlZCB0byBkZWZpbmUgd2hhdCB3ZSBhcmUgc2VhcmNoaW5nIGZvciAoQWdlbnQpLCB3aGVyZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpdCAoU3BhY2UpLCBhbmQgZnJvbSB3aG9zZSBwZXJzcGVjdGl2ZSB3ZSBhcmUgZG9pbmcgaXQgKFNlbGVjdGlvbikuIENyZWF0ZSBBY3Rpb25zIGFyZSBhIHNwZWNpYWwga2luZCBvZiBTZWxlY3QgQWN0aW9uIHRoYXQgYXJlIHVzZWQgdG8gY3JlYXRlIGFnZW50cy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgQnVpbGRlcnMgc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2VsZWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2VsZWN0aW9uIj48L2E+U2VsZWN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBzZWxlY3Rpb24gdGhhdCB3ZSBhcmUgc2VhcmNoaW5nICJmcm9tIi4gVGhpcyBzZWVtcyB0byBiZSB0aGUgY29uY2VwdCB0aGF0IG5ldyB1c2VycyBoYXZlIHRoZSBtb3N0IGRpZmZpY3VsdHkgd2l0aCwgYnV0IGl0IGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyBBY3Rpb25zIHdvcmtzLiBKdXN0IGFzIHdpdGggYW55IG90aGVyIEFjdGlvbiAtLSBhIE1vdmUgY29tbWFuZCBmb3IgZXhhbXBsZSAtLSBhIHNlbGVjdGlvbiBuZWVkcyB0byBrbm93IHdoYXQgc2V0IG9mIGFnZW50cyB0aGF0IGl0IGlzIHdvcmtpbmcgd2l0aC4gRm9yIGV4YW1wbGUsIGlmIHdlIHdhbnQgdG8gZGVmaW5lIGEgc2VsZWN0aW9uIEIgdGhhdCBmaW5kcyB0aGUgY2VsbHMgbmVpZ2hib3JpbmcgYSBydWxlIEIncyBhZ2VudCwgd2Ugd291bGQgc2V0IHNlbGVjdGlvbiBCJ3Mgc2VsZWN0aW9uIHRvIEEuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBZ2VudCI+PC9hPkFnZW50PC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkhlcmUgd2UgZGVmaW5lIHdoYXQgYWdlbnQgd2Ugd2lsbCBiZSBsb29raW5nIGZvci4gSW4gb3JkZXIgZm9yIHRoaXMgdG8gbWFrZSBzZW5zZSwgdGhlIGFnZW50IGhhcyB0byBiZSByZWxhdGVkIGluIHNvbWUgbWVhbmluZ2Z1bCB3YXkgdG8gdGhlIGFnZW50IHdob3NlIGJlaGF2aW9yIHdlIGFyZSBkZWZpbmluZy4gRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IGJlIGEgcGFydG5lciBhZ2VudCBvciBhIGxvY2F0aW9uIHRoYXQgd2UgbWlnaHQgd2FudCB0byBtb3ZlIHRvLiBBbiBhZ2VudCBtdXN0IGJlIHNwZWNpZmllZCB1bmxlc3Mgd2UgYXJlIHNlYXJjaGluZyB3aXRoaW4gYSBjb250aW51b3VzIHNwYWNlLCBpbiB3aGljaCBjYXNlIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0aW9uIHdpbGwgcmVwcmVzZW50IHNvbWUgbG9jYXRpb24gaW4gdGhhdCBzcGFjZS4gSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrLCB3ZSB0cmVhdCBkZXN0aW5hdGlvbiBjZWxsIGxvY2F0aW9ucyBhcyBhZ2VudHMsIGFuZCByZXF1aXJlIHRoYXQgbG9jYXRpb24gdG8gYmUgc3BlY2lmaWVkIGFzIGEgdGFyZ2V0IGFnZW50LCBidXQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3ZSdsbCBhbGxvdyBzZWFyY2hlcyB3aXRob3V0IGRlZmluaW5nIGFuIGFnZW50IHdpdGhpbiBncmlkIHNwYWNlcyBhcyB3ZWxsLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYWNlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU3BhY2UiPjwvYT5TcGFjZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgc3BhY2UgdGhhdCB3ZSB3YW50IHRvIHNlYXJjaCB3aXRoaW4uIE9mIGNvdXJzZSwgdGhpcyBtdXN0IGJlIHNwZWNpZmllZCBpZiB3ZSB1c2UgYW55IHNwYXRpYWwgcXVlcnkgdGVybXMgKHNlZSBiZWxvdyksIGJ1dCBpZiB3ZSBzaW1wbHkgd2FudCB0byBzZWFyY2ggYWNyb3NzIGFsbCBhZ2VudHMgaXQgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuPC9wPgorPHA+UmVwcmVzZW50IFF1ZXJpZXMgKENvbnRyb2xzKSBvbiBhZ2VudHMgYW5kIFRyYW5zZm9ybWF0aW9ucywgb3IgQ29tbWFuZHMsIG9uIHRoZSByZXN1bHQgb2YgdGhvc2UgcXVlcmllcy4gUXVlcmllcywgVHJhbnNmb3JtYXRpb25zIGFuZCBvdGhlciAgaW4gd2hpY2ggZWFjaCBjaGlsZCB0YXJnZXQgY2FycmllcyB0aGUgZXhlY3V0aW9uIGFuZCBkYXRhIGNvbnRleHQgZm9yIGl0J3MgcGFydGljdWxhciBwYXRoLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZvciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZvciI+PC9hPkZvcjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGlzIHZhbHVlIGlzIG9ic29sZXRlIGFuZCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgbWVjaGFuaXNtIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIG1vZGVsaW5nIGVudmlyb25tZW50LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUXVlcnkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJRdWVyeSI+PC9hPlF1ZXJ5PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgUXVlcnkgcmVwcmVzZW50cyBhIGNvbmNyZXRlIGNyaXRlcmlhIGZvciBvdXIgc2VhcmNoLiBUaGUgbmFtZSBpcyBhIGJpdCBjb25mdXNpbmcgYmVjYXVzZSBvZiBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbiB3aXRoIGEgZ2VuZXJpYyBxdWVyeS4gUXVlcmllcyAtLSBhbG9uZyB3aXRoIHRoZWlyIGNvdXNpbiBFdmFsdWF0b3JzIC0tIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGFuZCB0aGF0IGNhbiB0YWtlIEFnZW50IGF0dHJpYnV0ZXMgYW5kIHRoZSByZXN1bHRzIG9mIG90aGVyIEFjdGlvbnMgYXMgaW5wdXQuIFF1ZXJpZXMgYXJlIGNvbWJpbmVkIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCB0aGUgbG9naWMgYWN0aW9ucyB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdHMgb2YgYSBzZWxlY3Rpb24gZm9yIHRoZWlyIGRpcmVjdCB0YXJnZXQgYWN0aW9ucy4gPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNlbGVjdGlvbl8yIj48L2E+U2VsZWN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFzIHdpdGggYWxsIG90aGVyIGFjdGlvbnMsIGV2YWx1YXRpb25zIHNwZWNpZnkgYSBzZWxlY3Rpb24sIGFuZCBqdXN0IGFzIHdpdGggdGhlIG90aGVyIGFjdGlvbnMsIHRoaXMgZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGFnZW50cyB0aGF0IHRoZSBldmFsdWF0aW9uIG9jY3VycyBmb3IsIGJ1dCB0aGUgaW5wdXQgc2VsZWN0aW9ucyBkZXRlcm1pbmUgd2hhdCBhZ2VudCBpcyB1c2VkIGZvciB0aGUgY2FsY3VsYXRpb24gaXRzZWxmLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZ1bmN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRnVuY3Rpb24iPjwvYT5GdW5jdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHF1ZXJ5IGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdHMgb2YgYSBwYXJ0aWN1bGFyIHNlbGVjdGlvbi4gRnVuY3Rpb25zIGNhbiByZXByZXNlbnQgdmVyeSBzaW1wbGUgc2VhcmNoIGNyaXRlcmlhIHN1Y2ggYXMgIk15IEFnZSA9PSBZb3VyIEFnZSIsIGJ1dCB0aGV5IGNhbiBhbHNvIHJlcHJlc2VudCBjb21wbGV4IGFuZCBpbnRlci1yZWxhdGVkIGNvbmNlcHRzIHN1Y2ggYXMgc3BhdGlhbCByZWxhdGlvbnNoaXBzLiBUaGV5IG11c3QgcmV0dXJuIGxvZ2ljYWwgdmFsdWVzLiBTZWUgdGhlIGZ1bmN0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNwZWNpZmljIGZ1bmN0aW9ucy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJbnB1dHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJJbnB1dHMiPjwvYT5JbnB1dHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNldCBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZS4gSW5wdXRzIGNhbiBzcGVjaWZ5IGFueSBzb3VyY2UgZXZhbHVhdGlvbiBhbmQgYW55IGFnZW50IHN0YXRlIG9yIGFnZW50IHBhcmVudCBjb250ZXh0IHN0YXRlLiBUaGV5IGNhbiBhbHNvIGJlIGxpdGVyYWwgdmFsdWVzIC0tIHNlZSB0aGUgc2VjdGlvbiBvbiBsaXRlcmFscyBiZWxvdy4gVGhlIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHdoaWNoIGFnZW50J3Mgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsdWUsIGFuZCBkaWZmZXJlbnQgaW5wdXRzIGNhbiBzcGVjaWZ5IGRpZmZlcmVudCBzZWxlY3Rpb25zLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTG9naWMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMb2dpYyI+PC9hPkxvZ2ljPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZXNlIEFjdGlvbnMgcHJvdmlkZSB1cyB3aXRoIHRoZSBhYmlsaXR5IHRvIGNvbWJpbmUgcXVlcmllcyB3aXRoIG9uZSBhbm90aGVyLCBhbmQgZm9sbG93IHRoZSBiYXNpYyBydWxlcyBvZiBzZXQgbG9naWMuIEJ1dCBhcyB3ZSd2ZSBzZWVuIGFib3ZlLCBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZXJlIGFyZSBpbXBvcnRhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBMb2dpYyBBY3Rpb25zIGFuZCB0eXBpY2FsIHByb2dyYW1taW5nIGxvZ2ljLiBNb3N0IGltcG9ydGFudGx5LCB0aGV5IGFwcGx5IG5vdCB0byBpbmRpdmlkdWFsIGFnZW50cyBwZXIgc2UsIGJ1dCB0byB0aGUgc2V0IG9mIGFnZW50cyB0aGF0IG1vdmUgdGhyb3VnaCB0aGVtLiBBbHNvLCB0aGVyZSBpcyBub3QgbmVjY2VzYXJpbHkgc2hvcnQgY2lyY3VpdCBleGVjdXRpb24gKGl0J3Mgbm90IG5lZWRlZCkgYW5kIG11Y2ggcmljaGVyIGNyaXRlcmlhIGNhbiBiZSBqb2luZWQgdG9nZXRoZXIgYmVjYXVzZSBvZiB0aGUgYWN0aW9uIGZsb3cgZGVzaWduLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkludGVyc2VjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkludGVyc2VjdGlvbiI+PC9hPkludGVyc2VjdGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BbiBpbnRlcnNlY3Rpb24gY29udGFpbnMgb25seSB0aG9zZSBhZ2VudHMgdGhhdCBtYXRjaCBhbGwgb2YgaXRzIHNvdXJjZSBhY3Rpb25zLiBUaGlzIGlzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYSBsb2dpY2FsIEFORCBzdGF0ZW1lbnQgYW5kIGhhcyBzaW1pbGFyaXRpZXMgdG8gYW4gJmFtcDsmYW1wOyBvcGVyYXRvciBpbiBhIGphdmEgImlmIiBzdGF0ZW1lbnQuIEFuIGFnZW50IG11c3QgYmUgYWJsZSB0byBmbG93IHRocm91Z2ggYWxsIGluY29taW5nIGFjdGlvbnMgaW4gb3JkZXIgdG8gZmxvdyBvdXQgb2YgYW4gSW50ZXJzZWN0aW9uIEFjdGlvbi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJVbmlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlVuaW9uIj48L2E+VW5pb248L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSB1bmlvbiBjb250YWlucyBhbGwgYWdlbnRzIHRoYXQgbWF0Y2ggYW55IG9mIGl0cyBzb3VyY2UgYWN0aW9ucy4gVGhpcyBzaGFyZXMgc2ltaWxpYXJpdGllcyB0byBhIGxvZ2ljYWwgT1Igc3RhdGVtZW50IGFuZCB0aGUgfHwgb3BlcmF0b3IgaW4gYSBqYXZhICJpZiIgc3RhdGVtZW50LiBJdCBkb2VzIG1yb2UgdGhhbiB0aGF0IGhvd2V2ZXIsIGFzIGl0IGFjdHMgdG8gam9pbiBtdWx0aXBsZSBmbG93cyBvZiBhY3Rpb24uIFRoYXQgaXMsIGFzIHNldCBsb2dpYyBpbXBsaWVzLCBhbiBhZ2VudCB3aWxsIG5ldmVyIGFwcGVhciBpbiB0aGUgcmVzdWx0IG9mIGEgdW5pb24gbW9yZSB0aGFuIG9uY2UuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlmZmVyZW5jZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRpZmZlcmVuY2UiPjwvYT5EaWZmZXJlbmNlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgZGlmZmVyZW5jZSBjb250YWlucyBhbGwgYWdlbnRzIHRoYXQgZG8gbm90IG1hdGNoIGFueSBvZiBpdHMgc291cmNlIGFjdGlvbnMuIFRoaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBhIGxvZ2ljYWwgTk9UIHN0YXRlbWVudCwgYW5kIGhhcyBzaW1pbGFyaXRpZXMgdG8gdGhlIEphdmEgZWxzZSBzdGF0ZW1lbnQuIExpa2UgdGhlIFVuaW9uIEFjdGlvbiwgZGlmZmVyZW5jZSBpbXBsaWVzIHRoYXQgYSBnaXZlbiBhZ2VudCB3aWxsIG9ubHkgYXBwZWFyIG9uY2UgaW4gYW55IHN1YnNlcXVlbnQgdGFyZ2V0cy4gTm8gYWdlbnRzIHRoYXQgcmVhY2ggYSBEaWZmZXJlbmNlIEFjdGlvbiB3aWxsIGZsb3cgdGhyb3VnaCB0byB0aGUgbmV4dCBhY3Rpb24ocyksIGFuZCBhbGwgYWdlbnRzICh0aGF0IG1lZXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIFNlbGVjdCBBY3Rpb24pIHRoYXQgY2Fubm90IHJlYWNoIHRoYXQgYWN0aW9uIHdpbGwuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJSb290IEFjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSb290X0FjdGlvbnMiPjwvYT5Sb290IEFjdGlvbnM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Um9vdCBhY3Rpb25zIGFyZSBhIHNwZWNpYWwgY2FzZSBvZiBhIHNlbGVjdGlvbi4gVGhlc2UgcmVwcmVzZW50IGJlaGF2aW9ycyB0aGF0IGFyZSBkZWZpbmVkIGZvciBhbGwgbWVtYmVycyBvZiBhZ2VudHM7IHRoZXNlIGFyZSB0aGUgaGlnaGVzdCBncmFudWxhcml0eSBvZiBhbiBhZ2VudCdzIGJlaGF2aW9yLCBzdWNoIGFzICJGaW5kIFBhcnRuZXJzIiBvciAiRWF0IiBvciAiUmVwcm9kdWNlIi4gV2hlbiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgc2V0IG9mIEFjdGlvbnMsIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgY2hvaWNlcy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQnVpbGQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCdWlsZCI+PC9hPkJ1aWxkPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBCdWlsZCBBY3Rpb24gaXMgYSBzcGVjaWFsaXplZCBhY3Rpb24gdGhhdCBhbGxvdyB0aGUgY29uc3RydWN0aW9uIG9mIG1lbWJlciBhZ2VudHMgYW5kIHNwYWNlcyB3aXRoaW4gYSBwYXJlbnQgY29udGV4dC4gQSBCdWlsZCBBY3Rpb24gZXhlY3V0ZXMgb25jZSBmb3IgZWFjaCBjb250ZXh0IGJlZm9yZSBhbnkgaW5pdGlhbGl6YXRpb24gYWN0aW9ucyBvY2N1ciBmb3IgYW55IGNoaWxkcmVuIGFnZW50cyBvZiB0aGF0IGNvbnRleHQuIEN1cnJlbnRseSBpdCBpcyB1bmRlZmluZWQgd2hldGhlciBhIGNvbnRleHQncyBvd24gSW5pdGlhbGl6ZSBBY3Rpb24gaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBCdWlsZCBBY3Rpb24gb2NjdXJzLCBzbyBpbXBsZW1lbnRvcnMgc2hvdWxkIG5vdCByZWx5IG9uIGFueSBpbml0aWFsaXplZCB2YWx1ZXMgYmVpbmcgYXZhaWxhYmxlIGF0IGJ1aWxkIHRpbWUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5pdGlhbGl6ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkluaXRpYWxpemUiPjwvYT5Jbml0aWFsaXplPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFuIEluaXRpYWxpemUgYWN0aW9uIGlzIGV4ZWN1dGVkIG9uY2UgYW5kIG9ubHkgb25jZSBmb3IgZXZlcnkgYWdlbnQgd2hlbiB0aGUgbW9kZWwgaXMgZmlyc3Qgc3RhcnRlZCAtLSBhdCB0aW1lIDAuIEluaXRpYWxpemUgQWN0aW9ucyBhcmUgZ3VhcmFudGVlZCB0byBleGVjdXRlIGJlZm9yZSBhbnkgb3RoZXIgbm9uLWJ1aWxkZXIgYWN0aW9uIG9jY3Vycy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJSdWxlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUnVsZSI+PC9hPlJ1bGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBSdWxlIGV4ZWN1dGVzIG9uY2UgZm9yIGV2ZXJ5IGFnZW50IGZvciBldmVyeSBpdGVyYXRpb24gb2YgdGhlIG1vZGVsLiBBbiBpbXBvcnRhbnQgbm90ZSBpcyB0aGF0IHRoZSBhY3R1YWwgc2VxdWVuY2Ugb2YgcnVsZXMgaXMgdGVjaG5pY2FsbHkgdW5kZWZpbmVkLiBBbiBpbXBsZW1lbnRvciBzaG91bGQgbm90IHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhIHJ1bGUgb2NjdXJzIGJlZm9yZSBhbm90aGVyIHJ1bGUgaW4gdGhlIGxpc3Qgb2YgYWdlbnQgYWN0aW9ucyB0aG91Z2ggdHlwaWNhbGx5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgcnVsZXMgd2VyZSBhY3R1YWxseSBjcmVhdGVkIGlzIHJlc3BlY3RlZC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTY2hlZHVsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNjaGVkdWxlIj48L2E+U2NoZWR1bGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBzY2hlZHVsZSBpcyBleGVjdXRlZCBvbiBhIHJlY3VycmluZyBiYXNpcywgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZXMgZGV0YWlsZWQgYmVsb3cuIE5vdGUgdGhhdCBzY2hlZHVsZXMgYXJlIG9mdGVuIG92ZXJ1c2VkLiBJbiBtb3N0IGFnZW50LWJhc2VkIG1vZGVscyBpdCBtYWtlcyBzZW5zZSB0byBoYXZlIGFueSBiZWhhdmlvcnMgb2NjdXIgYXQgdGhlIHNhbWUgZ3JhbnVsYXJpdHkgdXNpbmcgYSBSdWxlLiBQbGVhc2Ugbm90ZSB0aGF0IFNjaGVkdWxlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIEVzY2FwIHRhcmdldCwgYnV0IHRoYXQgc3VwcG9ydCBzaG91bGQgYmUgYXZhaWxhYmxlIHNvb24uIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zIHdlIHJlZmVyIHRvIHBlcmlvZCBhcyB0aGUgY3VycmVudCBpdGVyYXRpb24gb2YgdGhlIG1vZGVsLCB0aGF0IGlzIHdoZXJlIHRpbWUgPT0gdC48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3RhcnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdGFydCI+PC9hPlN0YXJ0PC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBwZXJpb2QgdGhhdCB0aGUgc2NoZWR1bGUgd2lsbCBmaXJzdCBiZSBpbnZva2VkLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyB2YWx1ZSBpcyAxMDAsIGFuZCBpbnRlcnZhbCBpcyAxLCB0aGUgc2NoZWR1ZSB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRpbWVzIDEwMCwxMDEsMTAyLi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJbnRlcnZhbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkludGVydmFsIj48L2E+SW50ZXJ2YWw8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SG93IG9mdGVuIHRoZSBzY2hlZHVsZSBpcyBpbnZva2VkLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyB2YWx1ZSBpcyAzIGFuZCBzdGFydCBpcyAxLCB0aGUgc2NoZWR1bGUgd2lsbCBiZSBleGVjdXRlZCBhdCB0aW1lcyAxLDQsNy4uPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUHJpb3JpdHkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJQcmlvcml0eSI+PC9hPlByaW9yaXR5PC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPldoZXJlIHRoZSBydWxlIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBleGVjdXRpb24gcXVldWUgZm9yIGEgZ2l2ZW4gdGltZSBwZXJpb2QuIEZvciBleGFtcGxlLCBpZiBTY2hlZHVsZSBBJ3MgcHJpb3JpdHkgaXMgc2V0IHRvIDMgYW5kIFNjaGVkdWxlIEIncyBpcyBzZXQgdG8gMiwgU2NoZWR1bGUgQiB3aWxsIGJlIGV4ZWN1dGVkIGZvciBhbGwgYWdlbnRzIGJlZm9yZSBTY2hlZHVsZSBCIGlzIGV4ZWN1dGVkIGZvciBhbnkgYWdlbnRzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlBpY2siPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJQaWNrIj48L2E+UGljazwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Db250cm9scyBob3cgbWFueSBhZ2VudHMgdG8gZXhlY3V0ZSB0aGUgc2NoZWR1bGUgYWdhaW5zdC4gV2hpbGUgdGhpcyB2YWx1ZSB3aWxsIGhhdmUgYW4gZWZmZWN0IG9uIHRoZSBSZXBhc3QgdGFyZ2V0LCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBmb3IgZ2VuZXJhbCBtb2RlbHMgYW5kIGlzIGxpa2VseSB0byBiZSByZXBsYWNlZCBieSBhbm90aGVyIGFwcHJvYWNoLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iV2F0Y2giPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJXYXRjaCI+PC9hPldhdGNoPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgV2F0Y2ggaXMgZXhlY3V0ZWQgYW55IHRpbWUgdGhlIHdhdGNoZWQgdmFsdWUgaXMgc2V0IGZvciBhbnkgYWdlbnQuIE5vdGUgdGhhdCB0aGUgQWN0aW9uIHdpbGwgYmUgdHJpZ2dlcnJlZCBldmVuIGlmIHRoZSBzdGF0ZSBpcyBzaW1wbHkgc2V0IGJhY2sgdG8gdGhlIHZhbHVlIHRoYXQgaXQgYWxyZWFkeSBoYXMuIEl0IGlzIGltcG9ydGFudCB0byBiZSBjYXJlZnVsIGFib3V0IGNyZWF0aW5nIFdhdGNoZXMgdGhhdCBtaWdodCBzZXQgdGhlIHZhbHVlcyBvZiBvdGhlciBXYXRjaCBhY3Rpb25zIHdoaWNoIG1pZ2h0IGluIHR1cm4gdHJpZ2dlciB0aGlzIHdhdGNoLiBUbyBjbGFyaWZ5LCBpZiBhIG1vZGVsZXIgY3JlYXRlcyBhIFdhdGNoIEEgZm9yIGF0dHJpYnV0ZSBhLCBhbmQgY3JlYXRlcyBhIHRhcmdldCBTZXQgZm9yIGl0IGZvciBhdHRyaWJ1dGUgYiwgYW5kIFdhdGNoIEIgaXMgd2F0Y2hpbmcgYXR0cmlidXRlIGIsIHRoZW4gaWYgV2F0Y2ggQiBoYXMgYSB0YXJnZXQgU2V0IGZvciBhdHRyaWJ1dGUgQSwgYSBjaXJjdWxhciBleGVjdXRpb24gY291bGQgb2NjdXIuIFRoaXMgd291bGQgY2F1c2UgdGhlIG1vZGVsIHRvIGdldCBzdHVjayBpbiBpdHMgY3VycmVudCBpdGVyYXRpb24uIFRvIGhlbHAgbW9kZWwgZGV2ZWxvcGVycyBhdm9pZCB0aGlzIGNhc2UsIGEgd2FybmluZyB3aWxsIGJlIHByb3ZpZGVkIGlmIHN1Y2ggYSBzZXQgb2YgY2lyY3VsYXIgd2F0Y2ggZGVwZW5kZW5jaWVzIGlzIGNyZWF0ZWQuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkF0dHJpYnV0ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkF0dHJpYnV0ZSI+PC9hPkF0dHJpYnV0ZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYXR0cmlidXRlIHRoYXQgd2lsbCBiZSBtb25pdG9yZWQgZm9yIGNoYW5nZS48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlcml2ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRlcml2ZSI+PC9hPkRlcml2ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIERlcml2ZSBhY3Rpb24gaXMgYSB1bmlxdWUga2luZCBvZiByb290IHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCB2YWx1ZSBvZiBhIGRlcml2ZWQgYXR0cmlidXRlLiBUaGVyZSBjYW4gYmUgb25lIGFuZCBvbmx5IG9uZSBEZXJpdmUgYWN0aW9uIGZvciBlYWNoIHN1Y2ggYXR0cmlidXRlLiBPbmUgb2YgdGhlIGJlbmVmaXRzIG9mIGEgZGVyaXZlZCBhY3Rpb24gaXMgdGhhdCB1bmxpa2UgYSBzdGFuZGFyZCBhdHRyaWJ1dGUsIGl0IG9ubHkgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB3aGVuIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBuZWVkZWQgYW5kIGl0cyBpbnB1dHMgaGF2ZSBhbHNvIGJlZW4gY2hhbmdlcyAtLSBhbGxvd2luZyBzaWduaWZjYW50IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgdG8gYmUgbWFkZS4gRGVyaXZlZCBhY3Rpb25zIGNhbiBhbHNvIG1ha2UgbW9kZWwgYmVoYXZpb3IgbXVjaCBtb3JlIGNsZWFyLiBEZXJpdmUgYWN0aW9ucyBhcmUgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGNhbGN1bGF0aW5nIGRlcGVuZGVudCBtZWFzdXJlcyBmb3IgbW9kZWwgYWdlbnRzLiBUaGVzZSBpbiB0dXJuIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluIGNoYXJ0aW5nIGFuZCBkYXRhIG91dHB1dCB0b29scyAtLSBsZWF2aW5nIG5vIG5lZWQgdG8gY29uZmlndXJlIHlvdXIgY2hhcnQgdmlldyBjYWxjdWxhdGlvbnMgc2VwZXJhdGx5LiBEZXZlbG9wZXJzIG5lZWQgbm90IHdvcnJ5IGFib3V0IG92ZXJoZWFkIGFuZCBzaG91bGQgZmVlbCBmcmVlIHRvIGNyZWF0ZSBhcyBtYW55IGRlcml2ZWQgYXR0cmlidXRlcyBhcyBtaWdodCBiZSBuZWNjZXNzYXJ5LiBUaGUgImdhdGhlciBkYXRhIiB2YWx1ZSBvZiB0aGUgZGVyaXZlZCBhdHRyaWJ1dGUgY2FuIGFsd2F5cyBiZSBzZXQgdG8gZmFsc2UgdG8gcHJldmVudCBkYXRhIGNvbGxlY3Rpb24gb3ZlcmhlYWQgd2hlbiB0aGV5IGFyZW4ndCBuZWVkZWQuPC9wPgorPHA+VGhlIGRlcml2ZWQgdmFsdWUgd2lsbCBhbHdheXMgc2ltcGx5IGJlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBldmFsdWF0aW9uIGluIGEgcGFydGljdWxhciBmbG93LiBZb3UgY2FuIG1peCBxdWVyaWVzIGFuZCBldmVuIHNlbGVjdGlvbnMgb24gc2VwZXJhdGUgYWdlbnRzIGludG8gYSBkZXJpdmVkIHZhbHVlLiBUaGUgb25seSByZXN0cmljdGlvbiBpcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBsYXN0IEV2YWx1YXRlIGFjdGlvbnMocykgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuIElmIHRoZXJlIGlzIG5vIHBhdGggbGVhZGluZyB0byBhbiBFdmFsdXRhdGUgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgYWdlbnQgc3RhdGUsIHRoZSBhdHRyaWJ1dGVzIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBdHRyaWJ1dGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBdHRyaWJ1dGVfMiI+PC9hPkF0dHJpYnV0ZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYXR0cmlidXRlIHRoYXQgd2lsbCBiZSBkZXJpdmVkLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlmZnVzZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRpZmZ1c2UiPjwvYT5EaWZmdXNlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBkaWZmdXNlIGFjdGlvbiBwcm92aWRlcyBoaWdoIGxldmVsIHN1cHBvcnQgZm9yIHRoZSBjb21tb24gYmVoYXZpb3Igb2YgZGlmZnVzaW5nIHNvbWUgdmFsdWUgYWNyb3NzIHNvbWUgbGF0dGljZSBzcGFjZS4gRm9yIGV4YW1wbGUsIGhlYXQgbWF5IHNwcmVhZCBvdmVyIHRpbWUgZnJvbSBvbmUgZ3JpZCBjZWxsIHRvIHRoZSBuZXh0LiAoVGhlcmUgYXJlIGFjdHVhbGx5IHNpZ25pZmljYW50IGlzc3VlcyBpbnZvbHZlZCBpbiBpbXBsZW1lbnRpbmcgdGhpcyB0aHJvdWdoIGxvd2VyIGxldmVsIGFjdGlvbnMuKSBUbyBzcGVjaWZ5IHRoYXQgYSB2YWx1ZSBzaG91bGQgZGlmZnVzZSB0aHJvdWdoIGEgc3BhY2UgeW91IHNpbXBseSBuZWVkIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyB2YWx1ZXMuIFRoaXMgYWN0aW9uIGRvZXMgbm90IG5lZWQgYW5kIHNob3VsZG4ndCBpbmNsdWRlIHRhcmdldCBhY3Rpb25zLiBUaGUgIkhlYXRidWdzIiBtb2RlbCBpbiB0aGUgb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUgcHJvamVjdCBwcm92aWRlcyBhIGdvb2QgZXhhbXBsZSBmb3IgaG93IGRpZmZ1c2lvbiBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIGludG8gYW55IGdyaWQgbW9kZWwuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpZmZ1c2VkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlmZnVzZWQiPjwvYT5EaWZmdXNlZDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIHRvIGJlIGRpZmZ1c2VkLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpaWZmdXNpb24gUmF0ZT0iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaWlmZnVzaW9uX1JhdGUuM0QiPjwvYT5EaWlmZnVzaW9uIFJhdGU9PC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByYXRlIGF0IHdoaWNoIGFueSBnaXZlbiBjZWxsJ3MgYXR0cmlidXRlIHZhbHVlIGlzIHRyYW5zZmVycmVkIHRvIHN1cnJvdW5kaW5nIGNlbGxzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV2YXBvcmF0aW9uIFJhdGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFdmFwb3JhdGlvbl9SYXRlIj48L2E+RXZhcG9yYXRpb24gUmF0ZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BbiBvcHRpb25hbCByYXRlIGJ5IHdoaWNoIGVhY2ggY2VsbHMgdmFsdWUgaXMgcmVkdWNlZCBmb3IgZWFjaCBwZXJpb2QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIG1vZGVsIHdoZXJlIGFnZW50cyBhcmUgY3JlYXRpbmcgZW5lcmd5IHdpdGhpbiB0aGUgZW52aXJvbm1lbnQuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQZXJmb3JtIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUGVyZm9ybSI+PC9hPlBlcmZvcm08L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBQZXJmb3JtIHJvb3QgYWN0aW9uIHNpbXBseSBkZWZpbmVzIGEgc2V0IG9mIGFjdGlvbnMgdGhhdCBoYXZlIG5vIGluZGVwZW5kZW50IHRyaWdnZXIuIFRoZSBvbmx5IHdheSBQZXJmb3JtIGFjdGlvbnMgY2FuIG9jY3VyIGlzIGlmIGEgQ2F1c2UgYWN0aW9uIHNwZWNpZmVzIG9uZSBhcyBhIHJlc3VsdC4gUGVyZm9ybXMgdGhlbiBhcmUgc2ltaWxhciB0byBzdWItY2FsbHMgb3IgaGVscGVyIG1ldGhvZHMgd2l0aGluIGEgdHJhZGl0b25hbCBwcm9jZWR1cmFsIG9yIE9PIGxhbmd1YWdlLCBhbmQgY2FuIGJlIHZlcnkgaGVscGZ1bCBpbiBvcmdhbml6aW5nIGFuZCBzaW1scGxpZnlpbmcgY29kZS4gTm90ZSB0aGF0IHdoZW5ldmVyIHlvdSB1c2UgYSBQZXJmb3JtIGluc3RlYWQgb2YgZGlyZWN0bHkgc3BlY2lmeWluZyBhIHNldCBvZiB0YXJnZXRzIHlvdSBsb3NlIHRoZSBjb250ZXh0IG9mIHRoZSBzZWxlY3Rpb24uIFlvdSBjb3VsZG4ndCB1c2UgYSBQZXJmb3JtIHRvIGRpcmVjdGx5IHRyaWdnZXIgYSBtb3ZlIGFzIHRoZSBzZWxlY3Rpb24gc291cmNlIGZvciB0aGUgbW92ZSB3b3VsZCBub3QgYmUgYXZhaWxhYmxlLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQnVpbGRlcnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCdWlsZGVycyI+PC9hPkJ1aWxkZXJzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkJ1aWxkZXJzIGFyZSBhIHNwZWNpYWwgY2F0ZWdvcnkgb2YgYWN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSBzcGFjZXMuIFRoZXkgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRoZSBCdWlsZCBBY3Rpb24gaXRzZWxmIHdoaWNoIGlzIGEgcm9vdCBzZWxlY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSB0aW1lIGF0IHdoaWNoIGJ1aWxkZXIgYWN0aW9ucyBzaG91bGQgb2NjdXIuIEdlbmVyYWxseSBzcGVha2luZywgc3BlY2lmaWMgQnVpbGRlciBBY3Rpb25zIGZvciBzcGFjZXMgYW5kIENyZWF0ZSBBY3Rpb25zIGZvciBhZ2VudHMgYXJlIHRhcmdldHMgb2YgQnVpbGQgQWN0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRlIEFnZW50cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9BZ2VudHMiPjwvYT5DcmVhdGUgQWdlbnRzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFnZW50cyBhcmUgY3JldGUgdXNpbmcgdGhlIENyZWF0ZSBBZ2VudCBhY3Rpb24uIFRoZSBDcmVhdGUgQWdlbnQgQWN0aW9uIGlzIGFjdHVhbGx5IGEgc3BlY2lhbCBraW5kIG9mIFNlbGVjdCBBY3Rpb24gdGhhdCBpcyB1c2VkIHRvIGFjdHVhbGx5IGNyZWF0ZSBhZ2VudHMgcmF0aGVyIHRoYW4gc2ltcGx5IHNlYXJjaCBmb3IgdGhlbS4gT3RoZXIgdGhhbiB0aGlzIGNhcGFiaWxpdHksIGEgQ3JlYXRlIEFnZW50IGFjdGlvbiBjYW4gYmUgdXNlZCBqdXN0IGxpa2UgYW55IG90aGVyIGFjdGlvbiBleGNlcHQgdGhhdCBRdWVyeSBhbmQgTG9naWMgYWN0aW9ucyBhcmVuJ3QgbmVlZGVkIG9yIGdlbnJhbGx5IGFwcHJvcHJpYXRlIGFzIHRoaXMgYWN0aW9uIGRlZmluZXMgYSBzZXQgbnVtYmVyIG9mIGFnZW50cyB0byBwZXJmb3JtIGFuIGFjdGlvbiBhZ2FpbnN0LiBDcmVhdGUgQWdlbnQgYWN0aW9ucyBoYXZlIHRoZSBzcGVjaWFsIGZlYXR1cmUgb2YgYmVpbmcgdXNhYmxlIGZyb20gdGhlIGNvbnRhaW5pbmcgY29udGV4dCwgc28gdGhhdCBjb250ZXh0cyBjYW4gY3JlYXRlIGluaXRpYWwgYWdlbnQgcG9wdWxhdGlvbnMgYmVmb3JlIGFueSBhZ2VudHMgZXhpc3Qgd2l0aGluIHRoZSBjb250ZXh0IHRvIHBlcmZvcm0gYWN0aW9ucyBhZ2FpbnN0LiBCdXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbiBhZ2VudCBydWxlcywgZm9yIGV4YW1wbGUgdG8gY3JlYXRlIGEgY2hpbGQgYWdlbnQgYXMgdGhlIHJlc3VsdCBvZiBhIHJlcHJvZHVjYXRpb24gcnVsZS4gTm90ZSB0aGF0IEluaXRpYWxpemUgQWN0aW9ucyBhcmUgCisJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+bm90PC9zcGFuPiBwZXJmb3JtZWQgb24gYWdlbnRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aGluIGEgbW9kZWwgZHVyaW5nIHJlZ3VsYXIgKG5vbi1pbml0aWFsaXphdGlvbiB0aW1lKSBleGVjdXRpb24uIElmIHRoZSBtb2RlbCBjcmVhdGVzIGFjdGlvbnMgZHVyaW5nIHRoZSByZWd1bGFyIG1vZGVsIHJ1biwgYW55IHN0YXRlIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB0YXJnZXRzIG9mIHRoaXMgYWN0aW9uIGRpcmVjdGx5LiAoTmF0dXJhbGx5LCBpZiB0aGUgZW5jbG9zaW5nIGNvbnRleHQgaXMgdXNlZCB0byBjcmVhdGUgYWdlbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBtb2RlbCBydW4sIHRoZW4gdGhlIEluaXRpYWxpemUgYWN0aW9uIGlzIHVzZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIG1vZGVsIGxpZmUtY3ljbGUuKQorCQkJCQkJPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRfMiI+PC9hPkFnZW50PC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBraW5kIG9mIGFnZW50IHRvIGNyZWF0ZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fMyI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgc2VsZWN0aW9uIHRvIHVzZSBhcyB0aGUgYmFzaWMgZm9yIHRoaXMgc2VsZWN0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgaW1wb3J0YW50IGV4Y2VwdCB0byBkZWZpbmUgY29udHJvbCBmbG93LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYWNlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU3BhY2VfMiI+PC9hPlNwYWNlPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk5vdCBnZW5lcmFsbHkgcmVsZXZhbnQgZm9yIGFnZW50IGFjdGlvbnMsIGFzIGFnZW50cyBhcmUgbm90IHBsYWNlZCBpbnRvIGEgc3BhY2UgdW5sZXNzIGV4cGxpY2l0bHkgbW92ZWQgdG8gdGhhdCBzcGFjZS4gUG90ZW50aWFsIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGFnZW50cyBhbmQgc3BhY2VzIGFyZSBkZWZpbmVkIGJ5IHRoZSBzcGFjZSBidWlsZGluZyBhY3Rpb25zLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50IENvdW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRfQ291bnQiPjwvYT5BZ2VudCBDb3VudDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbnVtYmVyIG9mIGFnZW50cyB0byBjcmVhdGUuIElmIHVzZWQgYXMgcGFydCBvZiBhbiBlbmNsb3NpbmcgY29udGV4dCdzIEluaXRpYWxpemUgQWN0aW9uKHMpIGFuIEF0dHJpYnV0ZSBwYXJhbWV0ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQuIElmIG5vdCwgdGhlbiBhbiBldmFsdWF0aW9uIG9yIGFnZW50IGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgdGhpcyBudW1iZXIuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRm9yIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRm9yXzIiPjwvYT5Gb3I8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RGVwcmVjdGVkLiBTaG91bGQgbm90IGJlIHVzZWQuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgU2hhcGVkIEFnZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ3JlYXRlX1NoYXBlZF9BZ2VudCI+PC9hPkNyZWF0ZSBTaGFwZWQgQWdlbnQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q3JlYXRlcyBhbiBhZ2VudCB0aGF0IGhhcyBhIHBhcnRpY3VsYXIgc2hhcGUgZXh0ZW50IHdpdGhpbiBzb21lIGNvbnRpbnVvdXMgKGkuZS4gdmVjdG9yIGFzIG9wcG9zZWQgdG8gcmFzdGVyKSBzcGFjZS4gVGhpcyBhY3Rpb24gcGVyZm9ybXMganVzdCBsaWtlIGEgQ3JlYXRlIEFjdGlvbiBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaGFwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNoYXBlIj48L2E+U2hhcGU8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RGV0ZXJtaW5lcyBob3cgZWFjaCBhZ2VudCdzIHNwYXRpYWwgZXh0ZW50IHdpbGwgYmUgZGVmaW5lZC4gVGhlIGFjdHVhbCBmb3JtIG9mIHRoYXQgc2hhcGUgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuIEZvciBleGFtcGxlLCBpbiBhIEdJUyBzcGFjZSAodGhlIGltbWVkaWF0ZSByYXRpb25hbGUgZm9yIHRoaXMgQWN0aW9uKSBhIHBvbHlnb24gcmVwcmVzZW50cyBhIHJlZ2lvbiBvbiBhIG1hcCBhbmQgdGhlIGV4dGVudCBvZiB0aGF0IHNoYXBlIG1pZ2h0IGJlIGRldGVybWluZWQgYnkgYSAuc2hhcGUgZmlsZS4gVGhlIGF2YWlsYWJsZSBzaGFwZSB0eXBlcyBhcmU6PC9wPgorPGRpdiBjbGFzcz0idmFyaWFibGVsaXN0Ij4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJ0ZXJtIj5Qb2ludDwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5BIHNpbXBsZSBwb2ludCBpbiBzcGFjZSwgZnVsbHkgZXF1aXZhbGVudCB0byBhIHN0YW5kYXJkIGNvbnRpbnVvdXMgc3BhY2UgbG9jYXRpb24uPC9wPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJ0ZXJtIj5MaW5lPC9zcGFuPgorPC9kdD4KKzxkZD4KKzxwPkEgc2luZ2xlIGxpbmUgd2l0aGluIGEgY29udGludW91cyBzcGFjZS4gVGVjaG5pY2FsbHkgdGhpcyByZXByZXNlbnRzIGEgbGluZSBzZWdtZW50IGFzIGl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYSBiZWdpbm5pbmcgYW5kIGVuZGluZyBwb2ludC4gSW4gdGhlIGZ1dHVyZSwgdGhpcyBtaWdodCByZWZlciBtb3JlIGdlbmVyaWNhbGx5IHRvIHBsYW5lcyBpbiB0aHJlZSBkaW1lbnNpb25hbCBzcGFjZSBhbmQgaHlwZXJzdXJmYWNlcyBpbiBuLWRpbWVuc2lvbmFsIHNwYWNlcywgYnV0IHRoaXMgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgYW55IEFNRiB0YXJnZXQgaW1wbGVtZW50YXRpb25zLjwvcD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0idGVybSI+UG9seWdvbjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8cD5BIHJlZ2lvbiB3aXRoaW4gYSBzcGFjZSBkZWZpbmVkIGJ5IGFuIGFyYml0cmFyaWx5IGxhcmdlIHNldCBvZiBsaW5lIHNlZ21lbnRzLiBQb3RlbnRpYWxseSB0aGlzIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gcG9seWhlZHJvbnMgaW4gdGhyZWUtZGltZWVuc2lvbmFsIHNwYWNlLCBvciBldmVuIG1vcmUgZ2VucmFsbHkgYXMgcG9seXRvcGVzLCBidXQgdGhpcyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBhbnkgQU1GIHRhcmdldCBpbXBsZW1lbnRhdGlvbnMuPC9wPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTG9hZCBBZ2VudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMb2FkX0FnZW50cyI+PC9hPkxvYWQgQWdlbnRzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkltcG9ydHMgYW5kIGNyZWF0ZXMgYSBzZXQgb2YgYWdlbnRzIGZyb20gc29tZSBpbnB1dCBmaWxlLiBUaGUgYWN0dWFsIGZvcm0gYW5kIG1hbm5lciBvZiB0aGUgaW1wb3J0IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGJ1dCBzaG91bGQgYmUgaW5mZXJyYWJsZSBmcm9tIGFueSBzb3VyY2UgZmlsZSBiYXNlZCBvbiB0aGUgVVJMIHByb3ZpZGVkLCBhc3N1bWluZyB0aGF0IHRoZSB0YXJnZXQgcGxhdGZvcm0gb3IgdGhlIEFNRiBwbGF0Zm9ybSBzdXBwb3J0cyB0aGUgYXBwcm9wcmlhdGUgaW1wdXQgdHlwZS4gRm9yIGV4YW1wbGUsIGEgVGFiLUNSIGRlbGltaXRlZCBmaWxlIG1pZ2h0IGJlIHVzZWQgdG8gcG9wdWxhdGUgYSBzZXQgb2YgYWdlbnRzIHdpdGggdmFyaW91cyBhdHRyaWJ1dGVzLiBBZGRpdGlvbmFsIG1ldGEtZGF0YSBjb3VsZCBiZSBwcm92aWRlZCBieSB0aGUgVVJMLCBidXQgd2Ugd2lsbCBsaWtlbHkgYWRkIGFkZGl0aW9uYWwgZXh0ZW5zaWJsZSBtZXRhLWRhdGEgdG8gdGhpcyBhY3Rpb24gdG8gYmV0dGVyIHN1cHBvcnQgdGhlIGRlZmluaXRpb24gb2YgZXhwZWN0ZWQgaW5wdXQgdHlwZXMgYW5kIHJvdXRpbmVzIGZyb20gd2l0aGluIGFuIEFNRiBtb2RlbCBpdHNlbGYuIFRoaXMgYWN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIENyZWF0ZSBBZ2VudHMgYWN0aW9uIGV4Y2VwdCBmb3I6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNvdXJjZSBVUkwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTb3VyY2VfVVJMIj48L2E+U291cmNlIFVSTDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbG9jYXRpb24gb2YgdGhlIGlucHV0IGZpbGUgb3Igc2V0IG9mIG1ldGEtZGF0YSB1c2VkIHRvIGRldGVybWluZSB0aGUgbG9jYXRpb24gYW5kIHR5cGUgb2YgdGhlIGlucHV0IGZpbGUuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJMb2FkIFNoYXBlZCBBZ2VudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMb2FkX1NoYXBlZF9BZ2VudHMiPjwvYT5Mb2FkIFNoYXBlZCBBZ2VudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q29tYmluZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIENyZWF0ZSBTaGFwZWQgQWdlbnQgYW5kIExvYWQgQWdlbnQgQWN0aW9ucy4gVGhlIHNvdXJjZSB1cmwgc2hvdWxkIG9mIGNvdXJzZSBzcGVjaWZ5IGFuIGlucHV0IGZvcm1hdCB0aGF0IHN1cHBvcnRzIHRoZSBzaGFwZSB0eXBlIHNwZWNpZmllZC4gU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHJlbGF0ZWQgYWN0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkJ1aWxkIE5ldHdvcmsiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCdWlsZF9OZXR3b3JrIj48L2E+QnVpbGQgTmV0d29yazwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5DcmVhdGVzIGEgbmV0d29yaywgaS5lLiBhIGdyYXBoIHN0cnVjdHVyZSwgc3VwcG9ydGluZyB0aGUgZXN0YWJsaXNobWVudCBvZiBlZGdlcyBiZXR3ZWVuIGFyYml0cmFyeSBub2Rlcy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRzXzMiPjwvYT5BZ2VudHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U3BlY2lmaWVzIHRoZSBzZXQgb2YgYWdlbnRzIHRoYXQgY2FuIGV4aXN0IHdpdGhpbiB0aGlzIG5ldHdvcmsuIEFnZW50cyBtdXN0IGJlIGluY2x1ZGVkIGhlcmUgaW4gb3JkZXIgZm9yIHRoZW0gdG8gbWFrZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIG5ldHdvcmsgYnV0IGFnZW50cyBpbmNsdWRlZCBoZXJlIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIG5ldHdvcmssIG5vciBhcmUgc3VjaCBjb25uZWN0aW9ucyBjcmVhdGVkIGZvciB0aGVtLiAoU2VlIGltcG9ydGFudCBub3RlIHJlZ2FyZGluZyBuZXR3b3JrIHR5cGVzIGJlbG93Lik8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBdHRyaWJ1dGVzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQXR0cmlidXRlc18zIj48L2E+QXR0cmlidXRlczwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Ob3QgY3VycmVudGx5IHVzZWQgZm9yIG5ldHdvcmtzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik5ldHdvcmsgVHlwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5ldHdvcmtfVHlwZSI+PC9hPk5ldHdvcmsgVHlwZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5EZXByZWNhdGVkLiBUaGlzIGZlYXR1cmUgaXMgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBSZXBhc3QgdGFyZ2V0cyBhbmQgaXMgbGlrZWx5IHRvIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEFNRiBtZXRhLW1vZGVsLiBGdXR1cmUgQU1GIGltcGxlbWVudGF0aW9ucyBhcmUgbGlrZWx5IHdpbGwgcHJvdmlkZSBhIGRpZmZlcmVudCBtZWNoYW5pc20gZm9yIGluc3RhbnRpYXRpbmcgYW5kIGltcG9ydGluZyBuZXR3b3JrIHN0cnVjdHVyZXMgZWl0aGVyIHdpdGhpbiB0aGUgbmV0d29yayBkZWZpbnRpb24gb3IgdGhyb3VnaCBvdGhlciBBY3Rpb24gZGVmaW5pdGlvbnMuIEluc3RlYWQgb2YgdXNpbmcgdGhpcyBmZWF0dXJlLCBtb2RlbGVycyBzaG91bGQgY3JlYXRlIHNwZWNpZmljIG5ldHdvcmtzIGJ5IGJ1aWxkaW5nIHRoZW0gdXAgd2l0aCBDb25uZWN0IEFjdGlvbnMgZm9yIGluZGl2ZHVhbCBhZ2VudHMuIEZvciBleGFtcGxlIHRvIGNyZWF0ZSBhIHNtYWxsIHdvcmxkIG5ldG93cmssIGEgbW9kZWxlciBtaWdodCBjcmVhdGUgcmFuZG9tIGxpbmtzIGJldHdlZW4gYWdlbnRzIGFuZCB0aGVuIHJlcGxhY2Ugb3IgYXVnbWVudCB0aG9zZSBjb25uZWN0aW9ucy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fNCI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Ob3QgcmVsZXZhbnQgZm9yIG5ldHdvcmsgYnVpbGRlcnMgZXhjZXB0IGFzIHBhcnQgb2Ygbm9ybWFsIGNvbnRyb2wgZmxvdy48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkJ1aWxkIEdyaWQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCdWlsZF9HcmlkIj48L2E+QnVpbGQgR3JpZDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5DcmVhdGVzIGEgZ3JpZCBzcGFjZS48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRzXzQiPjwvYT5BZ2VudHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNldCBvZiBhZ2VudHMgdGhhdCBtaWdodCBleGlzdCBhcyBvY2N1cGFudHMgb2YgdGhpcyBncmlkOyB0aGF0IGlzLCBtZW1iZXJzIG9mIGluZGl2aWR1YWwgY2VsbHMgd2l0aGluIGEgZ2l2ZW4gZ3JpZC4gQWdlbnRzIG11c3QgYmUgaW5jbHVkZWQgaGVyZSBpbiBvcmRlciBmb3IgaW5zdGFuY2VzIHRvIGV4aXN0IHdpdGhpbiB0aGUgc3BhY2UsIGJ1dCBhZ2VudHMgaW5jbHVkZWQgaGVyZSBkbyBub3QgYWN0dWFsbHkgaGF2ZSB0byBleGlzdCB3aXRoaW4gdGhlIHNwYWNlLiAoSW4gdGhlIFJlcGFzdCBpbXBsZW1lbnRhdGlvbiwgYWxsIGFnZW50cyB0ZWNobmljYWxseSBhcmUgbWVtZWJlcnMgb2YgdGhlIHNwYXRpYWwgcHJvamVjdGlvbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB2YWxpZCBjb29yZGluYXRlcyB3aXRoaW4gdGhhdCBzcGFjZS4pIEZvciBleGFtcGxlLCBpbiBhbiBhZ3JpY3VsdHVyZSBtb2RlbCB0aGVzZSBtaWdodCByZXByZXNlbnQgYWdlbnRzIG1vdmluZyBhYm91dCBhbmQgaGFydmVzdGluZyBwbG90cyBvZiBsYW5kLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZpbGwgQWdlbnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJGaWxsX0FnZW50Ij48L2E+RmlsbCBBZ2VudDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYWdlbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGdyaWQgaXRzZWxmLiBBIGdpcmQgaXMgZ3VyYW50ZWVkIHRvIGNvbnRhaW4gb25lIGFuZCBvbmx5IG9uZSBmaWxsIGFnZW50IHdpdGhpbiBlYWNoIGdyaWQgbG9jYWl0b24uIFRoZSBncmlkIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgYWdlbnQgYW5kIHRoZXNlIGFnZW50cyBjYW5ub3QgbW92ZSwgbGVhdmUgb3IgZGllIHdpdGhpbiB0aGlzIHNwYWNlLiBUaGlzIHZhbHVlIG5lZWQgbm90IGJlIHNwZWNpZmllZCAtLSBpZiBsZWZ0IGJsYW5rIGEgZGVmYXVsdCBjZWxsIHdpdGhvdXQgYW55IHN0YXRlIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIGluIGFuIGFncmljdWx0dXJlIG1vZGVsLCB0aGlzIGFnZW50IG1pZ2h0IHJlcHJlc2VudCBhIHNpbmdsZSBwbG90IG9mIGxhbmQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3BhY2UgVHlwZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNwYWNlX1R5cGUiPjwvYT5TcGFjZSBUeXBlPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkRlcHJlY2F0ZWQuIFNob3VsZCBub3QgYmUgdXNlZC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fNSI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Ob3QgcmVsZXZhbnQgZm9yIGJ1aWxkZXJzIGV4Y2VwdCBhcyBwYXJ0IG9mIG5vcm1hbCBjb250cm9sIGZsb3cuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQXR0cmlidXRlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkF0dHJpYnV0ZXNfNCI+PC9hPkF0dHJpYnV0ZXM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Tm90IGN1cnJlbnRseSB1c2VkIGZvciBzcGFjZXMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJCdWlsZCBTcGFjZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkJ1aWxkX1NwYWNlIj48L2E+QnVpbGQgU3BhY2U8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q3JlYXRlcyBhIGNvbnRpbm91cyBzcGFjZS4gVGhlIGFjdHVhbCBkaW1lbnNpb25hbGl0eSBhbmQgb3RoZXIgcXVhbGl0aWVzIG9mIHRoZSBzcGFjZSBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHNwYWNlIGl0c2VsZiB0aG91Z2ggdGhpcyBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLiBBbGwgb3RoZXIgdmFsdWVzIGFyZSB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgdGhlIGdpcmQgYW5kIG90aGVyIGJ1aWxkZXIgYWN0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWdlbnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWdlbnRzXzUiPjwvYT5BZ2VudHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNldCBvZiBhZ2VudHMgdGhhdCBtaWdodCBiZSBhIHBhcnQgb2YgdGhpcyBzcGFjZS4gQWdlbnRzIG11c3QgYmUgaW5jbHVkZWQgaGVyZSBpbiBvcmRlciBmb3IgaW5zdGFuY2VzIHRvIGV4aXN0IHdpdGhpbiB0aGUgc3BhY2UsIGJ1dCBhZ2VudHMgaW5jbHVkZWQgaGVyZSBkbyBub3QgYWN0dWFsbHkgaGF2ZSB0byBleGlzdCB3aXRoaW4gdGhlIHNwYWNlLiAoSW4gdGhlIFJlcGFzdCBpbXBsZW1lbnRhdGlvbiwgYWxsIGFnZW50cyB0ZWNobmljYWxseSBhcmUgbWVtZWJlcnMgb2YgdGhlIHNwYXRpYWwgcHJvamVjdGlvbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB2YWxpZCBjb29yZGluYXRlcyB3aXRoaW4gdGhhdCBzcGFjZS4pPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJCdWlsZCBHZW9ncmFwaHkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCdWlsZF9HZW9ncmFwaHkiPjwvYT5CdWlsZCBHZW9ncmFwaHk8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q29uc3RydWN0cyBhIGdlb2dyYXBoaWNhbCBzcGFjZS4gQWxsIGRldGFpbHMgb2YgdGhpcyBzcGFjZSBhcmUgc3BlY2ZpZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLCBpLmUuIGEgc3BlY2lmaWMgZ2VvZ3JhcGhpY2FsIGltcG9ydGVkIHNwYWNlLiBHZW5lcmFsbHkgdGhlc2Ugd291bGQgYmUgZGVmaW5lZCBieSBhIENyZWF0ZSBBZ2VudHMgYWN0aW9uOyB0aGF0IGlzIGEgc2V0IG9mIGltcG9ydGVkIGFnZW50cyByZXByZXNlbnRpbmcgVVMgc3RhdGVzIHdvdWxkIGFsc28gcmVwcmVzZW50IHRoZSBvdmVyYWxsIHNwYWNlIG9mIGludGVyZXN0LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29tbWFuZHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb21tYW5kcyI+PC9hPkNvbW1hbmRzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFdmFsdWF0ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkV2YWx1YXRlIj48L2E+RXZhbHVhdGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RXZhbHVhdGUgQWN0aW9ucyBkZWZpbmUgc29tZSBjYWxjdWxhdGlvbiBvbiBhIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBtb2RlbCBzdGF0ZSBhbmQgYSBzZXQgb2YgaW5wdXQocykuIFRoZSBpbnB1dHMgdGhhdCBhbiBFdmFsdWF0ZSBBY3Rpb24gY2FuIHRha2UgaXMgZGV0ZXJtaW5lZCBieSBpdHMgZnVuY3Rpb25zIGFuZCBjYW4gYmUgZWl0aGVyIGFnZW50IGF0dHJpYnV0ZXMsIHByaW9yIGV2YWx1YXRpb25zIG9yIGxpdGVyYWxzLiBUaGUgcmVzdWx0IGlzIHRoZW4gZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aG9zZSBpbnB1dHMuIEluIHNvbWUgY2FzZXMgRXZhbHVhdGUgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBzb21lIGFjdGlvbiBpbmRpcmVjdGx5LCBzdWNoIGFzIHdpdGggYSBncmFwaGljcyBmaWxsLCBidXQgdGhleSBjYW4gbmV2ZXIgYmUgdXNlZCB0byBkaXJlY3RseSBjaGFuZ2UgbW9kZWwgc3RhdGUuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNlbGVjdGlvbl82Ij48L2E+U2VsZWN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFzIHdpdGggYWxsIG90aGVyIGFjdGlvbnMsIGV2YWx1YXRpb25zIHNwZWNpZnkgYSBzZWxlY3Rpb24sIGFuZCBqdXN0IGFzIHdpdGggdGhlIG90aGVyIGFjdGlvbnMsIHRoaXMgZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGFnZW50cyB0aGF0IHRoZSBldmFsdWF0aW9uIG9jY3VycyBmb3IsIGJ1dCB0aGUgaW5wdXQgc2VsZWN0aW9ucyBkZXRlcm1pbmUgd2hhdCBhZ2VudCBpcyB1c2VkIGZvciB0aGUgY2FsY3VsYXRpb24gaXRzZWxmLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZ1bmN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRnVuY3Rpb25fMiI+PC9hPkZ1bmN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgd2l0aCBxdWVyaWVzLCBhIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhZ2FpbnN0IGl0cyBpbnB1dCBzZXQuIEZ1bmN0aW9ucyBjYW4gcmVwcmVzZW50IHNpbXBsZSBvcGVyYXRvcnMgYXMgd2VsbCBhcyBjb21wbGV4IGZ1bmN0aW9ucy4gU2VlIHRoZSBmdW5jdGlvbnMgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzcGVjaWZpYyBmdW5jdGlvbnMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5wdXRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5wdXRzXzIiPjwvYT5JbnB1dHM8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNldCBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQsIGluIHRoZSBvcmRlciBvZiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLiBJbnB1dHMgY2FuIHNwZWNpZnkgYW55IHNvdXJjZSBldmFsdWF0aW9uIGFuZCBhbnkgYWdlbnQgc3RhdGUgb3IgYWdlbnQgcGFyZW50IGNvbnRleHQgc3RhdGUuIFRoZXkgY2FuIGFsc28gYmUgbGl0ZXJhbCB2YWx1ZXMgLS0gc2VlIHRoZSBkaXNjdXNzaW9uIGluIHRoZSBUb29scyBzZWN0aW9uLiBUaGUgc2VsZWN0aW9uIGRldGVybWluZXMgd2hpY2ggYWdlbnQncyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSwgYW5kIGRpZmZlcmVudCBpbnB1dHMgY2FuIHNwZWNpZnkgZGlmZmVyZW50IHNlbGVjdGlvbnMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZXQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZXQiPjwvYT5TZXQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIFNldCBBY3Rpb24gYXNzaWducyBzb21lIHZhbHVlIHRvIGFub3RoZXIgdmFsdWUuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNlbGVjdGlvbl83Ij48L2E+U2VsZWN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkhlcmUgdGhlIHNlbGVjdGlvbiByZWZlcnMgdG8gdGhlIGFnZW50IHRoYXQgd2Ugd2FudCB0byBjaGFuZ2UuIFRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSB0aGUgaW1tZWRpYXRseSBwcmVjZWVkaW5nIHNlbGVjdGlvbiBidXQgY2FuIGJlIGFueSBhY2Nlc3NpYmxlIHNlbGVjdGlvbi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBdHRyaWJ1dGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBdHRyaWJ1dGVfMyI+PC9hPkF0dHJpYnV0ZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYXR0cmlidXRlIHRvIG1vZGlmeS4gSXQgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGlzIGFjdGlvbidzIGFnZW50IG9yIG9mIHRoYXQgYWdlbnQncyBwYXJlbnQgY29udGV4dC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQYXJhbWV0ZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJQYXJhbWV0ZXIiPjwvYT5QYXJhbWV0ZXI8L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgYXR0cmlidXRlLiBIZXJlLCB3ZSBjYW4gdXNlIGVpdGhlciBhbm90aGVyIGFnZW50IGF0dHJpYnV0ZSwgb3IgdGhlIHJlc3VsdHMgb2YgYSBzb3VyY2UgZXZhbHVhdGlvbi4gPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDYXVzZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNhdXNlIj48L2E+Q2F1c2U8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBDYXVzZSBBY3Rpb24gImNhdXNlcyIgc29tZSBSb290IEFjdGlvbiB0byBvY2N1ciB1cG9uIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uLiBUaGlzIGFjdGlvbiBjYW4gYmUgZXh0cmVtZWx5IHVzZWZ1bCBmb3Igb3JnYW5pemluZyBtb2RlbCBiZWhhdmlvciBhbmQgcHJldmVudGluZyB0aGUgbmVlZCBmb3IgY3JlYXRpbmcgZHVwbGljYXRlIGFjdGlvbiBkZWZpbml0aW9ucy48L3A+Cis8cD5DYXVzZSBhY3Rpb25zIGFsc28gc3VwcG9ydCByZWN1cnNpdmUgZnVuY3Rpb25hbGl0eSBhbmQgIldISUxFIiBiZWhhdmlvci4gVGhlc2UgY2FuIGJlIHVzZWQgdG8gbWltaWMgbG9vcCBzdHJ1Y3V0cmVzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgYW4gYWdlbnQgdG8gZXhlY3V0ZSBzb21lIGJlaGF2aW9yIGFzIGxvbmcgYXMgdGhhdCBhZ2VudCBoYXMgZW5lcmd5IHJlbWFpbmluZy4gVG8gYWNjb21wbGlzaCB0aGlzLCB5b3UgY291bGQgY3JlYXRlIGEgcXVlcnkgZm9yICJlbmVyZ3kgJmd0OyAwIiBhbmQgdGhlbiBjcmVhdGUgYSBDYXVzZSB0YXJnZXQgd2l0aCB0aGUgcm9vdCBhY3Rpb24gYXMgaXRzIHJlc3VsdHMuPC9wPgorPHA+Tm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgY2F1dGlvdXMgYW5kIHRob3VnaHRmdWwgd2hlbiB1c2luZyB0aGUgQ2F1c2UgYWN0aW9uLiBSZW1lbWJlciB0aGF0IHNlbGVjdGlvbnMgcmVwcmVzZW50IHNldHMgb2YgYWdlbnRzIGFuZCB0aHVzIGdldCByaWQgb2YgdGhlIG5lZWQgZm9yIGNvbGxlY3Rpb24gbG9vcCBzdHJ1Y3V0dXJlcyAtLSBzdWNoIGFzIEphdmEgImZvciBlYWNoIiAtLSBjb21tb24gaW4gdHJhZGl0aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gYWxtb3N0IGFueXRoaW5nIHRoYXQgbWlnaHQgcmVxdWlyZSBhIGxvb3Agc3RydWN1dHJlIHVzaW5nIHRoZSBzZWxlY3Rpb24gbWVjaGFuaXNtIGl0c2VsZi4gQWxzbywganVzdCBhcyB3aXRoIGEgdHJhZGl0aW9uYWwgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCBhYm91dCBkZWZpbmluZyBjYXVzZSBhY3Rpb25zIHRoYXQgdHJpZ2dlciB0aGVpciBvd24gcm9vdCBhY3Rpb25zIG9yIHRoYXQgY2F1c2Ugb3RoZXIgYWN0aW9ucyB0byBpbiB0dXJuIHRyaWdnZXIgdGhlIG9yZ2luYWwgcm9vdCBhY3Rpb24uIFlvdSBjYW4gZWFzaWx5IGVuZCB1cCBkZWZpbmluZyBpbmZpbml0ZSBsb29wcyBpbiB0aGlzIHdheS4gKEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMgd2lsbCBldmVudHVhbGx5IHRyaWdnZXIgYSBzdGFjayBvdmVyZmxvdyBlcnJvciBhcyBjYXVzZSBpbnZvY2F0aW9ucyBhcmUgcmVjdXJzaXZlLCBidXQgZnV0dXJlIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIGFibGUgdG8gaW5mZXIgdGFyZ2V0IGxhbmd1YWdlIGxvb3Agc3RyY3V0dXJlcyB0byBwcmV2ZW50IHN0YWNrIGRlcHRoIGlzc3Vlcy4pPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlc3VsdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlc3VsdCI+PC9hPlJlc3VsdDwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcm9vdCBhY2l0b24gdGhhdCBzaG91bGQgYmUgdHJpZ2VycmVkIGZvciBldmVyeSBtZW1lYmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gVGhpcyBpcyB0eXBpY2FsbHkgYSBQZXJmb3JtIGFjdGlvbiBidXQgaXQgY2FuIGJlIGFueSBraW5kIG9mIHJvb3QgYWN0aW9uIGV4Y2VwdCBmb3IgIkRlcml2ZWQiLiAoV2hpY2ggZG9lc24ndCBtYWtlIGFueSBzZW5zZSB0byBkby4pPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb3ZlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTW92ZSI+PC9hPk1vdmU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIE1vdmUgQWN0aW9uIGNhdXNlcyBhbiBhZ2VudCB0byBjaGFuZ2UgaXRzIGxvY2F0aW9uIGluIHNvbWUgc3BhY2Ugb3IgbmV0d29yay4gVGhlIGFnZW50IHdpbGwgbGVhdmUgd2hhdGV2ZXIgbG9jYXRpb24gaXQgd2FzIGluIGJlZm9yZSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBzcGFjZSwgYW5kIG1vdmUgdG8gaXRzIG5ldyBkZXN0aW5hdGlvbi48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2VsZWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2VsZWN0aW9uXzgiPjwvYT5TZWxlY3Rpb248L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QXMgaW4gYW55IG90aGVyIGFjdGlvbiwgdGhlIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHdoYXQgYWdlbnQgaXMgYWZmZWN0ZWQgLS0gaW4gdGhpcyBjYXNlIHRoZSBhZ2VudCB0aGF0IGlzIGJlaW5nIG1vdmVkLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlc3RpbmF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGVzdGluYXRpb24iPjwvYT5EZXN0aW5hdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TcGVjaWZpZXMgdGhlIHRhcmdldCBhZ2VudCBvciBsb2NhdGlvbiBmb3IgdGhlIG1vdmVtZW50LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTGVhdmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMZWF2ZSI+PC9hPkxlYXZlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkNhdXNlcyB0aGUgYWdlbnQgdG8gbGVhdmUgYSBwYXJ0aWN1bGFyIHNwYWNlLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fOSI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgc2VsZWN0aW9uIGRldGVybWluZXMgd2hhdCBhZ2VudCB3aWxsIGJlIGxlYXZpbmcgYW5kIHdoYXQgc3BhY2UgdGhlIGFnZW50IHdpbGwgYmUgbGVhdmluZy4gSWYgdGhlIGFnZW50IGRvZXNuJ3QgZXhpc3QgaW4gdGhhdCBzcGFjZSBub3RoaW5nIHdpbGwgaGFwcGVuLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlc3RpbmF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGVzdGluYXRpb25fMiI+PC9hPkRlc3RpbmF0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBkZXN0aW5hdGlvbiBpcyBpcnJlbGV2YW50IGZvciBhIGxlYXZlIGFjdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEaWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaWUiPjwvYT5EaWU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q2F1c2VzIHRoZSBhZ2VudCB0byBjZWFzZSB0byBleGlzdCB3aXRoaW4gdGhlIG1vZGVsIGFzIGEgd2hvbGUuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNlbGVjdGlvbl8xMCI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgc2VsZWN0aW9uIGRldGVybWluZXMgd2hhdCBzcGFjZSB0aGUgYWdlbnQgdG8gcmVtb3ZlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlc3RpbmF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGVzdGluYXRpb25fMyI+PC9hPkRlc3RpbmF0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBkZXN0aW5hdGlvbiBpcyBpcnJlbGV2YW50IGluIHRoaXMgY2FzZSBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29ubmVjdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbm5lY3QiPjwvYT5Db25uZWN0PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkNvbm5lY3RzIHR3byBhZ2VudHMgd2l0aGluIGEgbmV0d29yayBzcGFjZS4gVGhpcyBBY3Rpb24gaXMgbm90IGFwcGxpY2FibGUgZm9yIGFueSBvdGhlciBraW5kcyBvZiBzcGFjZXMuIE5vdGUgdGhhdCB1bmxpa2Ugd2l0aCBvdGhlciB0cmFuc2Zvcm1hdGlvbmFsIGNvbW1hbmRzLCB3ZSBkbyBub3QgdXNlIHRoZSBkZXN0aW5hdGlvbiBzcGFjZSB0byBkZXRlcm1pbmUgdGhlIHNwYWNlIHRoYXQgd2lsbCBiZSBpbXBhY3RlZCBieSB0aGUgQWN0aW9uLiBUaGlzIHByb3ZpZGVzIGEgbW9yZSBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBhbnkgbG9zcyBpbiBnZW5lcmFsaXR5LCBiZWNhdXNlIGl0IGFsbG93cyB1cyB0byBzZWFyY2ggZm9yIGEgc291cmNlIGFuZCB0YXJnZXQgYWdlbnQgd2l0aGluIG90aGVyIHNwYWNlcyBhbmQgdGhlbiBjcmVhdGUgYSBjb25uZWN0aW9uIHdpdGhvdXQgY3JlYXRpbmcgYSBzZXBhcmF0ZSBzZWxlY3Rpb24uIEFzIHRoZSBpbXBvcnRhbnQgc3RydWN0dXJhbCBmZWF0dXJlIG9mIG5ldHdvcmtzIGFyZSB0aGUgcmVsYXRpb25zaGlwcyB0aGVtc2VsdmVzLCBub3QgdGhlIG5vZGVzIHRoaXMgcHJvdmlkZXMgYSBtb3JlIGRpcmVjdCB3YXkgdG8gc3BlY2lmeSB0aGVzZSByZWxhdGlvbnNoaXBzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fMTEiPjwvYT5TZWxlY3Rpb248L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHRoZSBhZ2VudCB0aGF0IHdpbGwgYmUgY29ubmVjdGVkIHRvIGFub3RoZXIgYWdlbnQuIEluIHRoZSBjYXNlIG9mIGEgZGlyZWN0ZWQgZ3JhcGgsIHRoaXMgaXMgdGhlIHNvdXJjZSBub2RlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ij1EZXN0aW5hdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ii4zRERlc3RpbmF0aW9uIj48L2E+PURlc3RpbmF0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBkZXN0aW5hdGlvbiBkZXRlcm1pbmVzIHRoZSBhZ2VudCB0aGF0IHRoZSBzZWxlY3Rpb24gYWdlbnQgd2lsbCBiZSBjb25uZWN0ZWQgdG8uIEluIHRoZSBjYXNlIG9mIGEgZGlyZWN0ZWQgZ3JhcGgsIHRoaXMgaXMgdGhlIHRhcmdldCBub2RlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IldpdGhpbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IldpdGhpbiI+PC9hPldpdGhpbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TcGVjaWZpZXMgdGhlIG5ldHdvcmsgdGhhdCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQgd2l0aGluLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlyZWN0ZWQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaXJlY3RlZF8yIj48L2E+RGlyZWN0ZWQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIG1hZGUgaXMgZGlyZWN0ZWQgb3Igbm90LiBJZiB0cnVlLCBzZWxlY3Rpb25zIGZyb20gc291cmNlIGFnZW50cyB3aWxsIGluY2x1ZGUgdGhlIHRhcmdldCwgYnV0IHRhcmdldCBhZ2VudCBzZWxlY3Rpb25zIHdpbGwgbm90IGluY2x1ZGUgdGhlIHNvdXJjZSBhZ2VudHMgKHVubGVzcyB0aGV5IGFyZSBjb25uZWN0ZWQgdGhyb3VnaCBzb21lIG90aGVyIHBhdGgpLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpc2Nvbm5lY3QiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaXNjb25uZWN0Ij48L2E+RGlzY29ubmVjdDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZW1vdmVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gYWdlbnRzIHdpdGhpbiBhIG5ldHdvcmsgc3BhY2UuIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIENvbm5lY3QgQWN0aW9uIGZvciBpbXBvcnRhbnQgZGV0YWlscy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2VsZWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2VsZWN0aW9uXzEyIj48L2E+U2VsZWN0aW9uPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBzZWxlY3Rpb24gZGV0ZXJtaW5lcyBvbmUgc2lkZSBvZiB0aGUgYWdlbnQgcmVsYXRpb25zaGlwIHRoYXQgd2lsbCBiZSBkaXNjb25uZWN0ZWQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVzdGluYXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZXN0aW5hdGlvbl80Ij48L2E+RGVzdGluYXRpb248L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNlbGVjdGlvbiBkZXRlcm1pbmVzIG9uZSBvdGhlciBzaWRlIG9mIHRoZSBhZ2VudCByZWxhdGlvbnNoaXAgdGhhdCB3aWxsIGJlIGRpc2Nvbm5lY3RlZC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJXaXRoaW4iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJXaXRoaW5fMiI+PC9hPldpdGhpbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TcGVjaWZpZXMgdGhlIG5ldHdvcmsgdGhhdCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQgd2l0aGluLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmVwbGFjZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlcGxhY2UiPjwvYT5SZXBsYWNlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZ1bmN0aW9ucyBpbiB0aGUgc2FtZSB3YXkgYXMgYSBDb25uZWN0IEFjdGlvbiBleGNlcHRoIHRoYXQgYWxsIG90aGVyIGNvbm5lY3Rpb25zIHRvIG90aGVyIGFnZW50cyB3aWxsIGZpcnN0IGJlIHJlbW92ZWQuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNlbGVjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNlbGVjdGlvbl8xMyI+PC9hPlNlbGVjdGlvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgc2VsZWN0aW9uIGRldGVybWluZXMgdGhlIGFnZW50IHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQgdG8gYW5vdGhlciBhZ2VudC4gSW4gdGhlIGNhc2Ugb2YgYSBkaXJlY3RlZCBncmFwaCwgdGhpcyBpcyB0aGUgc291cmNlIG5vZGUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGVzdGluYXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZXN0aW5hdGlvbl81Ij48L2E+RGVzdGluYXRpb248L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGRlc3RpbmF0aW9uIGRldGVybWluZXMgdGhlIGFnZW50IHRoYXQgdGhlIHNlbGVjdGlvbiBhZ2VudCB3aWxsIGJlIGNvbm5lY3RlZCB0by4gSW4gdGhlIGNhc2Ugb2YgYSBkaXJlY3RlZCBncmFwaCwgdGhpcyBpcyB0aGUgdGFyZ2V0IG5vZGUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iV2l0aGluIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iV2l0aGluXzMiPjwvYT5XaXRoaW48L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U3BlY2lmaWVzIHRoZSBuZXR3b3JrIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjcmVhdGVkIHdpdGhpbi48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpcmVjdGVkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlyZWN0ZWRfMyI+PC9hPkRpcmVjdGVkPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkRldGVybWluZXMgd2hldGhlciB0aGUgY29ubmVjdGlvbiBtYWRlIGlzIGRpcmVjdGVkIG9yIG5vdC4gU2VlIHRoZSBDb25uZWN0IGRlc2NyaXB0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPdGhlciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik90aGVyIj48L2E+T3RoZXI8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1ldGhvZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1ldGhvZCI+PC9hPk1ldGhvZDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgTWV0aG9kIGFjdGlvbiBzdXBwb3J0cyBpbmNsdXNpb24gb2YgYXJiaXRyYXJ5IGNvZGUgd2l0aGluIGEgZ2VuZXJhdGVkIG1ldGhvZC4gR2VuZXJhbGx5LCB0aGlzIHdpbGwgYmUgSmF2YSBjb2RlIGFzIGFsbCBvZiB0aGUgY3VycmVudCB0YXJnZXQgcGxhdGZvcm1zIGFyZSBKYXZhLWJhc2VkIGJ1dCB0aGVyZSBpcyBubyB0ZWNobmljYWwgcmVxdWlyZW1lbnQgdGhhdCBpdCBtdXN0IGJlLiBGb3IgZXhhbXBsZSwgaWYgYSB0YXJnZXQgaGFzIGJlZW4gZGV2ZWxvcGVkIHRvIHByb2R1Y2UgY29kZSBmb3IgU3dhcm0gcnVubmluZyBvbiBhbiBpUGFkIChhbmQgbm8sIHRoZXJlIGFyZSBubyBjdXJyZW50IHBsYW5zIHRvIHN1cHBvcnQgc3VjaCBhIHRoaW5nLCB0aG91Z2ggaXQgd291bGQgY2VydGFpbmx5IGJlIGNvb2whKSB0aGVuIHRoZSBtb2RlbGVyIGNvdWxkIGRlZmluZSBPYmplY3RpdmUgQyBjb2RlIGZvciB0aGUgbWV0aG9kLjwvcD4KKzxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIE1ldGhvZCBBY3Rpb24gc2hvdWxkIGJlIGF2b2lkZWQgd2hlbmV2ZXIgcG9zc2libGUuIFlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgaXQgb25seSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBjb25zdHJ1Y3QgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IHVzaW5nIHRoZSBuYXRpdmUgQWN0aW9ucyBmcmFtZXdvcmssIHN1Y2ggYXMgd2hlbiBpbnRlcmZhY2luZyB3aXRoIHRoaXJkIHBhcnR5IEFQSXMuICBUaGUgYWltIG9mIEFjdGlvbnMgaXMgdG8gcHJvdmlkZSB0aGUgbW9zdCBnZW5lcmFsIHN1cHBvcnQgZm9yIEFnZW50IE1vZGVsaW5nIHBvc3NpYmxlIHdpdGhvdXQgY29tcHJvbWlzaW5nIHRoZSBjb3JlIGRlc2lnbi4gQW55IHVzZSBvZiBuYXRpdmUgSmF2YSBjb2RlIHN0cm9uZ2x5IGxpbWl0cyB0aGUgc2V0IG9mIHBsYXRmb3JtcyB0aGF0IHlvdXIgbW9kZWwgd2lsbCBiZSBhYmxlIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGFuZCBwcmV2ZW50cyB5b3UgZnJvbSB1c2luZyB0aGUgQU1GIGVkaXQgdG9vbHMgdG8gZXhwbG9yZSB0aGUgbW9kZWwgYmVoYXZpb3IuIEluIHRoZSBjYXNlIHdoZXJlIHlvdSB3aXNoIHRvIGNvbnN0cnVjdCBhIG1vZGVsIGZlYXR1cmUgYW5kIGJlbGlldmUgdGhhdCBpdCBpc24ndCBwb3NzaWJsZSBvciBwcmFjdGljYWwgdG8gZG8gaXQgd2l0aCBBY3Rpb25zLCBwbGVhc2UgY29udGFjdCB1cyAoc2VlIHN1cHBvcnQgc2VjdGlvbikgc28gdGhhdCB3ZSBjYW4gc3VnZ2VzdCBob3cgeW91IGNhbiBhY2NvbXBsaXNoIHdoYXQgeW91IHdhbnQgd2l0aGluIEFjdGlvbnMuIElmIHRoYXQgaXMgbm90IHBvc3NpYmxlLCB3ZSdsbCBjb25zaWRlciBkZXZlbG9waW5nIG5ldyBmZWF0dXJlcyB0aGF0IHdpbGwgc3VwcG9ydCB3aGF0IHlvdSB3YW50IHRvIGRvLjwvcD4KKzxwPk9uIHRoZSBvdGhlciBoYW5kLCB5b3UgbWF5IHNpbXBseSB3aXNoIHRvIHVzZSB0aGUgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIHRvIGJ1aWxkIGEgc2NhZmZvbGRpbmcgZm9yIHlvdXIgbW9kZWwgLS0gcGVyaGFwcyB1c2luZyB5b3VyIG93biBjdXN0b20gSmF2YSBmcmFtZXdvcmsgZm9yIGV4YW1wbGUgLS0gYW5kIE1ldGhvZCB3b3VsZCBiZSBhIGdvb2Qgd2F5IHRvIGFjY29tcGxpc2ggdGhhdC4gQWxzbywgbm90ZSB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgYXBwcm9hY2hlcyB0byBtaXhpbmcgaGFuZC1jcmFmdGVkIEphdmEgdG9nZXRoZXIgd2l0aCBBTUYgZ2VuZXJhdGVkIGNvZGUuIFBsZWFzZSBzZWUgdGhlIFByb2dyYW1tZXIncyBHdWlkZSBzZWN0aW9uICJJbnRlZ3JhdGluZyBKYXZhIGFuZCBBTUYgTW9kZWxzIiBmb3IgbW9yZSBvbiB0aGF0LjwvcD4KKzxwPklmIHlvdSBkbyBkZWNpZGUgdG8gdXNlIHRoZSBNZXRob2QgQWN0aW9uLCBrZWVwIGluIG1pbmQgdGhlIGZvbGxvd2luZyBkZXNpZ24gcHJhY3RpY2UgcmVjb21tZW5kYXRpb25zOjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5LZWVwIHlvdXIgdXNhZ2Ugb2YgZXh0ZXJuYWwgQVBJIHJlZmVyZW5jZXMgdG8gYSBtaW5pbXVtLiBJZiB5b3UgY2FuIHVzZSBvbmx5IGNvZGUgcHJvdmllZCBieSB0aGUgY29yZSBKYXZhIGNsYXNzZXMgYXMgd2VsbCBhcyB0aGUgQXBhY2hlIENvbGxlY3Rpb25zIGxpYnJhcnksIHlvdXIgY29kZSBzaG91bGQgd29yayBvbiBldmVyeSBjdXJyZW50IEphdmEgdGFyZ2V0LiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IG1ha2UgdXNlIG9mIGEgc3BlY2lmaWMgQUJNIHBsYXRmb3JtIEFQSXMgeW91ciBjb2RlIHdpbGwgb2J2aW91c2x5IG9ubHkgY29tcGlsZSBhbmQgcnVuIGFnYWluc3QgdGhhdCB0YXJnZXQuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+Q29kZSBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgYSBtZXRob2QgYm9keSwgZXhjbHVkaW5nIHRoZSBzaWduYXR1cmUuIEEgc2luZ2xlIEphdmEgbWV0aG9kIGlzIGNyZWF0ZWQgdXNpbmcgdGhpcyBjb2RlIGJvZHkuIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGlucHV0IHBhcmFtZXRlcnMgLS0gaWYgeW91IG5lZWQgYWNjZXNzIHRvIGV2YWx1YXRlZCB2YWx1ZXMgZnJvbSBzb3VyY2UgYWN0aW9ucywgY3JlYXRlIGFnZW50IGF0dHJpYnV0ZXMgZm9yIHRoZW0sIHNldCB0aGVpciB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RlZCBhZ2VudHMsIGFuZCB1c2UgdGhlbSBhcyBzb3VyY2VzIGZvciB5b3VyIE1ldGhvZCBBY3Rpb24uPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+QWxsIEphdmEgY2xhc3MgcmVmZXJlbmNlcyBzaG91bGQgYmUgZnVsbHkgcXVhbGlmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdpc2ggdG8gdXNlIHRoZSBlY2xpcHNlIERyYXcyRCBHcmFwaGljcyBjbGFzcywgeW91IHNob3VsZCByZWZlciB0byAib3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzIiwgbm90IHNpbXBseSAiR3JhcGhpY3MiLiBJZiBjbGFzc2VzIGFyZSBub3QgZnVsbHkgcXVhbGlmaWVkLCB5b3Ugd2lsbCByZWNpZXZlIGNvbXBpbGUgZXJyb3JzLiBZb3UgY2FuIHVzdWFsbHkgZWFzaWx5IGZpeCB0aGVzZSBieSBzZWxlY3RpbmcgeW91ciBzb3VyY2UgY29kZSBkaXJlY3RvcnkgYW5kIGNob29zaW5nIAorCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+U291cmNlICZndDsgT3JnYW5pemUgSW1wb3J0cy4uPC9zdHJvbmc+PC9zcGFuPiBidXQgaXQgcHJldmVudHMgYXV0b21hdGljIGNvZGUgZ2VuZXJhdGlvbi4KKwkJCQkJCQkJPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+VGhlIG1ldGhvZCBpbnRlcmZhY2UgaGFzIG5vIHN1cHBvcnQgZm9yIGNvZGUgY29tcGxldGlvbiwgc3ludGF4IGNoZWNraW5nIG9yIG90aGVyIGNvbW1vbiBKYXZhIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZlYXR1cmVzLiBZb3UgY2FuIGF2b2lkIGNvZGUgbWFpbnRlbmFuY2UgYW5kIGV2ZW4gc3VwcG9ydCB0YXJnZXR0aW5nIG11bHRpcGxlIEFQSXMgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUuIEZyb20geW91ciBtZXRob2QgYm9keSwgY2FsbCBhIGhlbHBlciBtZXRob2QgaW4gYSBzZXBlcmF0ZSBjbGFzcy4gVGhlIHJlZmVycmVkIGNsYXNzIGNvdWxkIHVzZSBhIHN0YXRpYyBtZXRob2QgY2FsbCwgb3IgeW91IGNvdWxkIGluc3RhbnRpYXRlIHRoZSBjbGFzcyBhbmQgY2FsbCBhIG1ldGhvZCBhZ2FpbnN0IGl0LCBwYXNzaW5nIGluIHRoZSBhZ2VudCBjbGFzcyBzbyB0aGF0IHRoZSBoZWxwZXIgY2xhc3MgY2FuIHJlZmVyZW5jZSB0aGUgYWdlbnQncyBzdGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gdXNlIHNvbWUgY3VzdG9tIGphdmEgY29kZSB0byBpbXBvcnQgYWdlbnRzIGZyb20gYSBzcGVjaWFsaXplZCBpbnB1dCBmaWxlLCB5b3UgY291bGQgcHV0IHRoZSBmb2xsb3dpbmcgY29kZSBpbiB0aGUgTWV0aG9kIEFjdGlvbiBib2R5IGZvciB0aGUgcm9vdCBDb250ZXh0OjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPihuZXcmbmJzcDtvcmcubWUuU3BlY2lhbEZpbGVMb2FkZXIoKSkubG9hZCh0aGlzKTs8YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+VGhlbiBjcmVhdGUgYSBuZXcgc291cmNlIGRpcmVjdG9yeSBpbiB5b3VyIHByb2plY3QgY2FsbGVkICJzcmMiICgKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5OZXcgJmd0OyBTb3VyY2UgRm9sZGVyLi4uPC9zdHJvbmc+PC9zcGFuPikgYW5kIGNyZWF0ZSB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWFsaXplZCBmaWxlIGxvYWRlciBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2Q6CisJCQkJCQk8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPnB1YmxpYyZuYnNwO3ZvaWQmbmJzcDtsb2FkKE15Um9vdE1vZGVsJm5ic3A7bW9kZWwpJm5ic3A7ey4uLn08YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+VGhpcyBhcHByb2FjaCBhbGxvd3MgeW91IHRvIGEpIG1haW50YWluIHRoZSB3b3JraW5nIGNvZGUgdXNpbmcgdGhlIEphdmEgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQsIGIpIGF2b2lkIGNoYW5nZXMgdG8gdGhlIE1ldGhvZCBBY3Rpb24gd2l0aGluIHRoZSBtb2RlbCwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGMpIGFsbG93IG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY29kZSB1c2luZyBtdWx0aXBsZSBBUElzLiBGb3IgZXhhbXBsZSwgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbGl6ZWQgZ3JhcGhpY3Mgcm91dGluZSwgeW91IGNvdWxkIGNyZWF0ZSBzZXBlcmF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHlvdXIgRXNjYXBlIChFY2xpcHNlIERyYXcgMkQpLCBBc2NhcGUgKEphdmEgU3dpbmcpLCBhbmQgUmVwYXN0IChTaW1waG9ueSBBUEkpIGFuZCBwbGFjZSB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBwcm9qZWN0cy4gQXMgbG9uZyBhcyB0aGUgZGlmZmVyZW50IEphdmEgc291cmNlIGZpbGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYW5kIHNpZ25hdHVyZXMsIHRoZXkgd2lsbCBhbGwgY29tcGlsZSBjb3JyZWN0bHkgYW5kIGV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZWxlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTZWxlY3Rpb25fMTQiPjwvYT5TZWxlY3Rpb248L2g2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNlbGVjdGlvbiBkZXRlcm1pbmVzIHdoYXQgQWdlbnQgY2xhc3MgdGhlIGNvZGUgd2lsbCBiZSBjcmVhdGVkIHdpdGhpbiBhbmQgdGhlIHNldCBvZiBhZ2VudHMgdGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB1cG9uLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkJvZHkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCb2R5Ij48L2E+Qm9keTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgYWN0dWFsIGNvZGUgdG8gaW5zZXJ0IGluIHRoZSBtZXRob2QgYm9keS4gU2VlIHRoZSBkZXRhaWxlZCByZWNvbW1lbmRhdGlvbnMgZm9yIGNvZGUgdXNlIGFib3ZlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkdlbmVyYXRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR2VuZXJhdGUiPjwvYT5HZW5lcmF0ZTwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5EZXRlcm1pbmVzIHdldGhlciB0aGUgY29kZSBpcyBhY3R1YWxseSBpbnNlcnRlZC4gSWYgdGhpcyBpcyBmYWxzZSwgYSBiYXJlIG1ldGhvZCBib2R5IHdpbGwgYmUgY29uc3RydWN0ZWQgaW5zdGVhZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3aXNoIHRvIHR1cm4gb2ZmIG1ldGhvZCBnZW5lcmF0aW9uIGluIGNlcnRhaW4gbW9kZWwgaW1wbGVtZW50YWl0b25zIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGFjdHVhbCBjb2RlLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJRdWVyeSBhbmQgRXZhbHVhdGlvbiBJbnB1dHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJRdWVyeV9hbmRfRXZhbHVhdGlvbl9JbnB1dHMiPjwvYT5RdWVyeSBhbmQgRXZhbHVhdGlvbiBJbnB1dHM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UXVlcnkgYW5kIEV2YWx1YXRpb24gQWN0aW9ucyBhcmUgYm90aCAiU2lua3MiIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBhcmUgY2FwYWJsZSBvZiBjb250YWluaW5nIGlucHV0cy4gV2hlbiB5b3Ugc2VsZWN0IGEgZnVuY3Rpb24sIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgaW5wdXRzIHdpbGwgYmUgY3JlYXRlZC4gQWZ0ZXIgc2VsZWN0aW5nIGEgZnVuY3Rpb24sIHlvdSBjYW4gdmlldyBhbmQgc2VsZWN0IHRoZSBpbnB1dHMuIFRoZSBjaG9pY2VzIGZvciB0aGUgaW5wdXRzIHdpbGwgYmUgY29uc3RyYWluZWQgYnkgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgb3RoZXIgb3BlcmFuZHMgeW91J3ZlIHNlbGVjdGVkLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJbnB1dCBMaXRlcmFscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik4xMDY4OSI+PC9hPklucHV0IExpdGVyYWxzPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPklucHV0cyBjYW4gdGFrZSBsaXRlcmFsIHZhbHVlczsgdGhhdCBpcyB2YWx1ZXMgdGhhdCB5b3Ugc3BlY2lmeSBzaW1wbHkgYnkgZW50ZXJpbmcgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBxdWVyeS4gSW4gZ2VuZXJhbCBpdCBpcyB1c2VmdWwgdG8gdGhpbmsgb2YgbGl0ZXJhbHMgYXMgc2ltaWxhciB0byBsb2NhbCB2YXJpYWJsZXMgaW4gYSBjb252ZW50aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHdoZXJlYXMgYXR0cmlidXRlcyBhcmUgYW5hbG9nb3VzIHRvIG1lbWJlciB2YXJpYWJsZXMuIChBbmQgdGhpcyBpcyBob3cgdGhleSBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUuKSBBcyB3aXRoIGxvY2FsIHZhcmlhYmxlcyBpbiBtb2RlbCBjb2RlLCBsaXRlcmFscyBhcmUgbm90IHJlY29tbWVuZGVkIGZvciBhbnkgdmFsdWVzIHRoYXQgY2FuIGNoYW5nZSBtb2RlbCBiZWhhdmlvci4gVGhlIHZhbHVlIGNhbm5vdCBiZSBlYXNpbHkgYWNjZXNzZWQgb3IgY2hhbmdlZCBieSBvdGhlciBtb2RlbCB1c2Vycy4gRm9yIGdyZWF0ZXIgdHJhbnNwYXJlbmN5LCB5b3Ugc2hvdWxkIGluc3RlYWQgY3JlYXRlIGFuIEF0dHJpYnV0ZSB3aXRoIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQgdmFsdWUsIHNldHRpbmcgdGhlICJpbW11dGFibGUiIHZhbHVlIHRvIHRydWUuIFN0aWxsLCBsaXRlcmFscyBjYW4gYmUgdXNlZnVsIGZvciB2YWx1ZXMgdGhhdCBhcmUgc3BlY2lhbCBjYXNlcyByZWxhdGVkIHRvIHRoZSBldmFsdWF0aW9uIG9yIHF1ZXJ5LCBzdWNoIGFzIGFuIGlucHV0IGNvZGUsIGFuZCBmb3IgcXVpY2tseSBwcm90b3R5cGluZyBmdW5jdGlvbmFsaXR5LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlZmVyZW5jZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlZmVyZW5jZV8yIj48L2E+UmVmZXJlbmNlPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEaWFncmFtcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRpYWdyYW1zXzIiPjwvYT5EaWFncmFtczwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgZm9sbG93aW5nIGRpYWdyYW0gbWF5IGJlIGhlbHBmdWwgdG8gcmVhZGVycyBmYW1pbGlhciB3aXRoIFVNTCBhbmQgTWV0YS1tb2RlbGluZzo8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTWV0YS1DbGFzc2VzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTWV0YS1DbGFzc2VzXzIiPjwvYT5NZXRhLUNsYXNzZXM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc0RpYWdyYW0ucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEZXRhaWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGV0YWlsc180Ij48L2E+RGV0YWlsczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5JbiB0aGUgZGlhZ3JhbSBhYm92ZSwgYWxsIG1ldGEtb2JqZWN0cyBleGNlcHQgZm9yIElucHV0LCBMaXRlcmFsLCBhbmQgdGhlIGVudW1lcmF0b3JzIChsaXN0cyBvZiBvcHRpb25zKSBhcmUgQWN0aW9ucy4gQmx1ZSBtZXRhLWNsYXNzZXMgYXJlIGNvbmNyZXRlICh5b3UgY2FuIGNyZWF0ZSBhbmQgdXNlIHRoZW0gZGlyZWN0bHkpLiBSZWQgbWV0YS1jbGFzc2VzIGFyZSBrZXkgY29sbGFib3JhdGlvbnMuPC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkFuIEFjdCBpcyBhbnl0aGluZyB0aGF0IG1pZ2h0IGhhcHBlbiBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhbiBBZ2VudC1CYXNlZCBNb2RlbC48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BbGwgQWN0aW9ucyBoYXZlIGFzIHRoZWlyIHJvb3QtbW9zdCBzb3VyY2UgYWN0aW9uIGEgUm9vdC4gVGhlc2UgYXJlIGFkZGVkIGZpcnN0IHRvIGFueSBhZ2VudCBiZWhhdmlvciBhbmQgYWN0IGFzIHRyaWdnZXJzIGZvciBhbGwgdGFyZ2V0IGJlaGF2aW9yLiBGb3IgZXhhbXBsZSwgYSBXYXRjaCB3aWxsIGV4ZWN1dGUgYW55IHRpbWUgdGhlIHdhdGNoZWQgYXR0cmlidXRlIGlzIG1vZGlmaWVkLiAoQXMgdGhlIGRpYWdyYW1zIGRvIG5vdCByZWZlciB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UsIHdlIGNhbm5vdCBzZWUgaGVyZSB0aGF0IEFjY2Vzc29yIGluY2x1ZGVzIGEgcmVmZXJlbmNlIHRvIHNvbWUgQXR0cmlidXRlLCBidXQgaXQgZG9lcy4gVG8gc2VlIHRoZXNlIGtpbmRzIG9mIHJlbGF0aW9uc2hpcHMgeW91IHdpbGwgd2FudCB0byByZWZlciB0byB0aGUgbWV0YWFibS5lY29yZSBmaWxlIGl0c2VsZi4pI0FjdGlvbnMgYXJlIHRhcmdldHMgYW5kIHNvdXJjZXMgb2Ygb25lIGFub3RoZXIsIGJ1dCBhbiBBY3QgY2FuIG5ldmVyIGhhdmUgaXRzZWxmIGFzIGEgc291cmNlLiAoVGhhdCBpcywgQWN0aW9ucyBhcmUgYWN5Y2xpYywgYnV0IGJyYW5jaGVzIGNhbiByZS1jb252ZXJnZS4gV2hlbiB3ZSByZWZlciB0byBhbiBBY3Qgc291cmNlIG9yIHRhcmdldCwgd2UgdHlwaWNhbGx5IG1lYW4gdG8gaW5jbHVkZSBhbGwgYW5jZXN0b3JzIG9yIGRlc2NlbmRhbnRzLCBub3QganVzdCB0aGUgaW1tZWRpYXRlbHkgY29ubmVjdGVkIEFjdC4pPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+QWxsIEFjdGlvbnMgKGV4Y2VwdCBmb3Igcm9vdCBBY3Rpb25zKSByZWZlcmVuY2UgYSBTZWxlY3QsIHJlZmVycmVkIHRvIGFzIHRoZSAic2VsZWN0ZWQiIHJlbGF0aW9uLiBBbiBBU2VsZWN0IHJlcHJlc2VudHMgdGhlIG1vZGVsIGFzcGVjdHMgdGhhdCB0aGUgQWN0IGlzIHdvcmtpbmcgd2l0aGluOyB0aGF0IGlzLCB0aGUgc3BhdGlhbCwgdGVtcG9yYWwgYW5kIHR5cGUgKGFnZW50KSAid29ybGQiIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHNlbGVjdGVkLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNvbW1hbmRzIHRyaWdnZXIgc29tZSBtb2RlbCBzdGF0ZSBjaGFuZ2UgKFNldCkgb3Igc3BhdGlhbCB0cmFuc2Zvcm1hdGlvbiAoVHJhbnNmb3JtKS48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5Db250cm9scyBkZXRlcm1pbmUgd2hldGhlciB0YXJnZXQgQWN0aW9ucyBhcmUgZXhlY3V0ZWQgYW5kIGFnYWluc3Qgd2hhdCBhZ2VudHMuIFRoZXkgYXJlIGluIHNvbWUgc2Vuc2UgcXVlcnkgdGVybXMgYW5kIGluY2x1ZGUgUXVlcnkgYWN0aW9ucyBhbmQgTG9naWMgQWN0aW9ucy48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5UcmFuc2Zvcm1zIGFsc28gc3BlY2lmeSBhICJkZXN0aW5hdGlvbiIgU2VsZWN0LiBUaGlzIHJlcHJlc2VudHMgYXNwZWN0cyB0aGF0IHRoZSBzZWxlY3RlZCBhZ2VudChzKSB3aWxsIHRyYW5zZm9ybSB0by4gRm9yIGV4YW1wbGUsIGEgTW92ZSBtYXkgdXNlIGEgUnVsZSB0byBzZWxlY3QgYWxsIFN1Z2FyQWdlbnRzICh0eXBlKSBpbiB0aGUgU3VnYXJHcmlkIChzcGFjZSkgZXZlcnkgcGVyaW9kICh0aW1lKSBhbmQgbW92ZSB0aGVtIHRvIGEgZGVzdGluYXRpb24gb2YgYSBuZWlnaGJvcmluZyBTdWdhckNlbGwgKHR5cGUpIGluIHRoZSBTdWdhckdyaWQgKHNwYWNlLCB3aXRoIHRpbWUgaW1wbGljaXQpLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlNpbmtzIGFyZSBBY3Rpb25zIHdoaWNoIHVzZSBzb21lIEZ1bmN0aW9uIChzZWUgbmV4dCBzZWN0aW9uKSB0byBpbnRlcnByZXQgc3RhdGUgaW4gdGhlIGZvcm0gb2YgSW5wdXRzLiBJbnB1dHMgY2FuIGNvbWUgZnJvbSBzZWxlY3RlZCBhZ2VudCBhdHRyaWJ1dGVzLCBvdGhlciBBY3Rpb25zLCBvciBsaXRlcmFsIHZhbHVlcy48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4YW1wbGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFeGFtcGxlIj48L2E+RXhhbXBsZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5JbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGxvb2sgYXQgYW4gZXhhbXBsZSB0aGF0IHNob3VsZCBtYWtlIGNsZWFyIGhvdyB0aGUgYmFzaWMgQWN0aW9ucyBhcHByb2FjaCB3b3JrcyBpbiBhIG1vZGVsLiBTYXkgd2Ugd2FudCB0byBkZWZpbmUgYSBiZWhhdmlvciBsaWtlOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+IlNlYXJjaCZuYnNwO2ZvciZuYnNwO2EmbmJzcDtyYW5kb20mbmJzcDthZ2VudCZuYnNwO3dpdGhpbiZuYnNwO215Jm5ic3A7dmlzaW9uJm5ic3A7dGhhdCZuYnNwO2lzJm5ic3A7dGhlJm5ic3A7c2FtZSZuYnNwO2FnZSZuYnNwO2FzJm5ic3A7SSZuYnNwO2FtLiZuYnNwO0ZpbmQmbmJzcDthJm5ic3A7bG9jYXRpb24mbmJzcDtuZXh0Jm5ic3A7dG8mbmJzcDt0aGF0Jm5ic3A7YWdlbnQmbmJzcDt0aGF0Jm5ic3A7aXMmbmJzcDtub3QmbmJzcDthbHJlYWR5Jm5ic3A7b2NjdXBpZWQmbmJzcDthbmQmbmJzcDttb3ZlJm5ic3A7dG8mbmJzcDtpdC4iPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPkhlcmUsIHdlIGNyZWF0ZSBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgbGlrZSBzbzo8L3A+Cis8ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+Cis8b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSIxIj4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+U2VsZWN0IGV2ZXJ5IGFnZW50IGZvciBldmVyeSBwZXJpb2Qgb2YgdGhlIG1vZGVsLiAoIkZpbmQgUGFydG5lciIgUnVsZSk8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5Gb3IgZXZlcnkgbWVtYmVyIG9mIHRoYXQgc2VsZWN0aW9uLCBzZWFyY2ggZm9yIG90aGVyIGFnZW50cyBvZiB0aGUgc2FtZSBhZ2Ugd2l0aGluIHZpc2lvbiBkaXN0YW5jZS4gKCJQYXJ0bmVyIiBzZWxlY3Rpb24uKTwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkZyb20gIlBhcnRuZXJzIiBmaW5kIGEgcmFuZG9tIG1lbWJlciBhbmQgc2VhcmNoIGZvciBhIG5laWdoYm9yaW5nIGxvY2F0aW9ucy4gKCJQYXJ0bmVyIE5laWdoYm9yIiBzZWxlY3Rpb24uKTwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkZpbmFsbHksIG1vdmUgdGhlIGFnZW50IGluICJGaW5kIFBhcnRuZXIiIHRvIHRoZSAiUGFydG5lciBOZWlnaGJvciIgbG9jYXRpb24uPC9wPgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzxwPk5vdywgbm90aWNlIHRoYXQgYWx0aG91Z2ggaXQncyBjb252ZW5pZW50IHRvIHNwZWFrIGFzIGlmIHRoZXJlIGlzIG9ubHkgb25lICJGaW5kIFBhcnRuZXIiIGFuZCBvbmUgIlBhcnRuZXIgTmVpZ2hib3IiIGluIHN0ZXAgNCBhYm92ZSwgaW4gZmFjdCBzZWxlY3Rpb25zIGFyZSBmbG93aW5nIHRocm91Z2ggZm9yIGVhY2ggb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBvZiB0aGUgcHJldmlvdXMgYWN0aW9uIHNlcXVlbmNlcywgYW5kIHdlIGNhbiByZWZlciB0byBlYWNoIG9mIHRoZSBkaXJlY3RseS4gV2UgY291bGQgcmVwcmVzZW50IHRoZXNlIGJlaGF2aW9ycyBpbiBtYW55IGRpZmZlcmVudCB3YXlzLiBGb3IgZXhhbXBsZSwgd2UgbWlnaHQgd2FudCB0byBzcGVjaWZ5IHRoZSBtb2RlbCBpbiBhIChoYW5kLWRyYXduKSBncmFwaGljYWwgbGFuZ3VhZ2Ugb3IgaW4gYSAobWFkZS11cCkgdGV4dHVhbCBsYW5ndWFnZTo8L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc0V4YW1wbGUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPHA+VGhpcyBpcyBob3cgaXQgbG9va3MgaW4gYW4gYWN0dWFsIG1vZGVsOjwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZU5ldy5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8cD5BbmQgaGVyZSBpcyBob3cgdGhpcyB3b3JrcyBpbiBkZXRhaWw6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNyZWF0ZSBhIFJ1bGUgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGJlaGF2aW9yLiBJbiB0aGlzIGNhc2UsIHdlIHdhbnQgdGhpcyBydWxlIHRvIGFwcGx5IHRvIGFsbCAiSW5kaXZpZHVhbCIgYWdlbnRzIHdpdGhpbiB0aGUgbW9kZWwuIChTcGFjZSBpc24ndCByZWxldmFudCBpbiB0aGlzIGNhc2UuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+Q3JlYXRlIGEgY2hpbGQgU2VsZWN0IEFjdGlvbiB0aGF0IHdpbGwgZmluZCBvdXIgcGFydG5lci4gVHdvIGltcG9ydGFudCB0aGluZ3MgdG8gbm90ZSBoZXJlOjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9ImEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5UaGUgc2VsZWN0aW9uIG9jY3VycyBiYXNlZCBvbiB0aGUgIkZpbmQgUGFydG5lciIgc2VsZWN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgZm9yIGVhY2ggSW5kaXZpZHVhbCBpbiB0aGUgbW9kZWwsIHdlJ2xsIGJlIHNlYXJjaGluZyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoYXQgYWdlbnQgdG8gc29tZSBvdGhlciBzZWxlY3Rpb24gb2YgYWdlbnRzLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPldlIGFsc28gbmVlZCB0byBkZWZpbmUgd2hhdCB0eXBlIG9mIGFnZW50IHdlIHdhbnQgYW5kIGluIHRoaXMgY2FzZSB0aGUgc3BhY2UgZG9lcyBtYXR0ZXIuIFdlIHdhbnQgdG8gZmluZCBhbiBhZ2VudCB0aGF0IGlzIG5lYXJieSB3aXRoaW4gdGhlIENpdHkgc3BhY2UuIElmIGluc3RlYWQgd2Ugd2FudGVkIHRvIGZpbmQgYSBwYXJ0bmVyIGluIGEgc29jaWFsIG5ldHdvcmssIHdlJ2Qgc3BlY2lmeSB0aGF0IGluc3RlYWQuPC9wPgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNyZWF0ZSB0d28gY2hpbGQgUXVlcnkgQWN0aW9uczo8L3A+Cis8ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+Cis8b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSJhIj4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+V2Ugd2FudCB0byBzZWFyY2ggZm9yIHNvbWVvbmUgd2hvIGlzIHRoZSBzYW1lIGFnZSBhcyB1cy4gVGhpcyBoaWdobGlnaHRzIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBpZGVhIG9mIHRoZSBTZWxlY3Rpb24gaW4gdGhlIEFjdGlvbnMgZGVzaWduLiBXZSdyZSBxdWFsaWZ5aW5nIEFnZSBieSB0aGUgcnVsZSBhZ2VudCdzIHBhcnRuZXIgZm9yIHRoZSBmaXJzdCBpbnB1dCBhbmQgYnkgdGhlIHJ1bGUgYWdlbnQgZm9yIHRoZSBzZWNvbmQuIFRoZSBzZWxlY3Rpb24gY2FycmllcyB0aHJvdWdob3V0IHRoZSBmbG93IG9mIGV4ZWN1dGlvbiBhbmQgdGhpcyBjb250ZXh0IGlzIGFuIGV4cGxpY2l0IHBhcnQgb2YgdGhlIGVudGlyZSBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCB0aGlzIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIHdheSBjb250cm9sIGZsb3cgd29ya3MgaW4gYSB0cmFkaXRpb25hbCBpbXBlcmF0aXZlIGxhbmd1YWdlIHN1Y2ggYXMgSmF2YS48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5XZSBhbHNvIHdhbnQgdG8gc2VhcmNoIHVzaW5nIGEgZnVuY3Rpb24gZm9yIG5lYXJuZXNzLCAid2l0aGluIiwgd2hpY2ggdGFrZXMgYSBwYXJhbWV0ZXIgb2YgdmlzaW9uLiBOb3RlIHRoYXQgdGhlIHNwYXRpYWwgZnVuY3Rpb25zIGFyZSBhbGwgcG9seW1vcnBoaWMgLS0gaWYgd2UgZGVjaWRlZCBsYXRlciBvbiB0aGF0IHdlIHdvdWxkIHJhdGhlciBzZWFyY2ggd2l0aGluIHNheSAiS2V2aW4gQmFjb24gc3BhY2UiLCB0aGF0IGlzIGEgZ3JhcGggc3RydWN0dXJlIHJlcHJlc2VudGF0aW9uIG9mIHNwYWNlLCB3ZSB3b3VsZCBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoZSBzcGFjZSB3ZSd2ZSBkZWZpbmVkIGluIFNlbGVjdCBQYXJ0bmVyLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5JbnRlcnNlY3QgdGhlIHJlc3VsdHMgb2YgdGhlc2UgdHdvIHF1ZXJ5IGNvbXBvbmVudHMuIFRoaXMgZGVsaW5lYXRlcyB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gZGVmaW5pdGlvbiBmb3IgYW55IHRhcmdldCBBY3Rpb25zLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlNlbGVjdCBhIG5laWdoYm9yLiBBZ2Fpbiwgd2UgY2FuIHNlZSB0aGUgaW1wb3J0YW5jZSBvZiBTZWxlY3Rpb25zLiBIZXJlLCB3ZSBhcmUgc2VsZWN0aW5nIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIHBhcnRuZXIsIG5vdCB0aGUgaW5pdGlhbCBhZ2VudCB0aGF0IHRoZSBjdXJyZW50IFJ1bGUgaXMgYmVpbmcgZXhlY3V0ZWQgZm9yLiBOb3RlIHRoYXQgdGhpcyB0aW1lIG91ciB0YXJnZXQgYWdlbnQgaXMgYSAiQmxvY2siLCB0aGF0IGlzLCBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgY2l0eS48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BcyBhYm92ZSwgZGVmaW5lIHNvbWUgcXVlcmllcy4gVGhpcyB0aW1lIHdlIHdhbnQgb25seSB0aG9zZSBhZ2VudHMgdGhhdCBhcmU6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iYSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPmF2YWlsYWJsZSwgYW5kPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+bmVpZ2hib3JzIG9mIG91ciBwYXJ0bmVyLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5BbmQgYW5vdGhlciBpbnRlcnNlY3Rpb24uLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkZpbmFsbHksIHdlIG1vdmUgdG8gdGhlIGxvY2F0aW9uIHdlJ3ZlIGZvdW5kLiBBbGwgdGhhdCdzIHJlcXVpcmVkIGF0IHRoaXMgcG9pbnQgaXMgdG8gc3BlY2lmeTo8L3A+Cis8ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+Cis8b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSJhIj4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+VGhlIG1vdmVtZW50IHNlbGVjdGlvbiwgb3IgdGhvc2UgYWdlbnRzIHRoYXQgYXJlIG1vdmluZywgd2hpY2ggaW4gdGhpcyBjYXNlIGlzIHRoZSBvcmlnaW5hbCBhZ2VudCB3ZSdyZSBleGVjdXRpbmcgdGhlIHJ1bGUgZm9yLCBhbmQ8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5UaGUgZGVzdGluYXRpb24sIHdoaWNoIGlzIHRoZSBjZWxsIHRoYXQgd2UndmUgZm91bmQuIE5vdGUgdGhhdCB0aGUgZnJhbWV3b3JrIGluZmVycyBmcm9tIHRoZSBzcGFjZSBkZWZpbml0aW9uIHRoYXQgdGhlIEJsb2NrIGFnZW50IGlzIGNhcGFibGUgb2YgaG9zdGluZyB0aGUgSW5kaXZpZHVhbC48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRnVuY3Rpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJGdW5jdGlvbnMiPjwvYT5GdW5jdGlvbnM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik92ZXJ2aWV3Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iT3ZlcnZpZXdfNCI+PC9hPk92ZXJ2aWV3PC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZ1bmN0aW9ucyBhcmUgcmVsYXRpdmVseSBzaW1wbGUgaW4gdGVybXMgb2YgbW9kZWwgZGVzaWduLCBidXQgd2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyB3b3JrIGluIG9yZGVyIHRvIGRldmVsb3AgbW9kZWxzLiBGdW5jdGlvbnMgYXJlIGRpdmlkZWQgaW4gdHdvIHdheXMuIEJ5IHR5cGU6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPk9wZXJhdG9ycyBhcmUgc2ltcGxlIGNhbGN1bGF0aW9ucyBzaGFyaW5nIHRoZSBzYW1lIHR5cGUuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+RnVuY3Rpb25zIHRoYXQgY2FuIHJlcHJlc2VudCBhbnkgZ2VuZXJhbCBmdW5jdGlvbiB0aGF0IHRha2VzIHNvbWUgd2VsbC1kZWZpbmVkIGlucHV0KHMpIGFuZCByZXR1cm5zIHNvbWUgd2VsbC1kZWZpbmVkIG91dHB1dChzKS48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPHA+QW5kIGJ5IHVzYWdlOjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5HZW5lcmljcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSBhbmQgYXJlIHVzZWQgaW4gRXZhbHVhdGUgYWN0aW9ucy48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5Mb2dpY2FscyByZXR1cm4gc29tZSBib29sZWFuIHJlc3VsdCBhbmQgYXJlIHVzZWQgYnkgUXVlcnkgYWN0aW9ucyB0byBkZWNpZGUgd2hldGhlciB0YXJnZXQgQWN0aW9ucyBhcHBseSB0byBhIHBhcnRpY3VsYXIgc2VsZWN0aW9uLCBhbmQgYnkgRXZhbHVhdGUgYWN0aW9ucyBqdXN0IGFzIHdpdGggYW55IG90aGVyIGZ1bmN0aW9ucy4gSW5wdXQgdHlwZXMgc2hvdWxkIGJlIGRlZmluZWQgYXMgZ2VuZXJhbGx5IGFzIHBvc3NpYmxlLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8cD5UaGVzZSBvdmVybGFwLCBzbyB3ZSBoYXZlIG9wZXJhdG9ycywgbG9naWNhbCBvcGVyYXRvcnMsIGZ1bmN0aW9ucyBhbmQgbG9naWNhbCBmdW5jdGlvbnMuIEZ1bmN0aW9ucyBhcmUgYWxzbyBkaXZpZGVkIGludG8gY2F0ZWdvcmllcy4gV2UnbGwgZ28gdGhyb3VnaCBlYWNoIG9mIHRoZXNlIGluIGRlcHRoIGJlbG93LjwvcD4KKzxwPlRoZSBtb3N0IGltcG9ydGFudCB0aGluZyB0byBwb2ludCBvdXQgYWJvdXQgZnVuY3Rpb25zIGlzIHRoYXQgLSBhcyB3ZSd2ZSBzZWVuIHdpdGggb3RoZXIgQWNvcmUgY29uY2VwdHMgLS0gdGhleSBwcm92aWRlIHJpY2hlciBzZXRzIG9mIGZ1bmN0aW9uYWxpdHkgdGhhbiB0cmFkaXRpb25hbCBhcHByb2FjaGVzLiBNYW55IGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gY29sbGFib3JhdGUgd2l0aCBvbmUgYW5vdGhlciBhcyB3ZSdsbCBzZWUgd2hlbiBsb29raW5nIGF0IFNwYXRpYWwgYW5kIEdyYXBoaWNhbCBmdW5jdGlvbnMuIEZ1bmN0aW9ucyBjYW4gYWxzbyB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiByZWxhdGVkIG1vZGVsIGFydGlmYWN0cyBhcyB3ZSdsbCBzZWUgd2l0aCB0aGUgRGlzdHJpYnV0aW9uIGZ1bmN0aW9ucy48L3A+Cis8cD5BIHRlY2huaWNhbCBub3RlOiBjb25jZXB0dWFsbHksIGZ1bmN0aW9ucyBjYW4gcmV0dXJuIG11bHRpLXZhbHVlcywgYnV0IHRoYXQgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCBpbiB0aGUgcmVmZXJlbmNlIHRhcmdldHMgYmVjYXVzZSBvZiBsaW1pdGF0aW9ucyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIEphdmEuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGV0YWlscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRldGFpbHNfNSI+PC9hPkRldGFpbHM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkdlbmVyYWwgRnVuY3Rpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR2VuZXJhbF9GdW5jdGlvbnMiPjwvYT5HZW5lcmFsIEZ1bmN0aW9uczwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5OYXR1cmFsbHksIHRoZSBNb2RlbGluZyB0b29scyBwcm92aWRlIGdlbmVyYWwgZnVuY3Rpb25zIGZvciBwZXJmb3JtaW5nIGNhbGN1bGF0aW9ucywgY29tcGFyaXNvbnMgYW5kIG1vcmUgY29tcGxleCBtYXRoZW1hdGljYWwgZXhwcmVzc2lvbnMuIFRoZSBmdW5jdGlvbiBsaWJyYXJ5IGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQsIGFuZCB3ZSdsbCBiZSBhZGRpbmcgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgb3ZlciB0aW1lLiBBcyBhbHdheXMsIHdlIHdlbGNvbWUgZmVlZGJhY2sgYW5kIHdlJ2QgbGlrZSB0byBoZWFyIHdoYXQgZnVuY3Rpb25zIHlvdSBuZWVkIHRoYXQgYXJlbid0IGNvdmVyZWQgaGVyZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJMb2dpY2FsIE9wZXJhdG9ycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkxvZ2ljYWxfT3BlcmF0b3JzIj48L2E+TG9naWNhbCBPcGVyYXRvcnM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TG9naWNhbCBvcGVyYXRvcnMgYWxsb3cgY29tcGFyaXNvbiBiZXR3ZWVuIHZhbHVlcy4gVGhleSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gUXVlcnkgdGVybXMgYnV0IG1heSBiZSB1c2VkIGluIEV2YWx1YXRlIGFjdGlvbnMgYXMgd2VsbC48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTm90Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTm90Ij48L2E+Tm90PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gIVguPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRXF1YWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFcXVhbCI+PC9hPkVxdWFsPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gWD09WS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJZGVudGljYWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJJZGVudGljYWwiPjwvYT5JZGVudGljYWw8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYPT1ZLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkdyZWF0ZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJHcmVhdGVyIj48L2E+R3JlYXRlcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIFgmZ3Q7WS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJMZXNzZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMZXNzZXIiPjwvYT5MZXNzZXI8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYJmx0O1kuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR3JlYXRlciBvciBFcXVhbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdyZWF0ZXJfb3JfRXF1YWwiPjwvYT5HcmVhdGVyIG9yIEVxdWFsPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gWCZndDs9WS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJMZXNzZXIgb3IgRXF1YWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMZXNzZXJfb3JfRXF1YWwiPjwvYT5MZXNzZXIgb3IgRXF1YWw8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYJmx0Oz1ZLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlRydWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJUcnVlIj48L2E+VHJ1ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIHRydWUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRmFsc2UiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJGYWxzZSI+PC9hPkZhbHNlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gZmFsc2UuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSWRlbnRpdHkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJJZGVudGl0eSI+PC9hPklkZW50aXR5PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gWC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEaWZmZXJlbnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaWZmZXJlbnQiPjwvYT5EaWZmZXJlbnQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYIT1ZLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTnVtZXJpYyBPcGVyYXRvcnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJOdW1lcmljX09wZXJhdG9ycyI+PC9hPk51bWVyaWMgT3BlcmF0b3JzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk51bWVyaWMgb3BlcmF0b3JzIHN1cHBvcnQgYWxsIG9mIHRoZSBiYXNpYyBvcGVyYXRvcnMgdXNlZCBpbiBldmFsdWF0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTmVnYXRpdmUgVmFsdWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJOZWdhdGl2ZV9WYWx1ZSI+PC9hPk5lZ2F0aXZlIFZhbHVlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gLVguPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWRkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWRkIj48L2E+QWRkPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gWCtZLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlN1YnRyYWN0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU3VidHJhY3QiPjwvYT5TdWJ0cmFjdDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIFgtWS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNdWx0aXBseSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik11bHRpcGx5Ij48L2E+TXVsdGlwbHk8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYKlkuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGl2aWRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGl2aWRlIj48L2E+RGl2aWRlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gWC9ZLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlBvd2VyIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUG93ZXIiPjwvYT5Qb3dlcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIFheWS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb2R1bG8iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2R1bG8iPjwvYT5Nb2R1bG88L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBYJVkuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5jcmVtZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5jcmVtZW50Ij48L2E+SW5jcmVtZW50PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gKytYLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlY3JlbWVudCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRlY3JlbWVudCI+PC9hPkRlY3JlbWVudDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIC0tWC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJVbml0IFZhbHVlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVW5pdF9WYWx1ZSI+PC9hPlVuaXQgVmFsdWU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiAxLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ilplcm8gVmFsdWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJaZXJvX1ZhbHVlIj48L2E+WmVybyBWYWx1ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIDAuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iT3JpZ2luYWwgVmFsdWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPcmlnaW5hbF9WYWx1ZSI+PC9hPk9yaWdpbmFsIFZhbHVlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gby48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYXRpYWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTcGF0aWFsIj48L2E+U3BhdGlhbDwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TcGF0aWFsIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIEFnZW50IE1vZGVscy4gU3BhdGlhbCBmdW5jdGlvbnMgYXJlIHBvbHltb3JwaGljLCB3aGljaCBiYXNpY2FsbHkgbWVhbnMgdGhhdCB0aGV5IGRvbid0IGNhcmUgd2hhdCBzcGFjZSB0aGV5IGFyZSBvcGVyYXRpbmcgb24gYXMgbG9uZyBhcyB0aGF0IHNwYWNlIGlzIHN1aXRhYmxlIGZvciB0aGVtLiBTcGF0aWFsIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gY29sbGFib3JhdGUgd2l0aCBvbmUgYW5vdGhlci4gRm9yIGV4YW1wbGUsIGJ5IGludGVyc2VjdGluZyB0aGUgIk5laWdoYm9yIiwgIkF2YWlsYWJsZSIgYW5kICJUb3dhcmQiIGZ1bmN0aW9ucywgd2UgY2FuIGRlc2lnbiBhIHJ1bGUgdGhhdCBjYXVzZXMgdGhlIGFnZW50IHRvIG1vdmUgdG8gdGhlIG5leHQgbmVpZ2hib3JpbmcgY2VsbCB0aGF0IGdldCdzIGl0IGNsb3NlciB0byBzb21lIHRhcmdldCBhZ2VudC4gU2VlIHRoZSBmdW5jdGlvbiBkZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJOZWFyZXN0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTmVhcmVzdCI+PC9hPk5lYXJlc3Q8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UmVwcmVzZW50cyB0aGUgbmVhcmVzdCBhZ2VudHMgKGluY2x1ZGluZyBnaXJkIGNlbGxzKSBvciBsb2NhdGlvbnMgdG8gdGhpcyBhZ2VudC4gSWYgbW9yZSB0aGFuIG9uZSBhZ2VudCBvciBsb2NhdGlvbiBpcyB0aGUgc2FtZSBkaXN0YW5jZSBhd2F5IHRoZXkgd2lsbCBhbGwgYmUgY29uc2lkZXJlZC4gTm90ZSB0aGF0IHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBmb3IgdGhlIHNlbGVjdGlvbiBvZiBhbiBhZ2VudCwgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkgdGhlIGNvbnRleHQgd2l0aGluIHdoaWNoIGl0IGlzIHVzZWQuIElmIHRoZSBzZWxlY3Rpb24gc3BlY2lmaWVzIGFub3RoZXIgYWdlbnQgd2l0aGluIGEgc3BhY2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXByZXNlbnQgdGhlIG5lYXJlc3QgYWdlbnQgaW4gdGhhdCBzcGFjZS4gSWYgdGhlIHNlbGVjdGlvbiBzcGVjaWZpZXMgYSBDZWxsIHdpdGhpbiBhIGdyaWQgc3BhY2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXByZXNlbnQgdGhhdCBjZWxsLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlRvd2FyZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlRvd2FyZCI+PC9hPlRvd2FyZDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGEgbG9jYXRpb24gdGhhdCBpcyBvbiB0aGUgc2hvcnRlc3QgcGF0aCB0byBhIHBhcnRpY3VsYXIgYWdlbnQgb3IgbG9jYXRpb24gZnJvbSB0aGUgc291cmNlIGFnZW50ICh0aGF0IGlzLCB0aGUgc2VsZWN0aW9uJ3Mgc2VsZWN0aW9uJ3MgYWdlbnQpLiBUaGlzIGZ1bmN0aW9uIGNvbGxhYm9yYXRlcyB3aXRoIHRoZSB3aXRoaW4gYW5kIG5laWdoYm9yIGZ1bmN0aW9ucyB0byBhbGxvdyB0aGUgYWdlbnQgdG8gbW92ZSBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uIHRvd2FyZHMgc29tZSBvYmplY3RpdmUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iV2l0aGluIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iV2l0aGluXzQiPjwvYT5XaXRoaW48L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UmVwcmVzZW50cyBhIGxpbWl0IHRvIHRoZSBkaXN0YW5jZSBvZiBhIHNwYXRpYWwgc2VhcmNoLiBXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBzcGF0aWFsIGZ1bmN0aW9ucyBzdWNoIGFzICJuZWFyZXN0IiByZXF1aXJlcyB0aGF0IGFsbCBhZ2VudHMgb3IgbG9jYXRpb25zIG11c3QgYmUgd2l0aGluIHRoZSBkaXN0YW5jZSBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IHZhbHVlLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tOdW1lcmFsXSZuYnNwOzxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJOZWlnaGJvciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5laWdoYm9yIj48L2E+TmVpZ2hib3I8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UmVwcmVzZW50cyBhbnkgYWdlbnRzIHRoYXQgYXJlIG5lYXJlc3QgbmVpZ2hib3JzIHRvIHRoZSBhZ2VudCwgdGhhdCBpcyBub21pbmFsbHkgb2YgZGlzdGFuY2UgMS4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHJlbGV2YW50IGluIGRpc2NyZXRlIHNwYWNlcyAtLSBncmlkcyBhbmQgbmV0d29ya3MgLS0gd2hlcmUgdGhlcmUgYXJlIGltbWVkaWF0ZSBuZWlnaGJvcmluZyBjZWxscyBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9tZXRyeSBvZiB0aGUgc2VsZWN0aW9uJ3Mgc3BhY2UuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5jbHVkZSBTZWxmIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5jbHVkZV9TZWxmIj48L2E+SW5jbHVkZSBTZWxmPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNwZWNpZmllcyB3aGV0aGVyIHRoZSBhZ2VudCB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgZnJvbSAtLSB0aGF0IGlzLCB0aGUgYWdlbnQgb2YgdGhlIHNlbGVjdGlvbiBmb3IgdGhpcyBRdWVyeSBBY3Rpb24ncyBzZWxlY3Rpb24gLS0gaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJXaXRoaW4gMkQgQm91bmRhcnkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJXaXRoaW5fMkRfQm91bmRhcnkiPjwvYT5XaXRoaW4gMkQgQm91bmRhcnk8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UmVwcmVzZW50cyBhZ2VudHMgb3IgbG9jYXRpb25zIHRoYXQgZXhpc3Qgd2l0aGluIHRoZSBib3VuZGFyeSBzcGVjaWZpZWQgYnkgdGhlIGlucHV0cy48L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPklucHV0czo8YnI+CitbTnVtZXJhbF0mbmJzcDs8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSGVyZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkhlcmUiPjwvYT5IZXJlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZWFyY2hpbmcgYWdlbnQuIEZvciBleGFtcGxlLCBpZiBhIHNlbGVjdGlvbiBpcyBkZWZpbmVkIGZvciBhbiBhZ2VudCBjZWxsLCBhbmQgdGhhdCBzZWxlY3Rpb24ncyBzZWxlY3Rpb24ncyBhZ2VudCBpcyBhbiBvY2N1cGFudCBvZiBhIGNlbGwsIHRoZSBjZWxsIHRoYXQgdGhlIGFnZW50IGlzIG9jY3VweWluZyB3aWxsIGJlIHVzZWQuIDwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkF2YWlsYWJsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkF2YWlsYWJsZSI+PC9hPkF2YWlsYWJsZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGNlbGxzIHdoaWNoIGFyZSBub3QgY3VycmVudGx5IG9jY3VwaWVkLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIGdyaWRzIHdoaWNoIGFyZSBub3QgbXVsdGktb2NjdXBhbnQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlzdGFuY2UiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaXN0YW5jZSI+PC9hPkRpc3RhbmNlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYWdlbnQgYW5kIGFuIGFnZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgc2VsZWN0aW9uLiBJZiBtb3JlIHRoYW4gb25lIGFnZW50IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhlIHNlbGVjdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHRoZSBkaXN0YW5jZSB0byBhbiBhcmJpdHJhcnkgKHJhbmRvbWx5IHNlbGVjdGVkKSBhZ2VudCBhcyBkZWZpbmVkIGJ5IHRob3NlIG90aGVyIGZ1bmN0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPk91dHB1dHM6PGJyPgorW1JlYWxdJm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkF3YXkiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBd2F5Ij48L2E+QXdheTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGEgbG9jYXRpb24gdGhhdCBpcyBvbiB0aGUgcGF0aCB0aGF0IHdpbGwgdGFrZSB0aGUgc291cmNlIGFnZW50ICh0aGF0IGlzLCB0aGUgc2VsZWN0aW9uJ3Mgc2VsZWN0aW9uJ3MgYWdlbnQpIHRoZSBmYXJ0aGVzdCBkaXN0YW5jZSBmcm9tIHRoZSBhZ2VudChzKSByZXByZXNlbnRlZCBieSB0aGUgc2VhcmNoLiBUaGlzIGZ1bmN0aW9uIGNvbGxhYm9yYXRlcyB3aXRoIHRoZSB3aXRoaW4gYW5kIG5laWdoYm9yIGZ1bmN0aW9ucyB0byBhbGxvdyB0aGUgYWdlbnQgdG8gbW92ZSBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uIGF3YXkgZnJvbSBzb21lIGxvY2F0aW9uIG9yIGFnZW50LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1pbmltaXplIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTWluaW1pemUiPjwvYT5NaW5pbWl6ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5GaW5kcyB0aGUgYWdlbnQgd2l0aCB0aGUgbG93ZXN0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGlucHV0LiBGb3IgZXhhbXBsZSwgaWYgd2UgY3JlYXRlZCBhIFNlbGVjdCBmb3IgSGVhdENlbGwsIGNyZWF0ZWQgYSBNaW5pbWl6ZSBRdWVyeSBUZXJtIHdpdGggSGVhdCBhcyB0aGUgaW5wdXQgUXVlcnkgVGVybSwgY3JlYXRlZCBOZWlnaGJvciBhbmQgQXZhaWxhYmxlIFF1ZXJ5IFRlcm1zIGFuZCBzZXQgYW4gSW50ZXJzZWN0IGFzIHRoZSB0YXJnZXQgZm9yIGFsbCBvZiB0aG9zZSBRdWVyaWVzLCB0aGUgcmVzdWx0IHdvdWxkIGJlIHRoZSB0aGUgbmVpZ2hib3JpbmcgYXZhaWxhYmxlIGNlbGwgd2l0aCB0aGUgbG93ZXN0IGhlYXQgbGV2ZWwuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW1JlYWxdJm5ic3A7VGhlJm5ic3A7dmFsdWUmbmJzcDt3ZSZuYnNwO3dpbGwmbmJzcDttaW5pbWl6ZSZuYnNwO2Zvci48YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTWF4aW1pemUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNYXhpbWl6ZSI+PC9hPk1heGltaXplPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZpbmRzIHRoZSBhZ2VudCB3aXRoIHRoZSBoaWdoZXN0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGlucHV0LiBGb3IgZXhhbXBsZSwgaWYgd2UgY3JlYXRlZCBhIFNlbGVjdCBmb3IgSGVhdENlbGwsIGNyZWF0ZWQgYSBNYXhpbWl6ZSBRdWVyeSBUZXJtIHdpdGggSGVhdCBhcyB0aGUgaW5wdXQgUXVlcnkgVGVybSwgY3JlYXRlZCBOZWlnaGJvciBhbmQgQXZhaWxhYmxlIFF1ZXJ5IFRlcm1zIGFuZCBzZXQgYW4gSW50ZXJzZWN0IGFzIHRoZSB0YXJnZXQgZm9yIGFsbCBvZiB0aG9zZSBRdWVyaWVzLCB0aGUgcmVzdWx0IHdvdWxkIGJlIHRoZSB0aGUgbmVpZ2hib3JpbmcgYXZhaWxhYmxlIGNlbGwgd2l0aCB0aGUgaGlnaGVzdCBoZWF0IGxldmVsLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tSZWFsXSZuYnNwO1RoZSZuYnNwO3ZhbHVlJm5ic3A7d2UmbmJzcDt3aWxsJm5ic3A7bWF4aW1pemUmbmJzcDtmb3IuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxvY2F0aW9uIDJEIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTG9jYXRpb25fMkQiPjwvYT5Mb2NhdGlvbiAyRDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBhZ2VudCBmb3IgdXNlIGluIHN1YnNlcXVlbnQgc2VsZWN0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPklucHV0czo8YnI+CitbUmVhbF0mbmJzcDs8YnI+CitbUmVhbF0mbmJzcDs8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQm91bmRhcnkgMkQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJCb3VuZGFyeV8yRCI+PC9hPkJvdW5kYXJ5IDJEPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlJlcHJlc2VudHMgYSB0d28tZGltZW5zaW9uYWwgYm91bmRhcnkgd2l0aGluIGEgc3BhY2UuIChOb3QgY3VycmVudGx5IHJlbGV2YW50IGZvciBhbnkgZ2VuZXJhbCB1c2FnZXMuKTwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+T3V0cHV0czo8YnI+CitbUmVhbF0mbmJzcDs8YnI+CitbUmVhbF0mbmJzcDs8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWxsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWxsIj48L2E+QWxsPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkNhdXNlcyBhbGwgYWdlbnRzIHRoYXQgbWVldCB0aGUgb3RoZXIgcXVlcnkgdGVybXMgdG8gYmUgaW5jbHVkZWQgaW4gYSBzZWxlY3Rpb24uIFdpdGhvdXQgdGhpcyBxdWVyeSB0ZXJtLCBhIHNpbmdsZSByYW5kb20gYWdlbnQgaXMgcGlja2VkIG91dCBvZiBhbGwgYWdlbnRzIG1hdGNoaW5nIHRoZSBxdWVyeSB0ZXJtcy48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJhbmRvbSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJhbmRvbSI+PC9hPlJhbmRvbTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SYW5kb20gZnVuY3Rpb25zIGFyZSBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGZvciBhZ2VudCBtb2RlbHMuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgYXJlIHRoZSB3ZWlnaHRlZCBtZW1iZXJzaGlwIGFuZCByYW5kb20gc3RhdGUgYW5kIGJvb2xlYW4gdmFsdWUgZnVuY3Rpb25zLiBZb3Ugc2hvdWxkIGJlIGZhbWlsaWFyIHdpdGggdGhlc2UgZnVuY3Rpb25zIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gY3JlYXRlIG1vcmUgY29tcGxleCBBY3Rpb24gZmxvd3MgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSB0aGluZy48L3A+Cis8cD5Ob3RlIHRoYXQgd2Ugb25seSBoYXZlIHN1cHBvcnQgZm9yIHVuaWZvcm0gZGlzdHJpYnV0aW9ucyBhcyBvZiB0aGlzIHJlbGVhc2UuIFdlJ3JlIHdvcmtpbmcgb24gYSBjb2xsYWJvcmF0aXZlIGRlc2lnbiBmb3IgZXZhbHVhdGlvbnMgdGhhdCBhbGxvdyBlYXN5IG1peGluZyBhbmQgbWF0Y2hpbmcgb2YgcmFuZG9tIGZ1bmN0aW9ucyBhbmQgZGlzdHJpYnV0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmFuZG9tIEluIFJhbmdlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUmFuZG9tX0luX1JhbmdlIj48L2E+UmFuZG9tIEluIFJhbmdlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgcHNldWRvLXJhbmRvbSB2YWx1ZSB3aXRoaW4gdGhhdCBudW1lcmljIHJhbmdlIHNwZWNpZmllZCBhcyBkcmF3biBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uIFRoZSBtaW5pbXVtIHZhbHVlcyBhcmUgaW5jbHVzaXZlLiBUaGUgbWF4aW11bSB2YWx1ZXMgYXJlIGluY2x1c2l2ZSBmb3IgaW50ZWdlciBpbnB1dHMgYW5kIGV4Y2x1c2l2ZSBmb3IgUmVhbCBpbnB1dHMuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW051bWVyYWxdJm5ic3A7VGhlJm5ic3A7bWluaW11bSZuYnNwO3ZhbHVlJm5ic3A7KGluY2x1c2l2ZSkuPGJyPgorW051bWVyYWxdJm5ic3A7VGhlJm5ic3A7bWF4aW11bSZuYnNwO3ZhbHVlJm5ic3A7KGluY2x1c2l2ZSkuPGJyPgorT3V0cHV0czo8YnI+CitbTnVtZXJhbF0mbmJzcDtUaGUmbmJzcDtyYW5kb20mbmJzcDtudW1iZXIuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJhbmRvbSBUbyBMaW1pdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJhbmRvbV9Ub19MaW1pdCI+PC9hPlJhbmRvbSBUbyBMaW1pdDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHBzZXVkby1yYW5kb20gdmFsdWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSAobm9uLXplcm8pIGlucHV0IGFuZCBkcmF3biBmcm9tIGEgdW5pZm9ybSByYW5nZS4gVGhhdCB2YWx1ZSBpcyBpbmNsdXNpdmUgZm9yIEludGVnZXJzIGFuZCBleGNsdXNpdmUgZm9yIFJlYWxzLiAoTm90ZSB0aGF0IGFzIHdpdGggdGhlIHJhbmRvbSBpbiByYW5nZSBmdW5jdGlvbiBpbiB0aGUgY29udGV4dCBvZiByZWFsIG51bWJlcnMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gYW4gZXhjbHVzaXZlIGFuZCBpbmNsdXNpdmUgbGltaXQgaXMgZXNzZW50aWFsbHkgbWVhbmluZ2xlc3MuKTwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tOdW1lcmFsXSZuYnNwO1RoZSZuYnNwO21heGltdW0mbmJzcDt2YWx1ZSZuYnNwOyhpbmNsdXNpdmUpLjxicj4KK091dHB1dHM6PGJyPgorW051bWVyYWxdJm5ic3A7VGhlJm5ic3A7cmVzdWx0Ljxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJSYW5kb20gVW5pdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJhbmRvbV9Vbml0Ij48L2E+UmFuZG9tIFVuaXQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBwc2V1ZG8tcmFuZG9tIFJlYWwgdmFsdWUgYmV0d2VlbiAwIGFuZCAxIGRyYXduIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4gKFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGluY2x1c2l2ZSBhbmQgZXhjbHVzaXZlIHJhbmdlIGlzIGVzc2VudGlhbGx5IG1lYW5pbmdsZXNzIGluIHRoaXMgY29udGV4dCBhbmQgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSByZXN1bHQgd2lsbCBuZXZlciBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIDEuKTwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+T3V0cHV0czo8YnI+CitbUmVhbF0mbmJzcDs8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmFuZG9tIEJvb2xlYW4iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSYW5kb21fQm9vbGVhbiI+PC9hPlJhbmRvbSBCb29sZWFuPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgdmFsdWUgdGhhdCBpcyByYW5kb21seSB0cnVlIG9yIGZhbHNlLCBpLmUuIGEgZmFpciBjb2luIHRvc3MuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmFuZG9tIFdlaWdodGVkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUmFuZG9tX1dlaWdodGVkIj48L2E+UmFuZG9tIFdlaWdodGVkPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFuIGluZGV4ZWQgdmFsdWUgd2VpZ2h0ZWQgYWdhaW5zdCBhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gVGhlIHRvdGFsIHByb2JhYmlsaXR5IG11c3Qgc3VtIHRvIDEuMC4gRm9yIGV4YW1wbGUsIGFuIGlucHV0IG9mIHsuMSwuMiwuN30gdW5kZXIgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiB3b3VsZCB3b3VsZCBoYXZlIDEwJSBwcm9iYWJpbGl0eSBvZiBwcm9kdWNpbmcgIjAiICwgMjAlICBmb3IgIjEiIGFuZCA3MCUgZm9yICIyIi4gVGhpcyBmdW5jdGlvbiBjYW4gdGhlbiBiZSB1c2VkIHdpdGggSXRlbSB0byByZXR1cm4gYSBiaWFzZWQgcmVzdWx0IGZyb20gYW5vdGhlciBsaXN0LjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tSZWFsXSZuYnNwO0EmbmJzcDtsaXN0Jm5ic3A7b2YmbmJzcDt2YWx1ZXMmbmJzcDt0aGF0Jm5ic3A7d2lsbCZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO3Jlc3VsdGluZyZuYnNwO3dlaWdodGVkJm5ic3A7aW5kZXguPGJyPgorT3V0cHV0czo8YnI+CitbSW50ZWdlcl0mbmJzcDtBJm5ic3A7cmVzdWx0aW5nJm5ic3A7aW5kZXhlZCZuYnNwO3ZhbHVlJm5ic3A7Ym91bmRlZCZuYnNwO2J5Jm5ic3A7MCZuYnNwO2FuZCZuYnNwO3RoZSZuYnNwO2xlbmd0aCZuYnNwO29mJm5ic3A7dGhlJm5ic3A7aW5wdXQmbmJzcDtsaXN0Jm5ic3A7LSZuYnNwOzEuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJhbmRvbSBNZW1iZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSYW5kb21fTWVtYmVyIj48L2E+UmFuZG9tIE1lbWJlcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGEgcmFuZG9tIHZhbHVlIGRyYXduIGZyb20gdGhlIHNldCBvZiBSZWFsIHZhbHVlcyBzcGVjaWZpZWQuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW1JlYWxdJm5ic3A7UmV0dXJucyZuYnNwO2EmbmJzcDtyYW5kb20mbmJzcDttZW1iZXImbmJzcDtvZiZuYnNwO3RoZSZuYnNwO3N1cHBsaWVkJm5ic3A7bGlzdCZuYnNwO29mJm5ic3A7bnVtYmVycy48YnI+CitPdXRwdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwO1RoZSZuYnNwO3ZhbHVlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDtpdGVtJm5ic3A7YXQmbmJzcDthJm5ic3A7cmFuZG9tJm5ic3A7aW5kZXguPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJhbmRvbSBTdGF0ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJhbmRvbV9TdGF0ZSI+PC9hPlJhbmRvbSBTdGF0ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHJhbmRvbSBzcGVjaWZpZWQgdmFsdWUgKG9wdGlvbikgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwO1RoZSZuYnNwO3N0YXRlJm5ic3A7dG8mbmJzcDtzZWxlY3QmbmJzcDtpdGVtcyZuYnNwO2Zyb20uJm5ic3A7QWxsJm5ic3A7aXRlbXMmbmJzcDthcmUmbmJzcDtpbmNsdWRlZC48YnI+CitPdXRwdXRzOjxicj4KK1tJbnRlZ2VyXSZuYnNwO1RoZSZuYnNwO3Jlc3VsdGluZyZuYnNwO29wdGlvbi4mbmJzcDs8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHcmFwaGljIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR3JhcGhpYyI+PC9hPkdyYXBoaWM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+R3JhcGhpYyBmdW5jdGlvbnMgYXJlIGNvbWJpbmVkIHdpdGhpbiBTdHlsZSBFdmFsdWF0ZSBBY3Rpb25zIHRvIGRldGVybWluZSBob3cgdG8gZHJhdyBhbiBhZ2VudCB3aXRoaW4gYSB2aXN1YWxpemF0aW9uLiBPbmUgbmljZSBhc3BlY3Qgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRoZSBzYW1lIHN0eWxlIGRlZmluaXRpb24gY2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGhvdXQgY2hhbmdpbmcgYW55IGNvZGUuIEZvciBleGFtcGxlLCB0aGUgc2FtZSBzdHlsZSBjb3VsZCBiZSB1c2VkIHRvIGRyYXcgYW4gYWdlbnQgb24gYSB0d28tZGltZW5zaW9uYWwgZ3JpZCB3aXRoaW4gRXNjYXBlLCBhIHRocmVlLWRpbWVuc2lvbmFsIHNoYXBlIHdpdGhpbiBFc2NhcGUsIGEgSmF2YSBTd2luZyBiYXNlZCB2aXN1YWxpemF0aW9uIGluIEFzY2FwZSwgYW5kIGFuIFhNTCBjb25maWd1cmVkIHZpc3VhbGl6YWl0b24gaW4gUmVwYXN0IFNpbXBob255LjwvcD4KKzxwPlRvIGRlZmluZSBhIGdyYXBoaWMgc3R5bGUgZm9yIGFuIGFnZW50LCBkZXNpZ24gYSBmbG93IGluIHdoaWNoIHlvdSBjcmVhdGUgRXZhbHVhdGUgQWN0aW9ucyBmb3IgY29sb3IgYW5kIHNoYXBlLCBhbmQgdGhlbiBjcmVhdGUgYW4gRXZhbHVhdGUgQWN0aW9uIHdpdGggdGhlIGdyYXBoaWMgZmlsbCBvciBvdXRsaW5lIGZ1bmN0aW9uIGFzIGEgdGFyZ2V0IG9mIHRoZXNlLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaGFwZSBPdmFsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2hhcGVfT3ZhbCI+PC9hPlNoYXBlIE92YWw8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RHJhdyBhIGdlbmVyaWMgb3ZhbC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaGFwZSBSZWN0YW5nbGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTaGFwZV9SZWN0YW5nbGUiPjwvYT5TaGFwZSBSZWN0YW5nbGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RHJhd3MgYSByZWN0YW5ndWxhciBzaGFwZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaGFwZSBJbnNldCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNoYXBlX0luc2V0Ij48L2E+U2hhcGUgSW5zZXQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2hyaW5rcyB0aGUgY3VycmVudCBzaGFwZSBieSB0aGUgaW5wdXQgYW1vdW50LiAoVGhlIG92ZXJhbGwgc2NhbGUgaXMgY3VycmVudGx5IHVuc3BlY2lmaWVkLCBidXQgaW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIDIwLik8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPklucHV0czo8YnI+CitbSW50ZWdlcl0mbmJzcDtOdW1iZXImbmJzcDtvZiZuYnNwO25vbWluYWwmbmJzcDtwaXhlbHMmbmJzcDt0byZuYnNwO2luc2V0Ljxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTaGFwZSBNYXJrZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTaGFwZV9NYXJrZXIiPjwvYT5TaGFwZSBNYXJrZXI8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RHJhdyBhIG1hcmtlciwgdGhhdCBpcyBhIGdyYXBoaWNhbCBpbmRpY2F0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgYW4gYWRkaXRpb25hbCBxdWUgYWJvdXQgdGhlIG9iamVjdCBzdGF0ZS4gRm9yIGV4YW1wbGUsIGluIGEgdHdvLWRpbWVuc2lvbmFsIGdyYXBoaWNzIHJlcHJlc2VudGF0aW9uIHRoaXMgbWlnaHQgYmUgYSBzbWFsbCBzaGFwZSBkcmF3biBpbnNldCBhdCB0aGUgY29ybmVyIG9mIHRoZSBsYXJnZXIgc2hhcGUuIDwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNoYXBlIE1hcmtlciAyIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2hhcGVfTWFya2VyXzIiPjwvYT5TaGFwZSBNYXJrZXIgMjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGEgbWFya2VyIHBsYWNlZCBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbiBmcm9tIHRoZSBvdGhlciBzaGFwZSBtYXJrZXJzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNoYXBlIE1hcmtlciAzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU2hhcGVfTWFya2VyXzMiPjwvYT5TaGFwZSBNYXJrZXIgMzwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5SZXByZXNlbnRzIGEgbWFya2VyIHBsYWNlZCBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbiBmcm9tIHRoZSBvdGhlciBzaGFwZSBtYXJrZXJzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIFJHQiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbG9yX1JHQiI+PC9hPkNvbG9yIFJHQjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIGNvbG9yIHNwZWNpZmllZCBieSB0aGUgdGhyZWUgaW5wdXRzIGZvciBSZWQsIEdyZWVuIGFuZCBCbHVlIGNvbG9yIGNvbXBvbmVudHMuIFRob3NlIGlucHV0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDAuLjEuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW1JlYWxdJm5ic3A7QSZuYnNwO3ZhbHVlJm5ic3A7ZnJvbSZuYnNwOzAuMCZuYnNwO3RvJm5ic3A7MS4wLjxicj4KK1tSZWFsXSZuYnNwO0EmbmJzcDt2YWx1ZSZuYnNwO2Zyb20mbmJzcDswLjAmbmJzcDt0byZuYnNwOzEuMC48YnI+CitbUmVhbF0mbmJzcDtBJm5ic3A7dmFsdWUmbmJzcDtmcm9tJm5ic3A7MC4wJm5ic3A7dG8mbmJzcDsxLjAuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIFJlZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbG9yX1JlZCI+PC9hPkNvbG9yIFJlZDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY29sb3IgcmVkLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIFllbGxvdyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbG9yX1llbGxvdyI+PC9hPkNvbG9yIFllbGxvdzwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY29sb3IgeWVsbG93LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIEJsdWUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb2xvcl9CbHVlIj48L2E+Q29sb3IgQmx1ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY29sb3IgYmx1ZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb2xvciBPcmFuZ2UiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb2xvcl9PcmFuZ2UiPjwvYT5Db2xvciBPcmFuZ2U8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGNvbG9yIG9yYW5nZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb2xvciBHcmVlbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbG9yX0dyZWVuIj48L2E+Q29sb3IgR3JlZW48L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGNvbG9yIGdyZWVuLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIFB1cnBsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbG9yX1B1cnBsZSI+PC9hPkNvbG9yIFB1cnBsZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY29sb3IgcHVycGxlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbG9yIEJsYWNrIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29sb3JfQmxhY2siPjwvYT5Db2xvciBCbGFjazwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY29sb3IgYmxhY2suPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29sb3IgV2hpdGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb2xvcl9XaGl0ZSI+PC9hPkNvbG9yIFdoaXRlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBjb2xvciB3aGl0ZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb2xvciBHcmF5Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29sb3JfR3JheSI+PC9hPkNvbG9yIEdyYXk8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGNvbG9yIGdyYXkuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR3JhcGhpYyBPdXRsaW5lIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iR3JhcGhpY19PdXRsaW5lIj48L2E+R3JhcGhpYyBPdXRsaW5lPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkRyYXdzIGFuIG91dGxpbmUgb2YgdGhlIGxhc3QgZXZhbHVhdGVkIHNoYXBlLCB1c2luZyB0aGUgbGFzdCBzcGVjaWZpZWQgY29sb3Igb3IgdGhlIGRlZmF1bHQgY29sb3IgKHVzdWFsbHkgYmxhY2spIGlmIG5vbmUgaGFzIGJlZW4gc3BlY2lmaWVkLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkdyYXBoaWMgRmlsbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdyYXBoaWNfRmlsbCI+PC9hPkdyYXBoaWMgRmlsbDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5GaWxscyB0aGUgbGFzdCBldmFsdWF0ZWQgc2hhcGUgd2l0aCB0aGUgbGFzdCBzcGVjaWZpZWQgY29sb3Igb3IgdGhlIGRlZmF1bHQgY29sb3IgKHVzdWFsbHkgYmxhY2spIGlmIG5vbmUgaGFzIGJlZW4gc3BlY2lmaWVkLjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVGltZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlRpbWUiPjwvYT5UaW1lPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRpbWUgZnVuY3Rpb25zIHJldHVybiB2YWx1ZXMgcmVsYXRlZCB0byBtb2RlbCBleGVjdXRpb24gdGltZS4gPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik5vdyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5vdyI+PC9hPk5vdzwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgY3VycmVudCBzaW11bGF0aW9uIHBlcmlvZCwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGUgbW9kZWwgaGFzIGdvbmUgdGhyb3VnaCwgb3IgaW4gdGhlIGNhc2Ugb2YgbW9kZWxzIHdpdGggY2FsbGlicmFydGVkIHRpbWUsIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhZGRlZCB0byB0aGUgbW9kZWwncyBub21pbmFsIHN0YXJ0IHRpbWUuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5PdXRwdXRzOjxicj4KK1tJbnRlZ2VyXSZuYnNwO1RoZSZuYnNwO2N1cnJlbnQmbmJzcDtwZXJpb2QuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTWF0aCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1hdGgiPjwvYT5NYXRoPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBtYXRoIGZ1bmN0aW9ucyB1c2UgdGhlIGV4dHJlbWVseSB3ZWxsIHNwZWNpZmllZCBhbmQgdGVzdGVkIHJvdXRpbmVzIGZvcm0gdGhlIEphdmEgTWF0aCBsaWJyYXJ5LiAoQmVjYXVzZSBvZiBjb3B5cmlnaHQgcmVzdHJpY3Rpb25zLCB3ZSBhcmVuJ3QgYWJsZSB0byBpbmNsdWRlIHRoZSBleGFjdCBkZWZpbml0aW9ucyBoZXJlLiBDbGljayBvbiB0aGUgbGlua3MgdG8gZ2V0IG1vcmUgZGV0YWlscyBvbiBlYWNoIGZ1bmN0aW9uLik8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2luZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNpbmUiPjwvYT5TaW5lPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNzaW4oZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjc2luKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvc2luZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvc2luZSI+PC9hPkNvc2luZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjY29zKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2Nvcyhkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJUYW5nZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVGFuZ2VudCI+PC9hPlRhbmdlbnQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI3Rhbihkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCN0YW4oZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQXJjIFNpbmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBcmNfU2luZSI+PC9hPkFyYyBTaW5lPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNhc2luKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2FzaW4oZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQXJjIENvc2luZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFyY19Db3NpbmUiPjwvYT5BcmMgQ29zaW5lPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNhY29zKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2Fjb3MoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQXJjIFRhbmdlbnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBcmNfVGFuZ2VudCI+PC9hPkFyYyBUYW5nZW50PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNhdGFuKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2F0YW4oZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29udmVydCBEZWdyZWUgdG8gUmFkaWFucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbnZlcnRfRGVncmVlX3RvX1JhZGlhbnMiPjwvYT5Db252ZXJ0IERlZ3JlZSB0byBSYWRpYW5zPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCN0b1JhZGlhbnMoZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjdG9SYWRpYW5zKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbnZlcnQgUmFkaWFucyB0byBEZWdyZWVzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29udmVydF9SYWRpYW5zX3RvX0RlZ3JlZXMiPjwvYT5Db252ZXJ0IFJhZGlhbnMgdG8gRGVncmVlczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjdG9EZWdyZWVzKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI3RvRGVncmVlcyhkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeHAiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFeHAiPjwvYT5FeHA8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2V4cChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNleHAoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTG9nIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTG9nIj48L2E+TG9nPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNsb2coZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbG9nKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxvZyBiMTAiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJMb2dfYjEwIj48L2E+TG9nIGIxMDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbG9nMTAoZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbG9nMTAoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3F1YXJlIFJvb3QiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTcXVhcmVfUm9vdCI+PC9hPlNxdWFyZSBSb290PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNzcXVhcmVSb290KGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI3NxdWFyZVJvb3QoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3ViZSBSb290Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ3ViZV9Sb290Ij48L2E+Q3ViZSBSb290PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNjYnJ0KGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2NicnQoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmVtYWluZGVyIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUmVtYWluZGVyIj48L2E+UmVtYWluZGVyPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNpRUVFcmVtYWluZGVyKGRvdWJsZSwlMjBkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNpRUVFcmVtYWluZGVyKGRvdWJsZSwlMjBkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDZWlsaW5nIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ2VpbGluZyI+PC9hPkNlaWxpbmc8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2NlaWwoZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjY2VpbChkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJGbG9vciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZsb29yIj48L2E+Rmxvb3I8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2Zsb29yKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2Zsb29yKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJvdW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUm91bnQiPjwvYT5Sb3VudDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjcmludChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNyaW50KGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFyYyBUYW5nZW50IFJlY3Rhbmd1bGFyIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQXJjX1RhbmdlbnRfUmVjdGFuZ3VsYXIiPjwvYT5BcmMgVGFuZ2VudCBSZWN0YW5ndWxhcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjYXRhbjIoZG91YmxlLCUyMGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2F0YW4yKGRvdWJsZSwlMjBkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQb3dlciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlBvd2VyXzIiPjwvYT5Qb3dlcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjcG93KGRvdWJsZSwlMjBkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNwb3coZG91YmxlLCUyMGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFic29sdXRlIFZhbHVlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWJzb2x1dGVfVmFsdWUiPjwvYT5BYnNvbHV0ZSBWYWx1ZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjYWJzKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2Ficyhkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNYXhpbXVtIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTWF4aW11bSI+PC9hPk1heGltdW08L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI21heChkb3VibGUsJTIwZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbWF4KGRvdWJsZSwlMjBkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNaW5pbXVtIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTWluaW11bSI+PC9hPk1pbmltdW08L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI21pbihkb3VibGUsJTIwZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbWluKGRvdWJsZSwlMjBkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJVTFAiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJVTFAiPjwvYT5VTFA8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI3VscChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCN1bHAoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2lnbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNpZ24iPjwvYT5TaWduPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlNlZSBKYXZhRG9jOiAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNzaWdudW0oZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjc2lnbnVtKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikh5cGVyYm9saWMgU2luZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ikh5cGVyYm9saWNfU2luZSI+PC9hPkh5cGVyYm9saWMgU2luZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjc2luaChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNzaW5oKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikh5cGVyYm9saWMgQ29zaW5lIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSHlwZXJib2xpY19Db3NpbmUiPjwvYT5IeXBlcmJvbGljIENvc2luZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjY29zaChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCNjb3NoKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikh5cGVyYm9saWMgVGFuIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSHlwZXJib2xpY19UYW4iPjwvYT5IeXBlcmJvbGljIFRhbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjdGFuaChkb3VibGUpIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL01hdGguaHRtbCN0YW5oKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikh5cG90dW5ldXNlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSHlwb3R1bmV1c2UiPjwvYT5IeXBvdHVuZXVzZTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjaHlwb3R1bmV1c2UoZG91YmxlLCUyMGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2h5cG90dW5ldXNlKGRvdWJsZSwlMjBkb3VibGUpPC9hPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeHBtMSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkV4cG0xIj48L2E+RXhwbTE8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIEphdmFEb2M6IAorCQkJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2V4cG0xKGRvdWJsZSkiIHRhcmdldD0iX25ldyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL2xhbmcvTWF0aC5odG1sI2V4cG0xKGRvdWJsZSk8L2E+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxvZzFwIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTG9nMXAiPjwvYT5Mb2cxcDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgSmF2YURvYzogCisJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbG9nMXAoZG91YmxlKSIgdGFyZ2V0PSJfbmV3Ij5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmEvbGFuZy9NYXRoLmh0bWwjbG9nMXAoZG91YmxlKTwvYT4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJMaXN0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTGlzdCI+PC9hPkxpc3Q8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TGlzdCBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhcnJheXMgYW5kIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGhhdmUgbGlzdHMgYXMgb3V0cHV0LjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJdGVtIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSXRlbSI+PC9hPkl0ZW08L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+UmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIGxpc3Qgb2YgaXRlbXMgcHJvdmlkZWQuIFRob3NlIGl0ZW1zIHdpbGwgdHlwaWNhbGx5IGJlIGlucHV0IHByaW1pdGl2ZXMgc3VjaCBhcyBJbnRlZ2VyIG9yIFJlYWwgdmFsdWVzLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwOzxicj4KK1tJbnRlZ2VyXSZuYnNwOzxicj4KK091dHB1dHM6PGJyPgorW0dlbmVyaWNdJm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikxlbmd0aCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ikxlbmd0aCI+PC9hPkxlbmd0aDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBwcm92aWRlZCBsaXN0IG9mIGl0ZW1zLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwOzxicj4KK091dHB1dHM6PGJyPgorW0ludGVnZXJdJm5ic3A7PGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlzdHJpYnV0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlzdHJpYnV0aW9uIj48L2E+RGlzdHJpYnV0aW9uPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk9uZSBvZiB0aGUgbW9zdCBjb21tb24gdGFza3MgaW4gdGhlIEFnZW50IE1vZGVsaW5nIHByb2Nlc3MgaXMgdGhlIGNyZWF0aW9uIG9mIGFnZW50cyB3aXRoIHBhcnRpY3VsYXIgc3RhdGVzIGRyYXduIGZyb20gYSBkaXN0cmlidXRpb24uIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBudW1iZXIgb2YgYWdlbnRzIHdpdGggd2VhbHRoIHJhbmRvbWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gc29tZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcy4gVGhlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbnMgZ3JlYXRseSBlYXNlIHRoZSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgdGhvc2UgaW5pdGlhbGl6YXRpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIHBhcmFtZXRlcnMuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlVuaWZvcm0gQ3Jvc3MgRGlzdHJpYnV0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVW5pZm9ybV9Dcm9zc19EaXN0cmlidXRpb24iPjwvYT5Vbmlmb3JtIENyb3NzIERpc3RyaWJ1dGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHJhbmRvbSBudW1iZXIgdGFrZW4gZnJvbSBhIGRpc3RyaWJ1dGlvbiBvZiB2YWx1ZXMgYXMgZGVmaW5lZCBieSBhIGNyb3NzIG9mIGFsbCB2YWx1ZXMuIChTZWUgQ3Jvc3MgRGlzdHJpYnV0aW9uLikgVGhpcyBmdW5jaXRvbiB0aGVuIHJldHVybnMgYSB2YWx1ZSBkcmF3biBmcm9tIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjdXJyZW50IGFnZW50IHN0YXRlLiBJbiB0aGUgY3Jvc3MgZGlzdHJpYnV0aW9uLCBlYWNoIG9mIHRoZSB2YWx1ZXMgaXMgdHJlYXRlZCBpbmRlcGVuZGVudGx5IHNvIHRoYXQgYW4gaW5wdXQgYXR0cmlidXRlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHBvdGVudGlhbCBjb21iaW5hdGlvbiBvZiBzdGF0ZXMuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW0dlbmVyaWNdJm5ic3A7VGhlJm5ic3A7bGlzdCZuYnNwO29mJm5ic3A7c3RhdGVzJm5ic3A7dG8mbmJzcDtmYWN0b3ImbmJzcDtpbnRvJm5ic3A7dGhlJm5ic3A7ZGlzdHJpYnV0aW9uLiZuYnNwO1RoaXMmbmJzcDtpcyZuYnNwO2EmbmJzcDttdWx0aS1hcmd1bWVudCwmbmJzcDt3aGljaCZuYnNwO21lYW5zJm5ic3A7dGhhdCZuYnNwO3lvdSZuYnNwO2NhbiZuYnNwO3NwZWNpZnkmbmJzcDthbnkmbmJzcDtudW1iZXImbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDthcyZuYnNwO2FyZ3VtZW50cy48YnI+CitbUmVhbF0mbmJzcDtUaGUmbmJzcDtzZXQmbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDt0aGF0Jm5ic3A7d2lsbCZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO21pbmltdW0mbmJzcDt2YWx1ZSZuYnNwO29mJm5ic3A7dGhlJm5ic3A7ZnVuY3Rpb24mbmJzcDtyZXN1bHQmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO3N0YXRlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDthZ2VudC4mbmJzcDtOb3RlJm5ic3A7dGhhdCZuYnNwO3RoaXMmbmJzcDtsaXN0Jm5ic3A7aXMmbmJzcDthdXRvbWF0aWNhbGx5Jm5ic3A7Y3JlYXRlZCZuYnNwO2FuZCZuYnNwO21haW50YWluZWQuJm5ic3A7VGhlc2UmbmJzcDt2YWx1ZXMmbmJzcDtkb24ndCZuYnNwO25lZWQmbmJzcDt0byZuYnNwO2JlJm5ic3A7YW5kJm5ic3A7c2hvdWxkJm5ic3A7bm90Jm5ic3A7YmUmbmJzcDttYW51YWxseSZuYnNwO2VkaXRlZC48YnI+CitbUmVhbF0mbmJzcDtUaGUmbmJzcDtzZXQmbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDt0aGF0Jm5ic3A7d2lsbCZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO21heGltdW0mbmJzcDt2YWx1ZSZuYnNwO29mJm5ic3A7dGhlJm5ic3A7ZnVuY3Rpb24mbmJzcDtyZXN1bHQmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO3N0YXRlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDthZ2VudC4mbmJzcDtOb3RlJm5ic3A7dGhhdCZuYnNwO3RoaXMmbmJzcDtsaXN0Jm5ic3A7aXMmbmJzcDthdXRvbWF0aWNhbGx5Jm5ic3A7Y3JlYXRlZCZuYnNwO2FuZCZuYnNwO21haW50YWluZWQuJm5ic3A7VGhlc2UmbmJzcDt2YWx1ZXMmbmJzcDtkb24ndCZuYnNwO25lZWQmbmJzcDt0byZuYnNwO2JlJm5ic3A7YW5kJm5ic3A7c2hvdWxkJm5ic3A7bm90Jm5ic3A7YmUmbmJzcDttYW51YWxseSZuYnNwO2VkaXRlZC48YnI+CitPdXRwdXRzOjxicj4KK1tSZWFsXSZuYnNwO1RoZSZuYnNwO3Jlc3VsdGluZyZuYnNwO3JhbmRvbSZuYnNwO251bWJlciZuYnNwO2Jhc2VkJm5ic3A7b24mbmJzcDt0aGUmbmJzcDtjdXJyZW50Jm5ic3A7YWdlbnQmbmJzcDtzdGF0ZSZuYnNwO2FuZCZuYnNwO3RoZSZuYnNwO2lucHV0Jm5ic3A7cGFyYW1ldGVycy48YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVW5pZm9ybSBBZGRpdGl2ZSBEaXN0cmlidXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJVbmlmb3JtX0FkZGl0aXZlX0Rpc3RyaWJ1dGlvbiI+PC9hPlVuaWZvcm0gQWRkaXRpdmUgRGlzdHJpYnV0aW9uPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgcmFuZG9tIG51bWJlciB0YWtlbiBmcm9tIGEgZGlzdHJpYnV0aW9uIG9mIHZhbHVlcyBpbiB3aGljaCBlYWNoIG9mIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcmUgYWRkZWQgdG8gZGV0ZXJtaW5lIGEgdG90YWwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZS4gKFNlZSBBZGRpdGl2ZSBEaXN0cmlidXRpb24uKSBJbiB0aGUgYWRkaXRpdmUgZGlzdHJpYnV0aW9uLCBlYWNoIG9mIHRoZSB2YWx1ZXMgaXMgdHJlYXRlZCBhcyBkZXBlbmRlbnQgb24gdGhlIG90aGVycyBzbyB0aGF0IGFuIGlucHV0IGF0dHJpYnV0ZSBpcyBvbmx5IGNyZWF0ZWQgZm9yIGVhY2ggc2VwZXJhdGUgc3RhdGUuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5JbnB1dHM6PGJyPgorW0dlbmVyaWNdJm5ic3A7VGhlJm5ic3A7bGlzdCZuYnNwO29mJm5ic3A7c3RhdGVzJm5ic3A7dG8mbmJzcDtmYWN0b3ImbmJzcDtpbnRvJm5ic3A7dGhlJm5ic3A7ZGlzdHJpYnV0aW9uLiZuYnNwO1RoaXMmbmJzcDtpcyZuYnNwO2EmbmJzcDttdWx0aS1hcmd1bWVudCwmbmJzcDt3aGljaCZuYnNwO21lYW5zJm5ic3A7dGhhdCZuYnNwO3lvdSZuYnNwO2NhbiZuYnNwO3NwZWNpZnkmbmJzcDthbnkmbmJzcDtudW1iZXImbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDthcyZuYnNwO2FyZ3VtZW50cy48YnI+CitbUmVhbF0mbmJzcDtUaGUmbmJzcDtzZXQmbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDt0aGF0Jm5ic3A7d2lsbCZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO21pbmltdW0mbmJzcDt2YWx1ZSZuYnNwO29mJm5ic3A7dGhlJm5ic3A7ZnVuY3Rpb24mbmJzcDtyZXN1bHQmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO3N0YXRlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDthZ2VudC4mbmJzcDtOb3RlJm5ic3A7dGhhdCZuYnNwO3RoaXMmbmJzcDtsaXN0Jm5ic3A7aXMmbmJzcDthdXRvbWF0aWNhbGx5Jm5ic3A7Y3JlYXRlZCZuYnNwO2FuZCZuYnNwO21haW50YWluZWQuJm5ic3A7VGhlc2UmbmJzcDt2YWx1ZXMmbmJzcDtkb24ndCZuYnNwO25lZWQmbmJzcDt0byZuYnNwO2JlJm5ic3A7YW5kJm5ic3A7c2hvdWxkJm5ic3A7bm90Jm5ic3A7YmUmbmJzcDttYW51YWxseSZuYnNwO2VkaXRlZC48YnI+CitbUmVhbF0mbmJzcDtUaGUmbmJzcDtzZXQmbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDt0aGF0Jm5ic3A7d2lsbCZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO21heGltdW0mbmJzcDt2YWx1ZSZuYnNwO29mJm5ic3A7dGhlJm5ic3A7ZnVuY3Rpb24mbmJzcDtyZXN1bHQmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO3N0YXRlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDthZ2VudC4mbmJzcDtOb3RlJm5ic3A7dGhhdCZuYnNwO3RoaXMmbmJzcDtsaXN0Jm5ic3A7aXMmbmJzcDthdXRvbWF0aWNhbGx5Jm5ic3A7Y3JlYXRlZCZuYnNwO2FuZCZuYnNwO21haW50YWluZWQuJm5ic3A7VGhlc2UmbmJzcDt2YWx1ZXMmbmJzcDtkb24ndCZuYnNwO25lZWQmbmJzcDt0byZuYnNwO2JlJm5ic3A7YW5kJm5ic3A7c2hvdWxkJm5ic3A7bm90Jm5ic3A7YmUmbmJzcDttYW51YWxseSZuYnNwO2VkaXRlZC48YnI+CitPdXRwdXRzOjxicj4KK1tSZWFsXSZuYnNwO1RoZSZuYnNwO3Jlc3VsdGluZyZuYnNwO3JhbmRvbSZuYnNwO251bWJlciZuYnNwO2Jhc2VkJm5ic3A7b24mbmJzcDt0aGUmbmJzcDtjdXJyZW50Jm5ic3A7YWdlbnQmbmJzcDtzdGF0ZSZuYnNwO2FuZCZuYnNwO3RoZSZuYnNwO2lucHV0Jm5ic3A7cGFyYW1ldGVycy48YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3Jvc3MgRGlzdHJpYnV0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ3Jvc3NfRGlzdHJpYnV0aW9uIj48L2E+Q3Jvc3MgRGlzdHJpYnV0aW9uPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgdmFsdWUgdGFrZW4gZnJvbSBhIHNldCBvZiAoYXV0by1nZW5lcmF0ZWQpIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGVhY2ggc3RhdGUgaW5jbHVkZWQuIEZvciBleGFtcGxlLCBpZiB0aGUgbXVsdGktdmFsdWVzIGluY2x1ZGVkIGEgc3RhdGUgWCB3aXRoIHZhbHVlcyBBIGFuZCBCIGFuZCBhIHN0YXRlIFkgd2l0aCB2YWx1ZXMgSSBhbmQgSUksIHRoaXMgZGlzdHJpYnV0aW9uIHdvdWxkIGNyZWF0ZSBzZXBhcmF0ZSBpbnB1dCBhdHRyaWJ1dGVzIGZvciBBSSwgQUlJLCBCSSBhbmQgQklJLiBUaGVuIGZvciBhbiBhZ2VudCB3aXRoIFN0YXRlcyBBIGFuZCBJSSB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJldHVybiB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBBSUkgaW5wdXQgYXR0cmlidXRlLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwO1RoZSZuYnNwO2xpc3QmbmJzcDtvZiZuYnNwO3N0YXRlcyZuYnNwO3RvJm5ic3A7ZmFjdG9yJm5ic3A7aW50byZuYnNwO3RoZSZuYnNwO2Rpc3RyaWJ1dGlvbi4mbmJzcDtUaGlzJm5ic3A7aXMmbmJzcDthJm5ic3A7bXVsdGktYXJndW1lbnQsJm5ic3A7d2hpY2gmbmJzcDttZWFucyZuYnNwO3RoYXQmbmJzcDt5b3UmbmJzcDtjYW4mbmJzcDtzcGVjaWZ5Jm5ic3A7YW55Jm5ic3A7bnVtYmVyJm5ic3A7b2YmbmJzcDthdHRyaWJ1dGVzJm5ic3A7YXMmbmJzcDthcmd1bWVudHMuPGJyPgorW1JlYWxdJm5ic3A7VGhlJm5ic3A7c2V0Jm5ic3A7b2YmbmJzcDthdHRyaWJ1dGVzJm5ic3A7dGhhdCZuYnNwO3doZW4mbmJzcDttdWx0aXBsaWVkJm5ic3A7YWdhaW5zdCZuYnNwO2VhY2gmbmJzcDtvdGhlciZuYnNwO3dpbGwmbmJzcDtkZXRlcm1pbmUmbmJzcDt0aGUmbmJzcDt2YWx1ZSZuYnNwO29mJm5ic3A7dGhlJm5ic3A7ZnVuY3Rpb24mbmJzcDtyZXN1bHQmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO3N0YXRlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDthZ2VudC4mbmJzcDtOb3RlJm5ic3A7dGhhdCZuYnNwO3RoaXMmbmJzcDtsaXN0Jm5ic3A7aXMmbmJzcDthdXRvbWF0aWNhbGx5Jm5ic3A7Y3JlYXRlZCZuYnNwO2FuZCZuYnNwO21haW50YWluZWQuJm5ic3A7VGhlc2UmbmJzcDt2YWx1ZXMmbmJzcDtkb24ndCZuYnNwO25lZWQmbmJzcDt0byZuYnNwO2JlJm5ic3A7YW5kJm5ic3A7c2hvdWxkJm5ic3A7bm90Jm5ic3A7YmUmbmJzcDttYW51YWxseSZuYnNwO2VkaXRlZC48YnI+CitPdXRwdXRzOjxicj4KK1tSZWFsXSZuYnNwO1RoZSZuYnNwO3Jlc3VsdGluZyZuYnNwO3ZhbHVlJm5ic3A7YmFzZWQmbmJzcDtvbiZuYnNwO3RoZSZuYnNwO2N1cnJlbnQmbmJzcDthZ2VudCZuYnNwO3N0YXRlJm5ic3A7YW5kJm5ic3A7dGhlJm5ic3A7aW5wdXQmbmJzcDtwYXJhbWV0ZXJzLjxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBZGRpdGl2ZSBEaXN0cmlidXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBZGRpdGl2ZV9EaXN0cmlidXRpb24iPjwvYT5BZGRpdGl2ZSBEaXN0cmlidXRpb248L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSB2YWx1ZSB0YWtlbiBmcm9tIGEgc2V0IG9mIChhdXRvLWdlbmVyYXRlZCkgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgY29tYmluZWQgdmFsdWVzIG9mIHRoZSBzdGF0ZXMgcHJvdmlkZWQuIEZvciBleGFtcGxlLCBpZiB0aGUgbXVsdGktdmFsdWVzIGluY2x1ZGVkIGEgc3RhdGUgWCB3aXRoIHZhbHVlcyBBIGFuZCBCIGFuZCBhIHN0YXRlIFkgd2l0aCB2YWx1ZXMgSSBhbmQgSUksIHRoaXMgZGlzdHJpYnV0aW9uIHdvdWxkIGNyZWF0ZSBpbnB1dCBhdHRyaWJ1dGVzIGZvciBBLCBCLCBJIGFuZCBJSS4gVGhvc2UgdmFsdWVzIHdvdWxkIHRoZW4gYmUgYWRkZWQgdG9nZXRoZXIsIHNvIHRoYXQgZm9yIGFuIEFnZW50IHdpdGggc3RhdGUgQSBhbmQgSUkgdGhpcyBmdW5jdGlvbiB3b3VsZCByZXR1cm4gQSArIElJLjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+SW5wdXRzOjxicj4KK1tHZW5lcmljXSZuYnNwO1RoZSZuYnNwO3N0YXRlcyZuYnNwO3RvJm5ic3A7aW5jbHVkZSZuYnNwO2luJm5ic3A7dGhlJm5ic3A7ZGlzdHJpYnV0aW9uLiZuYnNwO1RoaXMmbmJzcDtpcyZuYnNwO2EmbmJzcDttdWx0aS1hcmd1bWVudCwmbmJzcDt3aGljaCZuYnNwO21lYW5zJm5ic3A7dGhhdCZuYnNwO3lvdSZuYnNwO2NhbiZuYnNwO3NwZWNpZnkmbmJzcDthbnkmbmJzcDtudW1iZXImbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDthcyZuYnNwO2FyZ3VtZW50cy48YnI+CitbUmVhbF0mbmJzcDtUaGUmbmJzcDtzZXQmbmJzcDtvZiZuYnNwO2F0dHJpYnV0ZXMmbmJzcDt0aGF0Jm5ic3A7d2hlbiZuYnNwO2NvbWJpbmVkJm5ic3A7d2l0aCZuYnNwO2VhY2gmbmJzcDtvdGhlciZuYnNwO2RldGVybWluZSZuYnNwO3RoZSZuYnNwO3ZhbHVlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDtmdW5jdGlvbiZuYnNwO3Jlc3VsdCZuYnNwO2Jhc2VkJm5ic3A7b24mbmJzcDt0aGUmbmJzcDtjdXJyZW50Jm5ic3A7c3RhdGUmbmJzcDtvZiZuYnNwO3RoZSZuYnNwO2FnZW50LiZuYnNwO05vdGUmbmJzcDt0aGF0Jm5ic3A7dGhpcyZuYnNwO2xpc3QmbmJzcDtpcyZuYnNwO2F1dG9tYXRpY2FsbHkmbmJzcDtjcmVhdGVkJm5ic3A7YW5kJm5ic3A7bWFpbnRhaW5lZC4mbmJzcDtUaGVzZSZuYnNwO3ZhbHVlcyZuYnNwO2Rvbid0Jm5ic3A7bmVlZCZuYnNwO3RvJm5ic3A7YmUmbmJzcDthbmQmbmJzcDtzaG91bGQmbmJzcDtub3QmbmJzcDtiZSZuYnNwO21hbnVhbGx5Jm5ic3A7ZWRpdGVkLjxicj4KK091dHB1dHM6PGJyPgorW1JlYWxdJm5ic3A7VGhlJm5ic3A7cmVzdWx0aW5nJm5ic3A7dmFsdWUmbmJzcDtiYXNlZCZuYnNwO29uJm5ic3A7dGhlJm5ic3A7Y3VycmVudCZuYnNwO2FnZW50Jm5ic3A7c3RhdGUmbmJzcDthbmQmbmJzcDt0aGUmbmJzcDtpbnB1dCZuYnNwO3BhcmFtZXRlcnMuPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeGFtcGxlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkV4YW1wbGVzIj48L2E+RXhhbXBsZXM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwYXRpYWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTcGF0aWFsXzIiPjwvYT5TcGF0aWFsPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZvciBleGFtcGxlcyBvZiBob3cgc3BhdGlhbCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgd2l0aGluIGFjdGlvbiBmbG93cyB0byBwcm92aWRlIGFnZW50cyB3aXRoIGNvbXBsZXggbW92ZW1lbnQgYmVoYXZpb3JzLCBzZWUgdGhlIE1vZGVsZXJzIEd1aWRlIGFjdGlvbnMgZXhhbXBsZXMuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmcm9tIHRoYXQgc2VjdGlvbiwgd2UgZGVmaW5lIGFuIGFjdGlvbiB0aGF0IGNhdXNlcyBhIHBhcnRuZXIgYWdlbnQgdG8gbW92ZSB0byBhbiBhdmFpbGFibGUgbmVpZ2hib3Jpbmcgc3BhY2UuPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZU5ldy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR3JhcGhpYyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdyYXBoaWNfMiI+PC9hPkdyYXBoaWM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SW4gdGhlIGZvbGxvd2luZyBhY3Rpb24gZmxvdyBmb3IgdGhlIGVwaWRlbWljIHN0eWxlLCB3ZSd2ZSBjcmVhdGUgUXVlcnkgQWN0aW9ucyB0byBkZXRlcm1pbmUgZWFjaCBhZ2VudCdzIGN1cnJlbnQgc3RhdGUsIHBpY2tlZCBhIGNvbG9yIGJhc2VkIG9uIHRoYXQsIGFuZCB0aGVuIHVzZWQgYSBzaGFyZWQgdGFyZ2V0IHRvIHNlbGVjdCBhIHNoYXBlIGZvciB0aGUgYWdlbnQgc3R5bGUgYW5kIGZpbGwgaXQ6PC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZnVuY3Rpb25zL0dyYXBoaWNzRnVuY3Rpb25FeGFtcGxlRGVzaWduLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5BZnRlciBzYXZpbmcgdGhlIG1vZGVsIHdlIGNhbiBleGVjdXRlIHRoZSB0d28gYW5kIHRocmVlIGRpbWVuc2lvbmFsIHZpc3VhbGl6YXRpb25zLiBOb3RlIHNvbWV0aGluZyByZWFsbHkgbmljZSAtLSBldmVuIHRoZSBjaGFydHMgaGF2ZSB1c2VkIHRoZSBjb2xvcnMgd2UndmUgZGVmaW5lZCE8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9mdW5jdGlvbnMvR3JhcGhpY3NGdW5jdGlvbkV4YW1wbGVSdW4ucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpc3RyaWJ1dGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkRpc3RyaWJ1dGlvbl8yIj48L2E+RGlzdHJpYnV0aW9uPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2Ugd2FsayB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIHVzaW5nIGEgZGlzdHJpYnV0aW9uIGZ1bmN0aW9ucywgZGVtb25zdHJhdGluZyBob3cgd2UgY2FuIGVhc2lseSBtb2RpZnkgdGhlIEVwaWRlbWljIG1vZGVsIHNvIHRoYXQgaW5zdGVhZCBvZiBzaW1wbHkgc2V0dGluZyBhbiBpbml0aWFsIGV4cG9zZWQgcG9wdWxhdGlvbiwgd2UgY2FuIGRlZmluZSBmYWN0b3JzIHRoYXQgdGFrZSB0b2dldGhlciB3aWxsIGRldGVybWluZSBhbiBpbmRpdmlkdWFscyBpbml0aWFsIGV4cG9zdXJlIHN0YXRlLiBXZSBzaW1wbHk6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkNyZWF0ZSBhbiBFdmFsdWF0ZSBBY3Rpb24gY2FsbGVkICJJbml0aWFsIFN0YXR1cyIuIDwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlNldCB0aGUgZnVuY3Rpb24gdG8gIkNyb3NzIERpc3RyaWJ1dGlvbiI8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5PcGVuZWQgdGhlICJNdWx0aXBsZSBWYWx1ZSIgbm9kZSBpbiB0aGUgZWRpdG9yLCBhbmQgY2xpY2tlZCB0aGUgIk11bHRpcGxlIFZhbHVlcyIgaXRlbSB3aXRoaW4gaXQuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+U2VsZWN0ZWQgdGhlICJTdGF0dXMiIGF0dHJpYnV0ZS48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbkNob2ljZS5wbmciPjwvZGl2PgorPHA+IAorCQkJCQkKKzwvcD4KKzxwPlRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBtb2RlbCwgYXMgeW91IGNhbiBzZWUgYmVsb3cuPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbi5wbmciPjwvZGl2PgorPHA+IAorCQkJCQkKKzwvcD4KKzxwPkluIG9yZGVyIHRvIGFzc2lnbiB0aGVzZSB2YWx1ZXMgdG8gdGhlIGFnZW50LCB3ZSdkIHNpbXBseSBuZWVkIHRvIGFzc2lnbiB0aGUgcmVzdWx0cyBvZiB0aGlzIEV2YWx1YXRlIEFjdGlvbiB0byB0aGUgYWdlbnQuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJSZWZlcmVuY2UiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSZWZlcmVuY2VfMyI+PC9hPlJlZmVyZW5jZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGlhZ3JhbXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEaWFncmFtc18zIj48L2E+RGlhZ3JhbXM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIG1heSBiZSBoZWxwZnVsIHRvIHJlYWRlcnMgZmFtaWxpYXIgd2l0aCBVTUwgYW5kIE1ldGEtbW9kZWxpbmc6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1ldGEtQ2xhc3NlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1ldGEtQ2xhc3Nlc18zIj48L2E+TWV0YS1DbGFzc2VzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9mdW5jdGlvbnMvRnVuY3Rpb25zRGlhZ3JhbS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJuYXZmb290ZXIiPgorPGhyPgorPHRhYmxlIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIiB3aWR0aD0iMTAwJSI+Cis8dHI+Cis8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPlByZXY8L2E+Jm5ic3A7PC90ZD48dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIwJSI+Jm5ic3A7PC90ZD48dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDs8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPkNoYXB0ZXImbmJzcDsxLiZuYnNwO0ludHJvZHVjdGlvbiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7My4mbmJzcDtVc2VyIEd1aWRlPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9OZXdfYW5kX05vdGV3b3J0aHkuaHRtbCBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL05ld19hbmRfTm90ZXdvcnRoeS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmY1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9OZXdfYW5kX05vdGV3b3J0aHkuaHRtbApAQCAtMCwwICsxLDQwMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNoYXB0ZXImbmJzcDs3LiZuYnNwO05ldyBhbmQgTm90ZXdvcnRoeTwvdGl0bGU+Cis8bGluayBocmVmPSJib29rLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cis8bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43Ni4wIiBuYW1lPSJnZW5lcmF0b3IiPgorPGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEd1aWRlIj4KKzxsaW5rIHJlbD0icHJldiIgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7Ni4mbmJzcDtJbnN0YWxsYXRpb24gR3VpZGUiPgorPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJSZXNvdXJjZXMuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs4LiZuYnNwO1Jlc291cmNlcyI+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+Cis8ZGl2IGNsYXNzPSJuYXZoZWFkZXIiPgorPHRhYmxlIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIiB3aWR0aD0iMTAwJSI+Cis8dHI+Cis8dGggYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMyI+Q2hhcHRlciZuYnNwOzcuJm5ic3A7TmV3IGFuZCBOb3Rld29ydGh5PC90aD4KKzwvdHI+Cis8dHI+Cis8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwiPlByZXY8L2E+Jm5ic3A7PC90ZD48dGggYWxpZ249ImNlbnRlciIgd2lkdGg9IjYwJSI+Jm5ic3A7PC90aD48dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjAlIj4mbmJzcDs8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9IlJlc291cmNlcy5odG1sIj5OZXh0PC9hPjwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzxocj4KKzwvZGl2PgorPGRpdiBjbGFzcz0iY2hhcHRlciIgdGl0bGU9IkNoYXB0ZXImbmJzcDs3LiZuYnNwO05ldyBhbmQgTm90ZXdvcnRoeSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5ld19hbmRfTm90ZXdvcnRoeSI+PC9hPkNoYXB0ZXImbmJzcDs3LiZuYnNwO05ldyBhbmQgTm90ZXdvcnRoeTwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJ0b2MiPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sI1JlbGVhc2VfMC44LjAiPlJlbGVhc2UgMC44LjA8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCNNb2RlbF9WaXN1YWxpemF0aW9uIj5Nb2RlbCBWaXN1YWxpemF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwjTW9kZWxpbmdfRnJhbWV3b3JrIj5Nb2RlbGluZyBGcmFtZXdvcms8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCNNb2RlbF9FZGl0aW5nIj5Nb2RlbCBFZGl0aW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwjTW9kZWxpbmdfVG9vbHMiPk1vZGVsaW5nIFRvb2xzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwjVXNlcl9FeHBlcmllbmNlIj5Vc2VyIEV4cGVyaWVuY2U8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlbGVhc2UgMC44LjAiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IlJlbGVhc2VfMC44LjAiPjwvYT5SZWxlYXNlIDAuOC4wPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBmaXJzdCBvZmZpY2lhbCByZWxlYXNlIG9mIEFNUCBpbmNsdWRlcyBtYW55IG5ldyBvciBleHBhbmRlZCBmZWF0dXJlcyBpbiBhZGRpdGlvbiB0byBvdmVyYWxsIHF1YWxpdHkgYW5kIHVzYWJpbGl0eSBpbXByb3ZlbWVudHMuIFRoZSBoaWdobGlnaHRzIGFyZSBsaXN0ZWQgYmVsb3cuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsIFZpc3VhbGl6YXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RlbF9WaXN1YWxpemF0aW9uIj48L2E+TW9kZWwgVmlzdWFsaXphdGlvbjwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8dGFibGUgaWQ9Ik4xMTRENyI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5HcmFwaCBWaXN1YWxpemF0aW9uPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJPC90ZD4KKwkJCQkJCTx0ZD5CdWlsdCBpbiBzdXBwb3J0IGZvciB2aXN1YWxpemF0aW9uIGFuZCBnZW5lcmF0aW9uIChhcyBhbHdheXMgd2l0aCBBTUYsIG5vIGNvZGUgdG8gd3JpdGUhKSBvZiBncmFwaCBtb2RlbHMuPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaC5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz4zRCBWaWV3IEltcHJvdmVtZW50czwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+MiAxLzIgdmlzdWFsaXphdGlvbnMgbm93IHN1cHBvcnQgaW50ZXJwb2xhdGVkIHBvc2l0aW9ucyBmb3IgYWdlbnRzLiBZb3UgY2FuJ3Qgc2VlIHRoYXQgaGVyZSwgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIGFnZW50cyBtb3ZlIHNtb290aGx5IHRocm91Z2ggc3BhY2UsIGV2ZW4gaWYgdGhleSBhcmUgb24gYSBmaXhlZCBncmlkLiBZb3UgY2FuIHR1cm4gdGhhdCBmZWF0dXJlIG9uIGFuZCBvZmYgYW5kIHlvdSBjYW4gY2hhbmdlIHBlcnNwZWN0aXZlIGVhc2lseS48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4mbmJzcDs8L3RkPgorCQkJCQkJPHRkPgorCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlldzNELnBuZyI+PC9kaXY+CisJCQkJCQkKKzwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPgorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkFQSSBJbXByb3ZlbWVudHM8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPlRoZXJlIGhhdmUgYmVlbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSBBUElzLiBBcyBhbHdheXMsIHdlJ3ZlIGZvbGxvd2VkIGNvbW1vbiBFY2xpcHNlIGFuZCBFTUYgaWRpb21zLCB3aGljaCBtZWFucyB0aGF0IHRvIGN1c3RvbWl6ZSBtb2RlbCB2aXN1YWxpemF0aW9uIHlvdSB0eXBpY2FsbHkgb25seSBuZWVkIHRvIGltcGxlbWVudCBmaWd1cmUsIHNoYXBlIG9yIGNvbG9yIHByb3ZpZGVycyBhbmQgdGhlbiBhZGFwdCB0aGVtIHRvIHlvdXIgbW9kZWwuIEFuZCBvZiBjb3Vyc2UgYWxsIG9mIHlvdXIgZXhpc3RpbmcgbW9kZWxzIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIG5ldyBBUElzLjwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPgorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPk1vcmUgTGVnYWN5IFZpZXdzPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJPC90ZD4KKwkJCQkJCTx0ZD5JbiBhZGRpdGlvbiwgd2UndmUgc3VwcG9ydGVkIGFsbCBleGlzdGluZyBBc2NhcGUgdmlld3MgKG5vdCBhbGwgb2YgdGhlc2UgYXJlIHN1cHBvcnRlZCB0aHJvdWdoIEFNRiBnZW5lcmF0ZWQgY29kZS4ueWV0ISkuPC90ZD4KKwkJCQkJCis8L3RyPgorPC90YWJsZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsaW5nIEZyYW1ld29yayI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vZGVsaW5nX0ZyYW1ld29yayI+PC9hPk1vZGVsaW5nIEZyYW1ld29yazwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8dGFibGUgaWQ9Ik4xMTUzRSI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5OZXcgQWN0aW9uczwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+U29tZSBrZXkgbmV3IEFjdGlvbnMgaGF2ZSBqdXN0IGJlZW4gaW50cm9kdWNlZC4gVGhlc2UgcHJvdmlkZSBzdXBwb3J0IGZvciByZWN1cnNpb24gKENhdXNlIGFuZCBQZXJmb3JtKSwgbWluaW1pemF0aW9uIGFuZCBtYXhpbWl6YXRpb24gcXVlcmllcywgZGlmZnVzaW9uIChEaWZmdXNlKSBhbmQgZGVyaXZlZCAoRGVyaXZlKSB2YWx1ZXMgYW5kIGdpdmUgdGhlIGZyYW1ld29yayBhIG11Y2ggbW9yZSBnZW5lcmFsIHB1cnBvc2UgZmxhdm9yIHdoaWxlIHByZXNlcnZpbmcgbW9kZWwgZ2VuZXJhbGl0eS4gWW91IHNob3VsZCBiZSBhYmxlIHRvIGJ1aWxkIG1hbnkgbW9yZSBraW5kcyBvZiBtb2RlbHMgd2l0aG91dCByZXNvcnRpbmcgdG8gY3VzdG9tIGNvZGluZy4gU2VlIHRoZSBNb2RlbGVyJ3MgZ3VpZGUgQWN0aW9ucyBzZWN0aW9uIGZvciB0aGUgZGV0YWlscy48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5JbXByb3ZlZCBNb2RlbCBSZXByZXNlbnRhdGlvbiBhbmQgR2VuZXJhdGlvbjwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+VGhlcmUgaGF2ZSBiZWVuIG1hbnkgaW1wcm92ZW1lbnRzIHRvIGhvdyBtb2RlbHMgY2FuIGJlIGRlc2lnbmVkIGFuZCB0aGUgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCBmcm9tIHRob3NlIGRlc2lnbnMuIEFzIGp1c3Qgb25lIGV4YW1wbGUsIHlvdSBjYW4gbm93IHNlYXJjaCBmb3IgYWdlbnRzIHdpdGhpbiBhIG1vZGVsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgYW4gZXhwbGljaXQgc3BhY2UuIEFzIHdpdGggbW9kZWwgZWRpdGluZyBpbXByb3ZlbWVudHMsIG1hbnkgb2YgdGhlc2UgY2hhbmdlcyBoYXZlIGJlZW4gZHJpdmVuIGJ5IHVzZXIgaW5wdXQuIElmIHRoZXJlIGlzIHNvbWV0aGluZyB5b3UnZCBsaWtlIHRvIGJlIGFibGUgdG8gZG8gd2l0aCBBTUYgYnV0IGNhbid0LCBsZXQgdXMga25vdyBieSBmaWxpbmcgYSBmZWF0dXJlIHJlcXVlc3Qgb3IgcG9zdGluZyB0byB0aGUgbmV3c2dyb3VwLjwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPgorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPk11bHRpc2NhbGUgU3VwcG9ydDwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+U3VwcG9ydCBmb3IgbW9kZWxpbmcgYWNyb3NzIHNjYWxlcyBoYXMgYmVlbiBncmVhdGx5IGltcHJvdmVkLiBGb3IgdGhlIEVzY2FwZSB0YXJnZXQgaXQgaXMgdmVyeSBlYXN5IHRvIGRlZmluZSBtb2RlbHMgd2l0aCBlbmNsb3NpbmcgaGllcmFyY2hpZXMuIEZvciBleGFtcGxlIGluIHRoZSBFcGlkZW1pY1JlZ2lvbiBtb2RlbCwgd2UndmUgZGVmaW5lZCBSZWdpb25zIHdoaWNoIGNvbnRhaW4gQ2l0aWVzIHdoaWNoIGNvbnRhaW4gSW5kaXZpZHVhbHMuPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhhbXBsZXMvRXBpZGVtaWNSZWdpb25hbC5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4mbmJzcDs8L3RkPgorCQkJCQkJPHRkPldoZW4gdGhlIG1vZGVsIGlzIGV4ZWN1dGVkLCB2aWV3cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciBlYWNoIG1lbWJlciBTY2FwZSAoY29udGV4dCkgYW5kIGRhdGEgaXMgY29sbGVjdGVkIGZvciBlYWNoIGxldmVsIG9mIHNjYWxlLjwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPiZuYnNwOzwvdGQ+CisJCQkJCQk8dGQ+CisJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2V4YW1wbGVzL0VwaWRlbWljUmVnaW9uYWxSdW4ucG5nIj48L2Rpdj4KKwkJCQkJCQorPC90ZD4KKwkJCQkJCis8L3RyPgorPC90YWJsZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsIEVkaXRpbmciPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RlbF9FZGl0aW5nIj48L2E+TW9kZWwgRWRpdGluZzwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8dGFibGUgaWQ9Ik4xMTVBMSI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5PdmVyYWxsIFVzYWJpbGl0eTwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+U2lnbmlmaWNhbnQgZWZmb3J0IGhhcyBnb25lIGludG8gaW1wcm92aW5nIHRoZSBvdmVyYWxsIHVzZXIgaW50ZXJmYWNlIGZvciBlZGl0aW5nIG1vZGVscy4gVXNlciBmZWVkYmFjayBoYXMgYmVlbiBlbm9ybW91c2x5IGhlbHBmdWwgaGVyZSAtLSBwbGVhc2Uga2VlcCBsZXR0aW5nIHVzIGtub3cgd2hhdCB3b3JrcyBhbmQgd2hhdCBkb2Vzbid0ISBJbiBhZGRpdGlvbiB0byB0aGUgb2J2aW91cyBjaGFuZ2VzLCBhIGxvdCBvZiB3b3JrIGhhcyBiZWVuIGRvbmUgdW5kZXIgdGhlIGNvdmVycyB0byBwcm92aWRlIGEgbW9yZSBzZWFtbGVzcyBtb2RlbCBidWlsZGluZyBleHBlcmllbmNlLiBXZSd2ZSBmaXhlZCBzb21lIGdsaXRjaGVzLCBidXQgd2UndmUgYWxzbyBhZGRlZCBhIG51bWJlciBvZiB0aGluZ3MgdG8gaGVscCBzaW1wbGlmeSBhbmQgYXV0b21hdGUgdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuIEFzIGFuIGV4YW1wbGUsIHdoZW4geW91IGNyZWF0ZSBhbiBhZ2VudCwgYSBzdHlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmcgd2l0aCBkZWZhdWx0IGNvbG9yLCBzaGFwZSBhbmQgcGFpbnQgYWN0aW9ucy48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5OZXcgSWNvbnM8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPk1vc3Qgb2YgdGhlIGV4aXN0aW5nIGljb25zIGhhdmUgYmVlbiByZXBsYWNlZCBvciBjdXN0b20gZGVzaWduZWQgKHdoaWNoIGhhcyBpbmNpZGVudGFsbHkgcmVxdWlyZWQgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB0byBiZSByZWNyZWF0ZWQpIHRvIHByb3ZpZGUgYSBiZXR0ZXIgYW5kIG1vcmUgY29uc2lzdGVudCB1c2VyIGludGVyZmFjZS48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5BY3Rpb24gTGlzdHM8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPkFjdGlvbnMgYXJlIG5vdyBkaXNwbGF5ZWQgaW4gbGlzdHMsIG5vdCBpbiBhIHRyZWUgc3RydWN0dXJlLiBBcyB0aGUgYWN0dWFsIEFjdGlvbnMgYXJlIGdyYXBoIHN0cnVjdHVyZXMsIHRoZSB0cmVlIHN0cnVjdHVyZSBuZXZlciBtYXRjaGVkIHdlbGwgd2l0aCB0aGlzIHJlcHJlc2VudGF0aW9uLiBUYWtpbmcgYSBzaW1wbGVyIGFwcHJvYWNoIGhhcyBtYWRlIHRoZSBhY3Rpb24gZGVmaW5pdGlvbiBwcm9jZXNzIG11Y2ggbW9yZSB0cmFuc3BhcmVudC48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4mbmJzcDs8L3RkPgorCQkJCQkJPHRkPgorCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9BY3Rpb25zRXhhbXBsZS5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTW9kZWxpbmcgVG9vbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RlbGluZ19Ub29scyI+PC9hPk1vZGVsaW5nIFRvb2xzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzx0YWJsZSBpZD0iTjExNUU3Ij4KKzx0cj4KKwkJCQkJCQorPHRkPgorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlBhcmFtZXRlciBNYW5hZ2VtZW50IFN1cHBvcnQ8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPkFNUCBub3cgaGFzIGZ1bGwgc3VwcG9ydCBmb3IgZWRpdGluZyBhbmQgbGF1bmNoaW5nIG9mIHBhcmFtZXRlciBmaWxlcywgaW5jbHVkaW5nIGNvZGUgY29tcGxldGlvbiBhbmQgYWxsIG9mIHRoZSBvdGhlciBlZGl0b3IgbmljZXRpZXMuPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvcGFyYW1zL0VkaXQucG5nIj48L2Rpdj4KKwkJCQkJCQorPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+CisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+VGVzdC1Ecml2ZW4gTW9kZWxpbmcgYW5kIFNpbXVsYXRpb248L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPlRlc3RzIGNhbiBub3cgZWFzaWx5IGJlIGRlZmluZWQgYW5kIGFuYWx5emVkLjwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPiZuYnNwOzwvdGQ+CisJCQkJCQk8dGQ+CisJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3BhcmFtcy9UZXN0UmVzdWx0cy5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5BdXRvbWF0ZWQgRGF0YSBFeHBvcnQ8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPkRhdGEgY2FuIG5vdyBiZSBlYXNpbHkgZ2VuZXJhdGVkIHRvIGEgY29tbW9uIEVNRiBiYXNlZCAoYWRhdGEpIGRhdGEgZm9ybWF0LjwvdGQ+CisJCQkJCQorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJVc2VyIEV4cGVyaWVuY2UiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJVc2VyX0V4cGVyaWVuY2UiPjwvYT5Vc2VyIEV4cGVyaWVuY2U8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHRhYmxlIGlkPSJOMTE2M0UiPgorPHRyPgorCQkJCQkJCis8dGQ+CisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+T3ZlcmFsbDwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+TGFzdCBidXQgY2VydGFpbmx5IG5vdCBsZWFzdCwgYSBsb3Qgb2YgZWZmb3J0IGhhcyBnb25lIGludG8gbWFraW5nIGl0IGVhc2llciB0byBnZXQgaW50byBBTVAgYXMgd2VsbCBhcyB0byB1bmRlcnN0YW5kIGhvdyB0byB3b3JrIHdpdGggaXRzIG1vcmUgcG93ZXJmdWwgZmVhdHVyZXMuIEVjbGlwc2Ugc3VwcG9ydHMgYSBudW1iZXIgb2Ygc29waGlzdGljYXRlZCBVc2VyIEFzc2lzdGFuY2UgZmVhdHVyZXMsIGFuZCB3ZSd2ZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgbW9zdCBvZiB0aGVtLjwvdGQ+CisJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQorPHRkPgorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkRvY3VtZW50YXRpb248L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPk92ZXIgYSAxMDAgcGFnZXMgb2YgZG9jdW1lbnRhdGlvbiwgcGx1cyBhbm90aGVyIDEwMCBwYWdlcyBvZiBBc2NhcGUgZG9jdW1lbnRhdGlvbiBjb252ZXJ0ZWQgdG8gRWNsaXBzZSBIZWxwIGFuZCBQREYuPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+CisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+V2VsY29tZSBhbmQgSW50cm88L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPldoZW4gc3RhcnRpbmcgQU1QIHlvdSdsbCBiZSBtZXQgYnkgYSBjdXN0b20gd2VsY29tZSBzY3JlZW4gcHJvdmlkaW5nIGFuIGVhc3kgcGF0aCBpbnRvIEFnZW50IE1vZGVsaW5nIG9uIEVjbGlwc2UuPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdXNlcnMvV2VsY29tZVNjcmVlbi5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5DaGVhdCBTaGVldHM8L3N0cm9uZz48L3NwYW4+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkPkhlbHBmdWwgZ3VpZGVzIHdhbGsgeW91IHRocm91Z2ggaW5pdGlhbCBzdGVwcy48L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4mbmJzcDs8L3RkPgorCQkJCQkJPHRkPgorCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy91c2Vycy9DaGVhdFNoZWV0cy5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD4KKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5JbnRlZ3JhdGVkIE1vZGVsczwvc3Ryb25nPjwvc3Bhbj4KKwkJCQkJCTwvdGQ+CisJCQkJCQk8dGQ+WW91IGNhbiBydW4gZXhhbXBsZSBBc2NhcGUgbW9kZWxzIGRpcmVjdGx5IGZyb20gdGhlIGRvY3VtZW50YXRpb24hPC90ZD4KKwkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCis8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdXNlcnMvSW50ZWdyYXRlZE1vZGVscy5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj4KKzxocj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJSZXNvdXJjZXMuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPkNoYXB0ZXImbmJzcDs2LiZuYnNwO0luc3RhbGxhdGlvbiBHdWlkZSZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7OC4mbmJzcDtSZXNvdXJjZXM8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1Byb2dyYW1lcl9HdWlkZS5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvUHJvZ3JhbWVyX0d1aWRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYTY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1Byb2dyYW1lcl9HdWlkZS5odG1sCkBAIC0wLDAgKzEsNjUwIEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzUuJm5ic3A7UHJvZ3JhbWVyIEd1aWRlPC90aXRsZT4KKzxsaW5rIGhyZWY9ImJvb2suY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc2LjAiIG5hbWU9ImdlbmVyYXRvciI+Cis8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJUdXRvcmlhbHMuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFscyI+Cis8bGluayByZWw9Im5leHQiIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzYuJm5ic3A7SW5zdGFsbGF0aW9uIEd1aWRlIj4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5DaGFwdGVyJm5ic3A7NS4mbmJzcDtQcm9ncmFtZXIgR3VpZGU8L3RoPgorPC90cj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJUdXRvcmlhbHMuaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNjAlIj4mbmJzcDs8L3RoPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzUuJm5ic3A7UHJvZ3JhbWVyIEd1aWRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUHJvZ3JhbWVyX0d1aWRlIj48L2E+Q2hhcHRlciZuYnNwOzUuJm5ic3A7UHJvZ3JhbWVyIEd1aWRlPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InRvYyI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjT3ZlcnZpZXdfNiI+T3ZlcnZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjT25saW5lIj5PbmxpbmU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNVcGRhdGVfU2l0ZSI+VXBkYXRlIFNpdGU8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI0luc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXhhbXBsZV9KYXZhX01vZGVscyI+RXhhbXBsZSBKYXZhIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI0V4cGxvcmluZ19FeGFtcGxlX0FCTV9Nb2RlbHMiPkV4cGxvcmluZyBFeGFtcGxlIEFCTSBNb2RlbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNJbnN0YWxsaW5nX01vZGVscyI+SW5zdGFsbGluZyBNb2RlbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNHZW5lcmF0aW5nX01vZGVscyI+R2VuZXJhdGluZyBNb2RlbHM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRGV2ZWxvcGluZ19Nb2RlbHMiPkRldmVsb3BpbmcgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjQ2hlYXRzaGVldCI+Q2hlYXRzaGVldDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1N0ZXBzIj5TdGVwczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXhlY3V0aW5nX01vZGVscyI+RXhlY3V0aW5nIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1R1dG9yaWFsIj5UdXRvcmlhbDwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXh0ZW5kaW5nX2FuZF9DdXN0b21pemluZ19BTVAiPkV4dGVuZGluZyBhbmQgQ3VzdG9taXppbmcgQU1QPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjSW50ZWdyYXRpbmdfSmF2YV9hbmRfQU1GX01vZGVscyI+SW50ZWdyYXRpbmcgSmF2YSBhbmQgQU1GIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI01ldGhvZF9BY3Rpb24iPk1ldGhvZCBBY3Rpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNQcm90ZWN0ZWRfQ29kZV9SZWdpb25zIj5Qcm90ZWN0ZWQgQ29kZSBSZWdpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjSW50ZXJmYWNlX2FuZF9CYXNlX0NsYXNzX0dlbmVyYXRpb24iPkludGVyZmFjZSBhbmQgQmFzZSBDbGFzcyBHZW5lcmF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNDb252ZXJ0aW5nX0V4aXN0aW5nX0FzY2FwZV9Nb2RlbHMiPkNvbnZlcnRpbmcgRXhpc3RpbmcgQXNjYXBlIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI01vZGVsIj5Nb2RlbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1ZpZXciPlZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNDb252ZXJ0X3RoZV9sb3ctbGV2ZWxfaW1wb3J0c19mcm9tX0FXVF9hbmRfU3dpbmdfdG9fU1dUIj5Db252ZXJ0IHRoZSBsb3ctbGV2ZWwgaW1wb3J0cyBmcm9tIEFXVCBhbmQgU3dpbmcgdG8gU1dUPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjQ29udmVydF9jb2xvcl9mZWF0dXJlcyI+Q29udmVydCBjb2xvciBmZWF0dXJlczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI0NoYW5nZV9hZ2VudF9jb2xvcl9nZXR0ZXJzIj5DaGFuZ2UgYWdlbnQgY29sb3IgZ2V0dGVyczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI0dldF9yaWRfb2ZfaW1hZ2VfZmVhdHVyZXMiPkdldCByaWQgb2YgaW1hZ2UgZmVhdHVyZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNNb2RpZnlfdXNhZ2VzX29mX0RyYXdGZWF0dXJlcyI+TW9kaWZ5IHVzYWdlcyBvZiBEcmF3RmVhdHVyZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNDb25maWd1cmF0aW9uIj5Db25maWd1cmF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik92ZXJ2aWV3Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJPdmVydmlld182Ij48L2E+T3ZlcnZpZXc8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RXNjYXBlIGlzIGEgZnVsbC1mZWF0dXJlZCBBZ2VudC1CYXNlZCBNb2RlbGluZyAoQUJNKSBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50IChJREUpIHdpdGggYSBKYXZhIGJhc2VkIEFQSSBhbmQgZW5kIHVzZXIgbW9kZWxpbmcgdG9vbHMuIEl0J3MgYmFzZWQgb24gQXNjYXBlLCB3aGljaCBoYXMgYmVlbiBpbiB1c2UgZm9yIG1vcmUgdGhhbiAxMCB5ZWFycy4gVGhlIGNvcmUgQVBJIGlzIHZlcnkgc3RhYmxlLCBhbmQgdGhhdCBzaG91bGQgZ2l2ZSB1c2VycyBhIHdheSB0byBleHBsb3JlIHRoZSBmZWF0dXJlcyBvZiBBTVAgd2l0aG91dCBjb25jZXJucyBhYm91dCBrZWVwaW5nIGluIHN5bmNoIHdpdGggdGhlIHJhcGlkbHkgZXZvbHZpbmcgQVhGIC9BR0YgQVBJLiBJdCBhbGxvd3MgbW9kZWxlcnMgdG8gY29kZSBpbiBKYXZhIGFuZC9vciBnZW5lcmF0ZSBtb2RlbHMgd2l0aCBBTUYgYW5kIHRoZW4gZXhlY3V0ZSB0aG9zZSBtb2RlbHMgd2l0aGluIHRoZSBzYW1lIGRldmVsb3BtZW50IGVudmlyb25tZW50LjwvcD4KKzxwPgorCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9Fc2NhcGVFeGVjdXRpb25TY3JlZW5zaG90LnBuZyI+PC9kaXY+Cis8cD4KKwkJCQorPC9wPgorPHA+QSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlIEVzY2FwZSBwcm9qZWN0IC0tIGFwYXJ0IGZyb20gdGhlIG9idmlvdXMgZ29hbCBvZiBwcm92aWRpbmcgYSBuaWNlIEVjbGlwc2UgaG9zdGVkIEFCTSB0b29sa2l0IC0tIGlzIHRvIHByb3ZpZGUgYW4gZXhlbXBsYXIgdG8gZGVtb25zdHJhdGUgaG93IGFueSBhcmJpdHJhcnkgYWdlbnQgbW9kZWxpbmcgZnJhbWV3b3JrIGNhbiBiZSBpbnRlZ3JhdGVkIHdpdGhpbiB0aGUgQU1QIGVudmlyb25tZW50LiBBIGNvb2wgYXNwZWN0IG9mIHRoaXMgaXMgdGhhdCBBTVAgaGFzIG5vIGRlcGVuZGVuY2llcyBvbiBFc2NhcGUsIGJ1dCBhbHNvIHRoYXQgdGhlIHVuZGVybHlpbmcgQUJNIG1vZGVsaW5nIGZyYW1ld29yayBmb3IgRXNjYXBlIGhhcyBubyBkZXBlbmRlbmNpZXMgb24gQU1QIC0tIGluc3RlYWQgRXNjYXBlIHNpbXBseSBwcm92aWRlcyB0aGUgcnVudGltZSBnbHVlIGJldHdlZW4gQU1QIGFuZCB0aGUgQUJNIGZyYW1ld29yay4gVGhlIHVuZGVybHlpbmcgQUJNIGZyYW1ld29yayB1c2VzIHRoZSBBc2NhcGUgQVBJLCBhbiBBUEkgdGhhdCBmaXJzdCBiZWdhbiBkZXZlbG9wbWVudCBtb3JlIHRoYW4gdGVuIHllYXJzIGFnbyBhbmQgdGhhdCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgYXQgYWxsIGluIG9yZGVyIGZvciBpdCB0byB3b3JrIHdpdGhpbiB0aGUgQU1QIGVudmlyb25tZW50LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRvY3VtZW50YXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IkRvY3VtZW50YXRpb24iPjwvYT5Eb2N1bWVudGF0aW9uPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkluIGFkZGl0aW9uIHRvIHRoaXMgZG9jdW1lbnRhdGlvbiwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIHJlc291cmNlcyBhdmFpbGFibGUgcmVsYXRlZCB0byBFc2NhcGUgZGV2ZWxvcG1lbnQuIEJlY2F1c2UgaXQncyBBUEkgaXMgYmFzZWQgb24gQXNjYXBlLCBhIGxvdCBvZiByZXNvdXJjZXMgZGV2ZWxvcGVkIGZvciBBc2NhcGUgYXJlIGVxdWFsbHkgYXBwbGljYWJsZSB0byBBc2NhcGUuIFRoZSBBc2NhcGUgZG9jdW1lbnRhdGlvbiBpcyBidW5kbGVkIHdpdGggc29tZSBkaXN0cmlidXRpb25zIG9mIHRoZSBBTVAgdG9vbHMsIGJ1dCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBFY2xpcHNlIEFNUCBkb3dubG9hZCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIG9yIGluc3RhbGwgaXQgZnJvbSB0aGUgQXNjYXBlIHVwZGF0ZSBzaXRlLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPbmxpbmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPbmxpbmUiPjwvYT5PbmxpbmU8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlcmUgaXMgYSBjb21wbGV0ZSAKKwkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vYXNjYXBlLnNvdXJjZWZvcmdlLm5ldC9hcGkvaW5kZXguaHRtbCIgdGFyZ2V0PSJfbmV3Ij5KYXZhZG9jPC9hPiBhcyB3ZWxsIGFzIGFuIAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9hc2NhcGUuc291cmNlZm9yZ2UubmV0L2RvY3MvVGhlQXNjYXBlTWFudWFsNS5wZGYiIHRhcmdldD0iX25ldyI+ZXhjZWxsZW50IG1hbnVhbDwvYT4gYW5kIG90aGVyIHdlYiByZXNvdXJjZXMuIFNlZSB0aGUgCisJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2FzY2FwZS5zb3VyY2Vmb3JnZS5uZXQiIHRhcmdldD0iX25ldyI+QXNjYXBlIFdlYnNpdGU8L2E+IGZvciBnZW5lcmFsIGluZm9ybWF0aW9uLgorCQkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlVwZGF0ZSBTaXRlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVXBkYXRlX1NpdGUiPjwvYT5VcGRhdGUgU2l0ZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5PciwgeW91IGNhbiBpbnN0YWxsIHRoZSBBc2NhcGUgTWFudWFsIGludG8gdGhlIGVjbGlwc2UgaGVscCBzeXN0ZW0gYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdXBkYXRlIHNpdGUgYW5kIHNlbGVjdGluZyB0aGUgIkRvY3VtZW50YXRpb25zIGFuZCBTb3VyY2UgQ29kZSIgZmVhdHVyZS4gU2VlIHRoZSBJbnN0YWxsYXRpb24gR3VpZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5odHRwOi8vYXNjYXBlLnNvdXJjZWZvcmdlLm5ldC9lY2xpcHNlPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW5zdGFsbGF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJJbnN0YWxsYXRpb24iPjwvYT5JbnN0YWxsYXRpb248L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2VlIHRoZSBJbnN0YWxsYXRpb24gR3VpZGUgZm9yIERldGFpbGVkIEluZm9ybWF0aW9uIC0tIHRoYXQgYWxsIGFwcGxpZXMgdG8gZ2VuZXJhbCBFc2NhcGUgdXNhZ2UgYXMgd2VsbC48L3A+Cis8cD5Ob3RlIHRoYXQgdGhlcmUgYXJlIG5vIGRlcGVuZGVuZGVuY2llcyBvbiBBTUYsIGFuZCB0aGVyZWZvcmUgRU1GIG9yIGFueSBvdGhlciBtb2RlbGluZyB0ZWNobm9sb2dpZXMgdG8gZG8gSmF2YSBkZXZlbG9wbWVudCBmb3IgRXNjYXBlIG9yIGZvciBydW5uaW5nIGdlbmVyYXRlZCBtb2RlbHMgd2l0aGluIEVzY2FwZS4gVGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgY2FuIGJlIHF1aXRlIGxpZ2h0LXdlaWdodC4gU2ltcGx5IGluc3RhbGwgdGhlIEFYRiwgQUdGLCBhbmQgQU1QIEVzY2FwZSBmZWF0dXJlcy4gWW91IGNhbiBidWlsZCBmcm9tIHNvdXJjZSBidXQgaW4gdGhhdCBjYXNlIHlvdSdsIG5lZWQgdG8gbGF1bmNoIGEgc2VsZi1ob3N0ZWQgcnVudGltZSwgc28gaXQncyBiZXN0IHRvIHNpbXBseSBpbnN0YWxsIGZyb20gdGhlIHVwZGF0ZSBzaXRlIGlmIHlvdSdyZSBub3QgYWN0dWFsbHkgZG9pbmcgQU1QIGRldmVsb3BtZW50LjwvcD4KKzxwPkVzY2FwZSBpcyAKKwkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9hbXAvaW5zdGFsbGluZy8iIHRhcmdldD0iX25ldyI+aW5zdGFsbGVkPC9hPiBieSBkZWZhdWx0IHdpdGggdGhlIG90aGVyIG1vZGVsIGNvbXBvbmVudHMuIElmIHlvdSB3YW50IHRvIGRvIDNEIChyZWFsbHkgMiAxLzIpIHZpc3VhbGl6YXRpb25zLCB5b3Ugd2lsbCB3YW50IEFHRjNEIGFuZCB0aGUgTFdKR0wgZGVwZW5kZW5jeS4KKwkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4YW1wbGUgSmF2YSBNb2RlbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IkV4YW1wbGVfSmF2YV9Nb2RlbHMiPjwvYT5FeGFtcGxlIEphdmEgTW9kZWxzPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeHBsb3JpbmcgRXhhbXBsZSBBQk0gTW9kZWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRXhwbG9yaW5nX0V4YW1wbGVfQUJNX01vZGVscyI+PC9hPkV4cGxvcmluZyBFeGFtcGxlIEFCTSBNb2RlbHM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGZpcnN0IHRoaW5nIG1vc3QgcGVvcGxlIHdpbGwgd2FudCB0byBkbyBpbiBBTVAgaXMgdG8gcGxheSB3aXRoIHRoZSBleGFtcGxlIG1vZGVscy4gWW91IGNhbiBleHBsb3JlIEFNRiBtb2RlbHMgYXMgd2VsbCBhcyBzb21lIHJlYWxseSBpbnRlcmVzdGluZyBjbGFzc2ljIEFCTSBtb2RlbHMuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ikluc3RhbGxpbmcgTW9kZWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5zdGFsbGluZ19Nb2RlbHMiPjwvYT5JbnN0YWxsaW5nIE1vZGVsczwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgdGhlIEluc3RhbGxhdGlvbiBHdWlkZSB0byBmaW5kIG91dCBob3cgdG8gZ2V0IHRoZSBleGFtcGxlIG1vZGVscy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQU1GIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFNRl9Nb2RlbHMiPjwvYT5BTUYgTW9kZWxzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFsbCBBTUYgbW9kZWxzIHByb2R1Y2UgcHVyZSBKYXZhIGNvZGUgc28gdGhleSBjYW4gYmUgdXNlZCBsaWtlIGFueSBvdGhlciBFc2NhcGUgSmF2YSBtb2RlbC48L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPm9yZy5lY2xpcHNlLmFtcC9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPlRvIHVuZGVyc3RhbmQgdGhlIGNhcGFiaWxpdGllcyBvZiBBTUYgaW4gcHJvZHVjaW5nIG90aGVyIGtpbmRzIG9mIEphdmEgbW9kZWxzLCB5b3UgbWlnaHQgYWxzbyB3YW50IHRvIHRyeSBvdXQgcnVubmluZyB0aGUgc2FtZSBtb2RlbHMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZm9yIEFzY2FwZSBvciBSZXBhc3QuIFRoZXNlIGFyZSBsb2NhdGVkIGF0IGRldi5lY2xpcHNlLm9yZyBpbiBjdnNyb290L21vZGVsaW5nOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+b3JnLmVjbGlwc2UuYW1wL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5hc2NhcGU8YnI+CitvcmcuZWNsaXBzZS5hbXAvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLnJlcGFzdDxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDbGFzc2ljIEVzY2FwZSAvIEFzY2FwZSBKYXZhIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNsYXNzaWNfRXNjYXBlXy4yRl9Bc2NhcGVfSmF2YV9Nb2RlbHMiPjwvYT5DbGFzc2ljIEVzY2FwZSAvIEFzY2FwZSBKYXZhIE1vZGVsczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5NYW55IG1vZGVscyBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBBc2NhcGUgb3ZlciB0aGUgeWVhcnMsIGluY2x1ZGluZyBhbGwgb2YgdGhlIGNsYXNzaWMgbW9kZWxzIGNyZWF0ZWQgYXQgQnJvb2tpbmdzIGFuZCBzb21lIG90aGVyIGNvb2wgbW9kZWxzIHN1Y2ggYXMgQ3JhaWcgUmV5bm9sZCdzIEJvaWRzIGFuZCBhIHByZXR0eSBjb29sIGxpdHRsZSB0cmFmZmljIG1vZGVsLCBhbmQgdGhleSd2ZSBhbGwgYmVlbiBjb252ZXJ0ZWQgdG8gcnVuIGluIEVzY2FwZS4gVGhleSdyZSBpbiBKYXZhIGJ1dCB5b3UgY2FuIGV4ZWN1dGUgYW5kIGV4cGxvcmUgdGhlbSBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB0aGUgRXBpZGVtaWMgbW9kZWwgYWJvdmUuIEFsbCBvZiB0aGUgQXNjYXBlIGV4YW1wbGUgbW9kZWxzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgKGEgc3RyYWlnaHRmb3J3YXJkIHByb2Nlc3MpIGZyb20gdGhlaXIgaW50aWFsIEFzY2FwZSBpbmNhcm5hdGlvbnMuIEZvciBsaWNlbnNpbmcgcmVhc29ucyAodGhleSdyZSBCU0QsIG5vdCBFUEwpIHdlIGNhbid0IGhvc3QgdGhlbSBkaXJlY3RseSBvbiB0aGUgRWNsaXBzZSBzaXRlLiAgWW91IGNhbiBnZXQgdGhlIHByb2plY3RzIGluIHR3byB3YXlzOjwvcD4KKzxwPk9uY2UgeW91J3ZlIGRvd25sb2FkZWQgdGhlIHByb2plY3RzLCBvcGVuIHVwIHRoZSBzcmMgZm9sZGVyIGFuZCBuYXZpZ2F0ZSB0byB0aGUgSmF2YSBmaWxlcyBmb3IgdGhlIGFjdHVhbCBtb2RlbHMuIEZvciBleGFtcGxlLCB0byBydW4gQ29ud2F5J3MgTGlmZSwgeW91J2xsIHdhbnQgc3JjL2VkdS5icm9vay5saWZlLkNvbndheUxpZmUuIFJpZ2h0LWNsaWNrIG9uIHRoZSBKYXZhIGZpbGUgYW5kIHNlbGVjdCAiRXhlY3V0ZSIuIFRoZXJlIGFyZSBtYW55IG1vZGVscyB0byBleHBsb3JlISAoSXQncyBub3QgYWx3YXlzIG9idmlvdXMgd2hpY2ggSmF2YSBmaWxlcyBhcmUgZm9yIG1vZGVscywgc28geW91IG1heSBoYXZlIHRvIHBva2UgYXJvdW5kIGEgYml0LiBXZSBuZWVkIHRvIHB1dCB0b2dldGhlciBhIGNhdGFsb2cgaGVyZS4gQW5vdGhlciBuaWNlIG9wcG9ydHVuaXR5IGZvciB1c2VyIGNvbnRyaWJ1dGlvbnMuKTwvcD4KKzxwPlRoZXNlIGFyZSBTVk4gcHJvamVjdHMgaW4gdGhlIHNvdXJjZWZvcmdlIFNWTi4gRm9yIGhlbHAsIHNlZSAKKwkJCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii93aWtpL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3VidmVyc2l2ZS9kb2N1bWVudGF0aW9uL3RlYW1TdXBwb3J0L2ZpbmRfY2hlY2tfd2l6LnBocF90aGlzX3BhZ2UiIHRhcmdldD0iX25ldyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zdWJ2ZXJzaXZlL2RvY3VtZW50YXRpb24vdGVhbVN1cHBvcnQvZmluZF9jaGVja193aXoucGhwIHRoaXMgcGFnZTwvYT4uCisJCQkJCQk8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmh0dHA6Ly9hc2NhcGUuc3ZuLnNvdXJjZWZvcmdlLm5ldC9zdm5yb290L2FzY2FwZS9vcmcuYXNjYXBlLmVzY2FwZS5tb2RlbHMuYnJvb2s8YnI+CitodHRwOi8vYXNjYXBlLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9hc2NhcGUvb3JnLmFzY2FwZS5lc2NhcGUubW9kZWxzLmV4YW1wbGVzPGJyPgorCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR2VuZXJhdGluZyBNb2RlbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJHZW5lcmF0aW5nX01vZGVscyI+PC9hPkdlbmVyYXRpbmcgTW9kZWxzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFuZCBvZiBjb3Vyc2UsIHlvdSBjYW4gYWx3YXlzIHVzZSB0aGUgQU1GIHRvb2xzIHRvIGdlbmVyYXRlIG1vZGVscyBhbmQgdGhlbiBjdXN0b21pemUgdGhlbSBmcm9tIHRoZXJlLiBTZWUgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9uIGludGVncmF0aW5nIEFNRiB3aXRoIEphdmEgZm9yIG1vcmUgb24gdGhhdC4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1vZGVscyBkZXZlbG9wZWQgd2l0aCBBTUYgdGhhdCBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBleGFtcGxlIG1vZGVscyB0byBydW4gaW4gRXNjYXBlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gcnVuIHRoZSBleGFtcGxlIG1vZGVsczo8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRpbmcgYSBOZXcgRXNjYXBlIFByb2plY3QiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGluZ19hX05ld19Fc2NhcGVfUHJvamVjdCI+PC9hPkNyZWF0aW5nIGEgTmV3IEVzY2FwZSBQcm9qZWN0PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBiZXN0IG9wdGlvbiBpcyB0byBzaW1wbHkgY3JlYXRlIGEgbmV3IEVzY2FwZSBwcm9qZWN0IGFuZCBkcmFnIHRoZSBtb2RlbHMgaW50byBpdCE8L3A+Cis8ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+Cis8b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSIxIj4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+SWYgeW91J3JlIG5vdCBhbHJlYWR5IHRoZXJlLCBvcGVuIHRoZSBBZ2VudCBNb2RlbGluZyBQZXJzcGVjdGl2ZS4gU2VsZWN0IFdpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBPdGhlci4uIGFuZCB0aGVuIEFnZW50IE1vZGVsaW5nLiAoT3IgeW91IGNhbiBjaG9vc2UgV2luZG93ICZndDsgUmVzZXQgUGVyc3BlY3RpdmUgYW5kIHRoZSBBZ2VudCBNb2RlbGluZyBwZXJzcGVjdGl2ZSBzaG91bGQgYXBwZWFyIGluIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGxpc3QgaXRzZWxmLik8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5DcmVhdGUgdGhlIHByb2plY3Qgd2hlcmUgd2UnbGwgcGxhY2Ugb3VyIG1vZGVsLiBTZWxlY3QgRmlsZSAmZ3Q7IE5ldyAmZ3Q7IEVzY2FwZSBBTUYgUHJvamVjdC4gR2l2ZSBpdCBhIG5hbWUgbGlrZSAiZXNjYXBlLnR1dG9yaWFsIiwgdGhlbiBjbGljayBGaW5pc2guPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+RmluYWxseSBncmFiIHRoZSBFcGlkZW1pYy5tZXRhYWJtIG1vZGVsIGF0IAorCQkJCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL21vZGVscy9FcGlkZW1pYy5tZXRhYWJtIiB0YXJnZXQ9Il9uZXciPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvbW9kZWxzL0VwaWRlbWljLm1ldGFhYm08L2E+IGFuZCBkcmFnIGl0IGludG8gdGhlIHByb2plY3QuIChEZXBlbmRpbmcgb24geW91ciBicm93c2VyIHRoZSBmaWxlIG1heSBsb2FkIGFzIHRleHQgZGlyZWN0bHkgaW50byB5b3VyIGJyb3dzZXIsIGluIHdoaWNoIGNhc2UganVzdCByaWdodC1jbGljayBvbiB0aGUgbGluayBhbmQgc2F2ZSBpdCB0byBhIGZpbGUuKQorCQkJCQkJCQk8L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRGV2ZWxvcGluZyBNb2RlbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IkRldmVsb3BpbmdfTW9kZWxzIj48L2E+RGV2ZWxvcGluZyBNb2RlbHM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGVhc2llc3Qgd2F5IGZvciBKYXZhIGRldmVsb3BlcnMgdG8gZ2V0IHN0YXJ0ZWQgZG9pbmcgYWdlbnQtYmFzZWQgbW9kZWxpbmcgaW4gRWNsaXBzZSBpcyB0byBiZWdpbiB0byB3cml0ZSBwcm9ncmFtcyB1c2luZyBpdC4gVG8gZGV2ZWxvcCBuZXcgbW9kZWxzLCB5b3UgY2FuOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDaGVhdHNoZWV0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ2hlYXRzaGVldCI+PC9hPkNoZWF0c2hlZXQ8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QnkgZmFyIHRoZSBzaW1wbGVzdCB3YXkgdG8gZ2V0IHN0YXJ0ZWQgaXMgd2l0aCB0aGUgY2hlYXRzaGVldC4gVGhpcyB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgY29tcGxldGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIEphdmEgYmFzZWQgbW9kZWwuIAorCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5IZWxwICZndDsgQ2hlYXQgU2hlZXRzLi4uPC9zdHJvbmc+PC9zcGFuPiBhbmQgdGhlbiBzZWxlY3QgIkNyZWF0ZSBhbiBFc2NhcGUgSmF2YSBNb2RlbCIgZnJvbSB3aXRoaW4gdGhlICJBZ2VudCBNb2RlbGluZyIgY2F0ZWdvcnkuCisJCQkJPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3RlcHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdGVwcyI+PC9hPlN0ZXBzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5DcmVhdGUgYSBuZXcgRXNjYXBlIHByb2plY3QuIFRoZSBFc2NhcGUgcHJvamVjdHMgYXJlIGFjdHVhbGx5IGNvbmZpZ3VyZWQgZm9yIEFNRiBjb2RlIGdlbmVyYXRpb24gc28gdGhlcmUgYXJlIGRlcGVuZGVuY2llcyBhbmQgYnVpbGRlcnMgaW4gdGhlcmUgdGhhdCB5b3UgZG9uJ3QgbmVlZDsgeW91IGNhbiByZW1vdmUgYWxsIG9mIHRoZSBlc2NhcGUgYnVpbGRlcnMgYW5kIGFueSBvZiB0aGUga2l0Y2hlbiBzaW5rIGl0ZW1zLiBUaGUgIkNyZWF0ZSBhbiBFc2NhcGUgSmF2YSBNb2RlbCIgY2hlYXQgc2hlZXQgd2lsbCB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgbmV3IEphdmEgYmFzZWQgcHJvamVjdCBhbmQgbW9kZWwuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+T3IgZm9yIG1vcmUgZXhwZXJpZW5jZWQgRWNsaXBzZSB1c2VycywgeW91IGNhbiBzaW1wbHkgdG8ganVzdCBjcmVhdGUgYSBuZXcgUGx1Zy1pbiBQcm9qZWN0IGFuZCBhZGQgdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgdGhlcmUuIEhhdmUgYSBsb29rIGF0IHRoZSBleGFtcGxlIGVzY2FwZSBwcm9qZWN0IHRvIHNlZSB3aGF0IHlvdSBuZWVkLiBOb3RlIHRoYXQgeW91IHdpbGwgbGlrZWx5IG5lZWQgbW9yZSBkZXBlbmRlbmNpZXMgdGhlbiB5b3UgbmVlZCB0byBzaW1wbHkgYnVpbGQgLS0gdGhpcyBpcyBiZWNhdXNlIHRoZSBjbGFzcyBsb2FkZXIgdXNlcyB0aGUgY2xhc3NlcyBmcm9tIHRoZSBwcm9qZWN0IHBhdGggYW5kIHNvIHJ1bnRpbWUgY2xhc3NlcyBoYXZlIHRvIGJlIHRoZXJlIGFzIHdlbGwuIFdlIG1heSBzaW1wbHkgcGFja2FnZSBhbiBFY2xpcHNlIHJ1bnRpbWUgY29udmVuaWVuY2UgcGx1Zy1pbiB0byBnYXRoZXIgdGhlc2UgZGVwZW5kZW5jaWVzIHVwIGEgYml0LiBUaGVuIGp1c3QgY3JlYXRlIG5ldyBKYXZhIGNsYXNzZXMgZm9yIHlvdXIgcm9vdCBtb2RlbCBzY2FwZSBhbmQgYWdlbnRzIGp1c3QgYXMgeW91IHdvdWxkIGZvciBhbiBBc2NhcGUgcHJvamVjdC48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFeGVjdXRpbmcgTW9kZWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJFeGVjdXRpbmdfTW9kZWxzIj48L2E+RXhlY3V0aW5nIE1vZGVsczwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5TZWUgdGhlIFVzZXIgR3VpZGUgRXhlY3V0aW9uIFNlY3Rpb24gZm9yIGluZm9ybWF0aW9uIG9uIGxhdW5jaGluZyBhbmQgY29udHJvbGluZyBtb2RlbHMuPC9wPgorPHA+V2UgaGF2ZSBhIGNvbXBsZXRlIGNoZWF0IHNoZWV0IHN1cHBvcnRpbmcgdGhpcyB0dXRvcmlhbC4gU2ltcGx5IGdvIHRvIAorCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkhlbHAgJmd0OyBDaGVhdCBTaGVldHMuLi48L3N0cm9uZz48L3NwYW4+IGFuZCB0aGVuIHNlbGVjdCAiUnVuIGFuIEV4YW1wbGUgTW9kZWwiIGZyb20gd2l0aGluIHRoZSAiQWdlbnQgTW9kZWxpbmciIGNhdGVnb3J5LgorCQkJPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlR1dG9yaWFsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVHV0b3JpYWwiPjwvYT5UdXRvcmlhbDwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5XZSd2ZSBkZXZlbG9wZXIgaGF2ZSBhIGNvbXBsZXRlIGNoZWF0IHNoZWV0IHN1cHBvcnRpbmcgdGhpcyB0dXRvcmlhbC4gU2ltcGx5IGdvIHRvIAorCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5IZWxwICZndDsgQ2hlYXQgU2hlZXRzLi4uPC9zdHJvbmc+PC9zcGFuPiBhbmQgdGhlbiBzZWxlY3QgIlJ1biBhbiBFeGFtcGxlIE1vZGVsIiBmcm9tIHdpdGhpbiB0aGUgIkFnZW50IE1vZGVsaW5nIiBjYXRlZ29yeS4KKwkJCQk8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4dGVuZGluZyBhbmQgQ3VzdG9taXppbmcgQU1QIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJFeHRlbmRpbmdfYW5kX0N1c3RvbWl6aW5nX0FNUCI+PC9hPkV4dGVuZGluZyBhbmQgQ3VzdG9taXppbmcgQU1QPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgc3ViamVjdCBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgQWdlbnQgTW9kZWxpbmcgbWFudWFsLiBBIGZ1dHVyZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSBHdWlkZSB3aWxsIGRpc2N1c3MgdGhlc2UgaXNzdWVzIGluIGRldGFpbC4gRm9yIG5vdywgcGxlYXNlIGtlZXAgYW4gZXllIG9uIHRoZSBXaWtpIGFuZCBjb21taXR0ZXIgYmxvZ3MuIEFuZCBvZiBjb3Vyc2UgcGxlYXNlIGFzayBxdWVzdGlvbnMgb24gdGhlIEFNUCBmb3J1bSBhbmQgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdC4gTGV0dGluZyB1cyBrbm93IHlvdSdyZSBpbnRlcmVzdGVkIGluIGRvaW5nIHNvbWV0aGluZyBpcyB0aGUgYmVzdCB3YXkgdG8gZ2V0IGl0IGRvY3VtZW50ZWQhPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW50ZWdyYXRpbmcgSmF2YSBhbmQgQU1GIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iSW50ZWdyYXRpbmdfSmF2YV9hbmRfQU1GX01vZGVscyI+PC9hPkludGVncmF0aW5nIEphdmEgYW5kIEFNRiBNb2RlbHM8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91J3JlIGxpa2UgbWFueSBKYXZhIGRldmVsb3BlcnMsIHlvdSBtaWdodCBmaW5kIHBvaW50LWFuZC1jbGljayBpbnRlcmZhY2VzIGEgYml0IGxhbWUuIFBlcnNvbmFsbHksIEkndmUgY2hhbmdlZCBteSB0dW5lIGluIHRoaXMsIGFuZCBJIG5vdyBkZWZpbmUgYWxsIG9mIG15IEFCTSBtb2RlbHMgZnJvbSB0aGUgZWRpdG9yLCBzYXZpbmcgSmF2YSBmb3IgdHJ1bHkgc3BlY2lhbGl6ZWQgdGFza3MuIEJ1dCBldmVuIHdpdGhvdXQgZ2VuZXJhdGlvbiBvZiBhZ2VudCBiZWhhdmlvciwgQWNvcmUgY2FuIGJlIGEgcmVhbGx5IHZhbHVhYmxlIHRvb2wsIGFzIHRoZSBHSVMgZXhhbXBsZSBzaG93cy4gVGhlIHdheSB0byBsb29rIGF0IG1ldGFBQk0gaXMgYXMgYSB3YXkgdG8gY29tcG9zZSB5b3VyIG92ZXJhbGwgbW9kZWwgYW5kIGF1dG9tYXRlIHRoZSB0ZWRpb3VzIHBhcnRzLiBBcGFydCBmcm9tIEphdmEgZ2VuZXJhdGVkIGNvZGUsIHRoZSBBTUYgbWV0YS1tb2RlbCBtYWludGFpbnMgYSBudW1iZXIgb2YgdmVyeSB1c2VmdWwgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgdGhlIFJlcGFzdCBTaW1waG9ueSB0YXJnZXQgbWFpbnRhaW5zIG1vZGVsLnNjb3JlIGFuZCBhbGwgb2YgdGhlIG1vZGVsLnJzIGNvbXBvbmVudC4gR2VuZXJhbGx5LCBBTUYgc2hvdWxkIHNhdmUgdGltZSBhbmQgaGFzc2xlIHdoaWxlIG1ha2luZyB5b3VyIG1vZGVscyBmYXIgbW9yZSB0cmFuc3BhcmVudCBldmVuIGlmIHlvdSBuZXZlciB1c2UgdGhlIEFjdGlvbnMgY29tcG9uZW50IHRvIGRlZmluZSBhZ2VudCBiZWhhdmlvci48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTWV0aG9kIEFjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1ldGhvZF9BY3Rpb24iPjwvYT5NZXRob2QgQWN0aW9uPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFzIGV4cGxhaW5lZCBpbiB0aGUgYWN0aW9uIHNlY3Rpb24sIHlvdSBjYW4gc2ltcGx5IGNyZWF0ZSBhICJNZXRob2QiIGFjdCB3aXRoIGhhbmQtd3JpdHRlbiBKYXZhIGNvZGUuIFRoaXMgb3B0aW9uIGlzIG5pY2UgYmVjYXVzZSBhbGwgY29kZSBpcyBjb250YWluZWQgd2l0aGluIHRoZSBBTUYgZmlsZS4gQnV0IGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8gbWFpbnRhaW4gbGFyZ2UgYmxvY2tzIG9mIEphdmEgY29kZSBhcyB5b3UgYXJlbid0IHVzaW5nIGEgSmF2YSBlZGl0b3IgdG8gZWRpdCB0aGUgSmF2YSBjb2RlIGl0c2VsZi4gT25lIHdheSB0byBnZXQgYXJvdW5kIHRoaXMgaXMgdG8gY3JlYXRlIHlvdXIgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgbWV0aG9kIGFuZCB0aGVuIGNvcHkgaXQgaW50byB0aGUgTWV0aG9kIGFjdGlvbi4gTm90ZSBvbmUgaW1wb3JhbnQgaXNzdWUgaGVyZSAtLSB5b3UnbGwgZ2VuZXJhbGx5IGhhdmUgdG8gZnVsbHkgcXVhbGlmeSB5b3VyIEphdmEgcmVmZXJlbmNlcyBhcyB5b3Ugd29uJ3QgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGltcG9ydHMgc3RhdGVtZW50cyBkaXJlY3RseS4gPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUHJvdGVjdGVkIENvZGUgUmVnaW9ucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlByb3RlY3RlZF9Db2RlX1JlZ2lvbnMiPjwvYT5Qcm90ZWN0ZWQgQ29kZSBSZWdpb25zPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBjYW4gbWl4IGFuZCBtYXRjaCBBY3Rpb24gYmVoYXZpb3Igd2l0aCBKYXZhIGFuZCBnZW5lcmF0ZWQgY29kZSB3aXRoIFBPSk9zLiBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdGhyb3VnaCB1c2luZyBwcm90ZWN0ZWQgcmVnaW9ucy4gU2VsZWN0IHRoZSBhZ2VudCB5b3Ugd2FudCB0byBjcmVhdGUgcHJvdGVjdGVkIG1ldGhvZHMgZm9yIGFuZCB0aGVuIHNlbGVjdCAiR2VuZXJhdGUgUHJvdGVjdGVkIiBmcm9tIHRoZSAiTW9kZSIgcHJvcGVydHkuIE5vdywgY3JlYXRlIGFjdGlvbnMganVzdCBhcyB5b3UgaGF2ZSBiZWZvcmUsIG9yIHVzZSB5b3VyIGV4aXN0aW5nIG9uZXMuIE9uIGNvZGUgZ2VuZXJhdGlvbiwgb3BlbiB1cCB0aGUgcmVsZXZhbnQgamF2YSBmaWxlIGFuZCBleGFtaW5lIHRoZSBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIDwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZVByb3BzLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzxwPllvdSBjYW4gcHV0IHdoYXRldmVyIHlvdSB3YW50IHdpdGhpbiB0aGUgUFJPVEVDVEVEIFJFR0lPTiBjb21tZW50cyBhbmQgdGhvc2UgY2hhbmdlcyB3aWxsIGJlIHByZXNlcnZlZCB3aGVuIHRoZSBtb2RlbCBpcyByZWdlbmVyYXRlZC4gWW91IGNhbiBjcmVhdGUgYSBzY2hlZHVsZSwgcnVsZSBvciB3YXRjaGVyLCBtYWludGFpbiBjdXN0b20gY29kZSBmb3IgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbnMsIGFuZCBzdGlsbCBoYXZlIHRoZSBtb2RlbCBhZGFwdCB0byBjaGFuZ2VzIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIC0tIGlmIGZvciBleGFtcGxlIHlvdSB3YW50IHRvIGltcG9ydCBhIG1vZGlmaWVkIHNoYXBlIGZpbGUuPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9wb2pvL1Byb2dyYW1taW5nUG9qb0dlbmVyYXRlQ29kZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJbnRlcmZhY2UgYW5kIEJhc2UgQ2xhc3MgR2VuZXJhdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkludGVyZmFjZV9hbmRfQmFzZV9DbGFzc19HZW5lcmF0aW9uIj48L2E+SW50ZXJmYWNlIGFuZCBCYXNlIENsYXNzIEdlbmVyYXRpb248L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QW5vdGhlciBhcHByb2FjaCB3aGljaCBjYW4gYmUgbW9yZSByb2J1c3QgaXMgdG8gZ2VuZXJhdGUgdGhlIGJhc2ljIG1vZGVsIHN0dWJzIChsaWtlIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZXhjZXB0IHRoYXQgaXQgaXNuJ3QgYWJzdHJhY3QpIGFuZCB0aGVuIG92ZXJyaWRlIHlvdXIgbW9kZWwgd2l0aCBpbXBsZW1lbnRhdGlvbnMuIEFNRiBwcm92aWRlcyBzdXBwb3J0IGZvciBnZW5lcmljIHNrZWxldG9ucyBhbmQgaW50ZXJmYWNlcy48L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Bvam8vUHJvZ3JhbW1pbmdQb2pvR2VuZXJhdGUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb252ZXJ0aW5nIEV4aXN0aW5nIEFzY2FwZSBNb2RlbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IkNvbnZlcnRpbmdfRXhpc3RpbmdfQXNjYXBlX01vZGVscyI+PC9hPkNvbnZlcnRpbmcgRXhpc3RpbmcgQXNjYXBlIE1vZGVsczwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGVyZSBhcmUgb25seSBhIGZldyBjaGFuZ2VzIHNob3VsZCBoYXZlIHRvIG1ha2UgdG8gZXhpc3RpbmcgQXNjYXBlIG1vZGVscyBvciB0byB1c2UgZXhpc3RpbmcgQXNjYXBlIGRvY3VtZW50YXRpb24gdG8gZGV2ZWxvcCBFc2NhcGUgbW9kZWxzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb2RlbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vZGVsIj48L2E+TW9kZWw8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGNvcmUgbW9kZWwgaXMgY29tcGxldGVseSBBUEkgY29tcGF0aWJsZS4gTm8gY2hhbmdlcyE8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJWaWV3Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVmlldyI+PC9hPlZpZXc8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QmVjYXVzZSBFc2NhcGUgdXNlcyBTV1QgYW5kIEFzY2FwZSB1c2VzIFN3aW5nLCB0aGVyZSBhcmUgYSBmZXcgdW5hdm9pZGFibGUgaW5jb21wYXRpYmlsaXRpZXMuIE1vc3Qgb2YgdGhlc2Ugd2UgYXZvaWQgYnkgdXNpbmcgaGlnaGVyIGxldmVsIEFQSXMgYnV0IGhlcmUgYXJlIHRoZSBrZXkgY2hhbmdlcyB0aGF0IHlvdSdyZSBsaWtlbHkgdG8gaGF2ZSB0byBtYWtlOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb252ZXJ0IHRoZSBsb3ctbGV2ZWwgaW1wb3J0cyBmcm9tIEFXVCBhbmQgU3dpbmcgdG8gU1dUIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29udmVydF90aGVfbG93LWxldmVsX2ltcG9ydHNfZnJvbV9BV1RfYW5kX1N3aW5nX3RvX1NXVCI+PC9hPkNvbnZlcnQgdGhlIGxvdy1sZXZlbCBpbXBvcnRzIGZyb20gQVdUIGFuZCBTd2luZyB0byBTV1Q8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIHNpbXBsZXN0IHdheSB0byBhY2NvbXBsaXNoIHRoaXMgaXMgdG8gcmVtb3ZlIGFsbCBvZiB0aGUgaW1wb3J0cyBhbmQgdGhlbiBvcmdhbml6ZSBpbXBvcnRzLiBGb3IgZXhhbXBsZTo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmphdmEuYXd0LkNvbG9yJm5ic3A7PSZndDsmbmJzcDtvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I8YnI+CitqYXZhLmF3dC5HcmFwaGljcyZuYnNwOz0mZ3Q7Jm5ic3A7b3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPlRoZW4ganVzdCBkbyBhIGdsb2JhbCBmaW5kIGZvciBhbGwgb2YgdGhlIGltcG9ydHMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIG5vdGhpbmcuIFRoaXMgaXMgYSBncmVhdCBwbGFjZSBmb3IgYSByZWdleHAuIFRyeTo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmZpbmQ6Jm5ic3A7aW1wb3J0Jm5ic3A7amF2YVwuYXd0XC4oLiopOzxicj4KK3JlcGxhY2U6Jm5ic3A7W25vdGhpbmddPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPllvdSBkb24ndCBoYXZlIHRvIHJlcGxhY2UgdGhlc2Ugd2l0aCB0aGUgU1dUIGVxdWl2YWxlbnRzLCBqdXN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0LCByaWdodC1jbGljayBhbmQgY2hvb3NlICJTb3VyY2U6T3JnYW5pemUgSW1wb3J0cy4uIgorCQkJCQkJQnkgdGhlIHdheSwgYSBncmVhdCB3YXkgdG8gYXZvaWQgaGF2aW5nIHRvIHNlbGVjdCB0aGUgcmlnaHQgZW50cmllcyBpbiBvcHRpbWl6ZSBpbXBvcnRzIGFuZCB0byBhbGVydCB5b3Ugd2hlbiB5b3UgaGF2ZSBtaXNzZWQgYW55dGhpbmcgaXMgdG8gcHJldmVudCB0aGUgYXd0IGFuZCBzd2luZyBjbGFzc2VzIGZyb20gYmVpbmcgdXNlZCBhdCBhbGwuIFJpZ2h0LWNsaWNrIG9uIHByb2plY3QsIGNob29zZSAiQnVpbGQgUGF0aDpDb25maWd1cmUgQnVpbGQgUGF0aCIsIGdvIHRvIExpYnJhcmllcyB0YWIsIG9wZW4gSlJFIFN5c3RlbSBMaWJyYXJ5LCBjaG9vc2UgIkFjY2VzcyBSdWxlcyIsIGVkaXQsIGFuZCB0aGVuIGFkZCBlbnRyaWVzIGZvciBqYXZhL2F3dC8qKiBhbmQgamF2YXgvc3dpbmcvKiouIFRoZSBjb2RlIHdpbGwgcmVnZW5lcmF0ZSBhbmQgeW91J2xsIGhhdmUgZXJyb3IgbWFya2VycyBmb3IgYWxsIG9mIHRoZSBzdHVmZiB0aGF0IHdvbid0IHdvcmsgd2l0aCBFc2NhcGUgYW5kIEVjbGlwc2UuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29udmVydCBjb2xvciBmZWF0dXJlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbnZlcnRfY29sb3JfZmVhdHVyZXMiPjwvYT5Db252ZXJ0IGNvbG9yIGZlYXR1cmVzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBjYW4ndCB1c2UgQVdUIGNvbG9ycyBlaXRoZXIgc28geW91J2xsIG5lZWQgdG8gcmVwbGFjZSBhbnkgY29sb3JzLiBBTVAgcHJvdmlkZXMgYSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBDb2xvcnMgY2FsbGVkIENvbG9yRmVhdHVyZSBhbmQgQ29sb3JGZWF0dXJlQ29uY3JldGUuIFlvdSBjYW4gdXNlIHRoZXNlIG9yIGFueSBvZiB0aGUgb3RoZXIgd2F5cyB0byBkZWZpbmUgU1dUIGNvbG9ycy4gRm9yIGV4YW1wbGU6PC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5Db2xvci5saWdodEdyYXkmbmJzcDs9Jmd0OyZuYnNwO0NvbG9yRmVhdHVyZS5MSUdIVF9HUkFZPGJyPgorbmV3Jm5ic3A7Q29sb3IoTWF0aC5taW4oMS4wZiwmbmJzcDsoZmxvYXQpJm5ic3A7KHJlZEVuZXJneSZuYnNwOysmbmJzcDtvcmFuZ2VFbmVyZ3kpKSwmbmJzcDsoZmxvYXQpJm5ic3A7b3JhbmdlRW5lcmd5Jm5ic3A7KiZuYnNwOy44ZiwmbmJzcDsoZmxvYXQpJm5ic3A7Ymx1ZUVuZXJneSkmbmJzcDs9Jmd0OyZuYnNwOzxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbG9yRmVhdHVyZUNvbmNyZXRlLmNyZWF0ZShNYXRoLm1pbigxLjBmLCZuYnNwOyhmbG9hdCkmbmJzcDsocmVkRW5lcmd5Jm5ic3A7KyZuYnNwO29yYW5nZUVuZXJneSkpLCZuYnNwOyhmbG9hdCkmbmJzcDtvcmFuZ2VFbmVyZ3kmbmJzcDsqJm5ic3A7LjhmLCZuYnNwOyhmbG9hdCkmbmJzcDtibHVlRW5lcmd5KTxicj4KKworPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDaGFuZ2UgYWdlbnQgY29sb3IgZ2V0dGVycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNoYW5nZV9hZ2VudF9jb2xvcl9nZXR0ZXJzIj48L2E+Q2hhbmdlIGFnZW50IGNvbG9yIGdldHRlcnM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91J3ZlIGRlZmluZWQgY29sb3JzIHRocm91Z2ggb3ZlcnJpZGluZyBBZ2VudHMgYXMgaW4gbW9zdCBtb2RlbHMsIHlvdSdsbCBuZWVkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIHNpZ25hdHVyZS4gWW91IGNvdWxkIGp1c3QgZG8gYSBnbG9iYWwgcmVwbGFjZSBmb3IgdGhpcyBvbmUuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5wdWJsaWMmbmJzcDtDb2xvciZuYnNwO2dldENvbG9yKCZuYnNwOz0mZ3Q7Jm5ic3A7cHVibGljJm5ic3A7T2JqZWN0Jm5ic3A7Z2V0UGxhdGZvcm1Db2xvcig8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR2V0IHJpZCBvZiBpbWFnZSBmZWF0dXJlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdldF9yaWRfb2ZfaW1hZ2VfZmVhdHVyZXMiPjwvYT5HZXQgcmlkIG9mIGltYWdlIGZlYXR1cmVzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkVzY2FwZSBkb2Vzbid0IHN1cHBvcnQgdGhlbS4gSW4gcHJhY3RpY2UgdGhleSBoYXZlbid0IGJlZW4gdXNlZCBhIGxvdC4gQXQgc29tZSBwb2ludCBwZXJoYXBzIHdlJ2xsIGhhdmUgbmljZSBzcHJpdGUgc3VwcG9ydCBpbnN0ZWFkLiA6KTwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+cHVibGljJm5ic3A7SW1hZ2UmbmJzcDtnZXRJbWFnZSgpJm5ic3A7eyoqfSZuYnNwOz0mZ3Q7Jm5ic3A7IiI8YnI+CisKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTW9kaWZ5IHVzYWdlcyBvZiBEcmF3RmVhdHVyZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RpZnlfdXNhZ2VzX29mX0RyYXdGZWF0dXJlcyI+PC9hPk1vZGlmeSB1c2FnZXMgb2YgRHJhd0ZlYXR1cmVzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPklmIHlvdSd2ZSBjcmVhdGVkIGFueSBvZiB5b3VyIG93biBkcmF3IGZlYXR1cmVzLCB5b3UnbGwgbmVlZCB0byBjaGFuZ2UgdGhlbSBzbGlnaHRseSB0byBhY2NvbW1vZGF0ZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQVdUIGFuZCBTV1QgLyBEcmF3MkQgQVBJcy4gVGhpcyBzaG91bGQgYmUgcHJldHR5IHN0cmFpZ2h0Zm9yd3JkLiBGb3IgZXhhbXBsZTo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPmcuc2V0Q29sb3IoLi4uPGJyPgorZy5maWxsT3ZhbCguLjxicj4KK2JlY29tZXM6PGJyPgorZy5zZXRCYWNrZ3JvdW5kQ29sb3IoPGJyPgorZy5maWxsT3ZhbCguLjxicj4KKworPC9wPgorPC9kaXY+Cis8cD5UaGF0J3MgYWJvdXQgaXQsIHRob3VnaCBpdCdzIHByb2JhYmxlIHRoYXQgd2UndmUgbWlzc2VkIHNvbWV0aGluZy4gUGxlYXNlIHBvc3QgYSBtZXNzYWdlIG9uIHRoZSBhbXAgbmV3c2dyb3VwIGlmIHlvdSBydW4gaW50byBhbnkgb3RoZXIgY29udmVyc2lvbiBpc3N1ZXMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29uZmlndXJhdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbmZpZ3VyYXRpb24iPjwvYT5Db25maWd1cmF0aW9uPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkluc3RlYWQgb2YgdXNpbmcgQW50LCBFc2NhcGUgaGFzIHJlYWxseSBuaWNlIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6aW5nIGFuZCB0ZXN0aW5nIG1vZGVscy4gU2VlIAorCQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSIvd2lraS9FeHBlcmltZW50aW5nX2FuZF9UZXN0aW5nIiB0YXJnZXQ9Il9uZXciPkV4cGVyaW1lbnRpbmcgYW5kIFRlc3Rpbmc8L2E+ICh0b2RvKS4gSWYgeW91IGRvIHdhbnQgdG8gd29yayB3aXRoIGFudCB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlIHBsdWdpbnMgZnJvbSB0aGUgU291cmNlZm9yZ2UgZG93bmxvYWQgc2l0ZS4gKFRoZXNlIGhhdmUgZGVwZW5kZW5jaWVzIHRoYXQgSSBkaWRuJ3Qgd2FudCB0byBib3RoZXIgd2l0aCBnb2luZyB0aHJvdWdoIHRoZSBFY2xpcHNlIElQIHByb2Nlc3MgdG8gZ2V0IGluLiBJZiBmb3Igc29tZSByZWFzb24geW91IHRoaW5rIHRoZXNlIHNob3VsZCBiZSBwYXJ0IG9mIGNvcmUgRXNjYXBlIGxldCBNaWxlcyBrbm93IGFuZCBJJ2xsIHRha2UgY2FyZSBvZiBpdC4pIEFudCBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBFc2NhcGUgc28gaXQncyBub3QgZXZlbiBjbGVhciBpdCB3aWxsIHdvcmsuCisJCQkJCTwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj4KKzxocj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9IlR1dG9yaWFscy5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFscyZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7Ni4mbmJzcDtJbnN0YWxsYXRpb24gR3VpZGU8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1Jlc291cmNlcy5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvUmVzb3VyY2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxMTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1Jlc291cmNlcy5odG1sCkBAIC0wLDAgKzEsMTAwIEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzguJm5ic3A7UmVzb3VyY2VzPC90aXRsZT4KKzxsaW5rIGhyZWY9ImJvb2suY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc2LjAiIG5hbWU9ImdlbmVyYXRvciI+Cis8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs3LiZuYnNwO05ldyBhbmQgTm90ZXdvcnRoeSI+Cis8bGluayByZWw9Im5leHQiIGhyZWY9IlN1cHBvcnQuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs5LiZuYnNwO1N1cHBvcnQiPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorPGRpdiBjbGFzcz0ibmF2aGVhZGVyIj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRoIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjMiPkNoYXB0ZXImbmJzcDs4LiZuYnNwO1Jlc291cmNlczwvdGg+Cis8L3RyPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRoIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI2MCUiPiZuYnNwOzwvdGg+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjIwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJTdXBwb3J0Lmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzguJm5ic3A7UmVzb3VyY2VzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUmVzb3VyY2VzIj48L2E+Q2hhcHRlciZuYnNwOzguJm5ic3A7UmVzb3VyY2VzPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InRvYyI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUmVzb3VyY2VzLmh0bWwjV2Vic2l0ZXMiPldlYnNpdGVzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUmVzb3VyY2VzLmh0bWwjUGFwZXJzIj5QYXBlcnM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJXZWJzaXRlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iV2Vic2l0ZXMiPjwvYT5XZWJzaXRlczwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD4KKwkJCQkKKzxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAiIHRhcmdldD0iX25ldyI+RWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQcm9qZWN0IChJbmN1YmF0aW9uKTwvYT4KKwkJCQorPC9wPgorPHA+CisJCQkJCis8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9hc2NhcGUuc291cmNlZm9yZ2UubmV0IiB0YXJnZXQ9Il9uZXciPkFzY2FwZTwvYT4KKwkJCQorPC9wPgorPHA+CisJCQkJCis8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9tZXRhc2NhcGVhYm0uY29tIiB0YXJnZXQ9Il9uZXciPk1ldGFzY2FwZSwgTExDPC9hPgorCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQYXBlcnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj4KKzxhIG5hbWU9IlBhcGVycyI+PC9hPlBhcGVyczwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD4KKwkJCQkKKzxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5wbmFzLm9yZy9jb250ZW50Lzk5L3N1cHBsLjMvNzMwNC5mdWxsIiB0YXJnZXQ9Il9uZXciPkFzY2FwZTwvYT4KKworCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5wbmFzLm9yZy9jb250ZW50Lzk5L3N1cHBsLjMvNzI4MC5mdWxsIiB0YXJnZXQ9Il9uZXciPkFnZW50LUJhc2VkIE1vZGVsaW5nPC9hPgorCisJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vamFzc3Muc29jLnN1cnJleS5hYy51ay8xMS80LzEyLmh0bWwiIHRhcmdldD0iX25ldyI+V2h5IE1vZGVsPzwvYT4KKwkJCQorPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9Im5hdmZvb3RlciI+Cis8aHI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSI0MCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iU3VwcG9ydC5odG1sIj5OZXh0PC9hPjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwJSI+Q2hhcHRlciZuYnNwOzcuJm5ic3A7TmV3IGFuZCBOb3Rld29ydGh5Jm5ic3A7PC90ZD48dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJoIiBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0icmlnaHQiIHdpZHRoPSI0MCUiPiZuYnNwO0NoYXB0ZXImbmJzcDs5LiZuYnNwO1N1cHBvcnQ8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1N1cHBvcnQuaHRtbCBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1N1cHBvcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFhMWJlCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvU3VwcG9ydC5odG1sCkBAIC0wLDAgKzEsMjM0IEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q2hhcHRlciZuYnNwOzkuJm5ic3A7U3VwcG9ydDwvdGl0bGU+Cis8bGluayBocmVmPSJib29rLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cis8bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43Ni4wIiBuYW1lPSJnZW5lcmF0b3IiPgorPGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEd1aWRlIj4KKzxsaW5rIHJlbD0icHJldiIgaHJlZj0iUmVzb3VyY2VzLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7OC4mbmJzcDtSZXNvdXJjZXMiPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorPGRpdiBjbGFzcz0ibmF2aGVhZGVyIj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRoIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjMiPkNoYXB0ZXImbmJzcDs5LiZuYnNwO1N1cHBvcnQ8L3RoPgorPC90cj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJSZXNvdXJjZXMuaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNjAlIj4mbmJzcDs8L3RoPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzxocj4KKzwvZGl2PgorPGRpdiBjbGFzcz0iY2hhcHRlciIgdGl0bGU9IkNoYXB0ZXImbmJzcDs5LiZuYnNwO1N1cHBvcnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgyIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdXBwb3J0Ij48L2E+Q2hhcHRlciZuYnNwOzkuJm5ic3A7U3VwcG9ydDwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJ0b2MiPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNJc3N1ZXMiPklzc3VlczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNHZW5lcmFsX1N1cHBvcnQuMkNfUXVlc3Rpb25zX2FuZF9EaXNjdXNzaW9uIj5HZW5lcmFsIFN1cHBvcnQsIFF1ZXN0aW9ucyBhbmQgRGlzY3Vzc2lvbjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNWaWV3X0V4aXN0aW5nX0J1Z3NfYW5kX0ZlYXR1cmVfUmVxdWVzdHMiPlZpZXcgRXhpc3RpbmcgQnVncyBhbmQgRmVhdHVyZSBSZXF1ZXN0czwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNGaWxlX2FfQnVnIj5GaWxlIGEgQnVnPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI0Rpc2N1c3NfQU1QX0RldmVsb3BtZW50X2FuZF9Qcm9qZWN0Ij5EaXNjdXNzIEFNUCBEZXZlbG9wbWVudCBhbmQgUHJvamVjdDwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI090aGVyX0NvbnRhY3RzIj5PdGhlciBDb250YWN0czwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNQcm9mZXNzaW9uYWxfU3VwcG9ydCI+UHJvZmVzc2lvbmFsIFN1cHBvcnQ8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJTdXBwb3J0Lmh0bWwjTWVkaWFfYW5kX1ByaXZhdGVfQ29tbXVuaWNhdGlvbnMiPk1lZGlhIGFuZCBQcml2YXRlIENvbW11bmljYXRpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJTdXBwb3J0Lmh0bWwjR2V0X0ludm9sdmVkIj5HZXQgSW52b2x2ZWQ8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJTdXBwb3J0Lmh0bWwjSW1wcm92ZV90aGlzX0RvY3VtZW50YXRpb24uMjEiPkltcHJvdmUgdGhpcyBEb2N1bWVudGF0aW9uITwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNDb250cmlidXRlX3RvX0FNUCI+Q29udHJpYnV0ZSB0byBBTVA8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Iklzc3VlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iSXNzdWVzIj48L2E+SXNzdWVzPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkVjbGlwc2UgYW5kIHRoZSBBTVAgcHJvamVjdCBoYXZlIGEgbWFuZGF0ZSBmb3Igb3BlbiBjb21tdW5pY2F0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IHVubGVzcyB5b3UgYXJlIGEgY3VzdG9tZXIgb2YgYW4gQU1QIHByb2plY3QgY29udHJpYnV0b3Igd2Ugd2lsbCBub3QgcmVzcG9uZCB0byBkaXJlY3QgcmVxdWVzdHMgZm9yIHN1cHBvcnQuIFdlIAorCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPndpbGw8L3NwYW4+IG1ha2UgZXZlcnkgZWZmb3J0IHRvIHN1cHBvcnQgeW91ciB1c2Ugb2YgQU1QIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKwkJCTwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHZW5lcmFsIFN1cHBvcnQsIFF1ZXN0aW9ucyBhbmQgRGlzY3Vzc2lvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdlbmVyYWxfU3VwcG9ydC4yQ19RdWVzdGlvbnNfYW5kX0Rpc2N1c3Npb24iPjwvYT5HZW5lcmFsIFN1cHBvcnQsIFF1ZXN0aW9ucyBhbmQgRGlzY3Vzc2lvbjwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgCisJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9mb3J1bXMvaW5kZXgucGhwP3Q9dGhyZWFkJmFtcDtmcm1faWQ9MTcmYW1wO1M9ZjRmYTZjYjMxMzI3NzcyYTNiNjI2ZGM0MDlkYjQwOWIiIHRhcmdldD0iX25ldyI+QWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0gTmV3c2dyb3VwPC9hPiBpcyB0aGUgcGxhY2UgdG8gZGlzY3VzcyBvciBnZXQgc3VwcG9ydCBmb3IgYW55IG9mIHRoZSBFY2xpcHNlIEFNUCB0b29scy4gRG9uJ3QgaGVzaXRhdGUgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCBtb2RlbCBpbXBsZW1lbnRhdGlvbiBvciBicmluZyB1cCBtb3JlIGdlbmVyYWwgdG9waWNzIGZvciBkaXNjdXNzaW9uLgorCQkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlZpZXcgRXhpc3RpbmcgQnVncyBhbmQgRmVhdHVyZSBSZXF1ZXN0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlZpZXdfRXhpc3RpbmdfQnVnc19hbmRfRmVhdHVyZV9SZXF1ZXN0cyI+PC9hPlZpZXcgRXhpc3RpbmcgQnVncyBhbmQgRmVhdHVyZSBSZXF1ZXN0czwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5JZiB5b3UgaGF2ZSBhIHByb2JsZW0gb3IgaWRlYSBmb3IgaW1wcm92ZW1lbnQsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IGl0cyBhbHJlYWR5IGJlZW4gZGlzY292ZXJlZC4gVG8gYXZvaWQgZHVwbGljYXRpb24sIHBsZWFzZSBjaGVjayB0aGUgY3VycmVudCBidWdzIGJlZm9yZSBmaWxpbmcgYSBuZXcgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QuPC9wPgorPHA+CisJCQkJCQorPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9xdWVyeV9mb3JtYXQ9YWR2YW5jZWQmYW1wO3Nob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7c2hvcnRfZGVzYz0mYW1wO3Byb2R1Y3Q9QU1QJmFtcDtsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7bG9uZ19kZXNjPSZhbXA7YnVnX2ZpbGVfbG9jX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2J1Z19maWxlX2xvYz0mYW1wO3N0YXR1c193aGl0ZWJvYXJkX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3N0YXR1c193aGl0ZWJvYXJkPSZhbXA7a2V5d29yZHNfdHlwZT1hbGx3b3JkcyZhbXA7a2V5d29yZHM9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWwxPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlsMj0mYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSZhbXA7Y2hmaWVsZHRvPU5vdyZhbXA7Y2hmaWVsZHZhbHVlPSZhbXA7Y21kdHlwZT1kb2l0JmFtcDtvcmRlcj1SZXVzZStzYW1lK3NvcnQrYXMrbGFzdCt0aW1lJmFtcDtmaWVsZDAtMC0wPW5vb3AmYW1wO3R5cGUwLTAtMD1ub29wJmFtcDt2YWx1ZTAtMC0wPSIgdGFyZ2V0PSJfbmV3Ij5TZWFyY2ggRXhpc3RpbmcgQnVnczwvYT4KKwkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZpbGUgYSBCdWciPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJGaWxlX2FfQnVnIj48L2E+RmlsZSBhIEJ1ZzwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGlzIG1heSBzb3VuZCBvYnZpb3VzLCBidXQgaWYgc29tZXRoaW5nIGRvZXNuJ3Qgd29yayBhcyBpdCBzaG91bGQsIHRoZSBvbmx5IHdheSB0aGF0IHdlJ3JlIGdvaW5nIHRvIGZpbmQgb3V0IGlzIGlmIHNvbWVvbmUgcmVwb3J0cyBpdC4gQWxsIEFNUCByZWxhdGVkIGJ1Z3Mgb3IgZmVhdHVyZSByZXF1ZXN0cyBzaG91bGQgdXNlIHRoZSBFY2xpcHNlIEJ1Z3ppbGxhLjwvcD4KKzxwPgorCQkJCQkKKzxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUFNUCZhbXA7cmVwX3BsYXRmb3JtPUFsbCZhbXA7b3Bfc3lzPUFsbCIgdGFyZ2V0PSJfbmV3Ij5GaWxlIGEgQnVnIG9yIEZlYXR1cmUgUmVxdWVzdDwvYT4KKwkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRpc2N1c3MgQU1QIERldmVsb3BtZW50IGFuZCBQcm9qZWN0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlzY3Vzc19BTVBfRGV2ZWxvcG1lbnRfYW5kX1Byb2plY3QiPjwvYT5EaXNjdXNzIEFNUCBEZXZlbG9wbWVudCBhbmQgUHJvamVjdDwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BbGwgZGlzY3Vzc2lvbiBhYm91dCBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgZGVzaWduIGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgaXNzdWVzIHRha2UgcGxhY2Ugb24gdGhlIEFNUCBkZXYtbGlzdC4gSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gY29udHJpYnV0aW5nIHRvIHRoZSBBTVAgcHJvamVjdCwgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gY29udGFjdCB1cy4gCisJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvbWFpbG1hbi9saXN0aW5mby9hbXAtZGV2IiB0YXJnZXQ9Il9uZXciPmh0dHBzOi8vZGV2LmVjbGlwc2Uub3JnL21haWxtYW4vbGlzdGluZm8vYW1wLWRldjwvYT4uCisJCQkJPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPdGhlciBDb250YWN0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iT3RoZXJfQ29udGFjdHMiPjwvYT5PdGhlciBDb250YWN0czwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUHJvZmVzc2lvbmFsIFN1cHBvcnQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJQcm9mZXNzaW9uYWxfU3VwcG9ydCI+PC9hPlByb2Zlc3Npb25hbCBTdXBwb3J0PC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBBTVAgcHJvamVjdCBkZXZlbG9wZXJzIC0tIGFtb25nIHRoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgb2YgYWdlbnQgbW9kZWxzIGFuZCB0b29scyBhbnl3aGVyZSAtLSBhcmUgbmF0dXJhbGx5IHRoZSBiZXN0IHNvdXJjZSBmb3IgQWdlbnQgTW9kZWxpbmcgZGV2ZWxvcG1lbnQsIHN1cHBvcnQgYW5kIHRyYWluaW5nLiBQbGVhc2UgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdGhlIHByb2plY3QgbGVhZCBvciBvdGhlciBwcm9qZWN0IGNvbnRyaWJ1dG9ycyBkaXJlY3RseSB0byBkaXNjdXNzIHByb2Zlc3Npb25hbCBzdXBwb3J0IG9wdGlvbnMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTWVkaWEgYW5kIFByaXZhdGUgQ29tbXVuaWNhdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNZWRpYV9hbmRfUHJpdmF0ZV9Db21tdW5pY2F0aW9ucyI+PC9hPk1lZGlhIGFuZCBQcml2YXRlIENvbW11bmljYXRpb25zPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkZvciBwcm9qZWN0IHJlbGF0ZWQgYnV0IG5vbi1wdWJsaWMgY29tbXVuaWNhdGlvbnMgc3VjaCBhcyBtZWRpYSBlbnF1aXJlcyBvciBwb3RlbnRpYWwgcHJvamVjdCBzcG9uc29yc2hpcCwgcGxlYXNlIGNvbnRhY3QgTWlsZXMgUGFya2VyLCB0aGUgRWNsaXBzZSBBTVAgcHJvamVjdCBsZWFkLCBhdCBhbXBfZW5xdWlyeUBtZXRhc2NhcGVhYm0uY29tLiAoUmVxdWVzdHMgZm9yIHN1cHBvcnQgYW5kIG90aGVyIGNvbW11bmljYXRpb25zIHRvIHRoaXMgYWRkcmVzcyB3aWxsIGJlIGlnbm9yZWQuKTwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR2V0IEludm9sdmVkIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJHZXRfSW52b2x2ZWQiPjwvYT5HZXQgSW52b2x2ZWQ8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91IGZpbmQgdGhpcyB0b29sIHZhbHVhYmxlLCBwbGVhc2UgYmUgYXdhcmUgdGhhdCBtb3N0IG9mIGl0cyBkZXZlbG9wbWVudCBvY2N1cnJlZCB0aHJvdWdoIHZvbHVudGVlciBjb250cmlidXRpb25zIGZyb20gaW5kaXZpZHVhbHMgYW5kIGNvbXBhbmllcyB0aGF0IGhhdmUgcmVjZWl2ZWQgbm8gZGlyZWN0IGZ1bmRpbmcuIFlvdSBjYW4gc3VwcG9ydCBjb250aW51YWwgZGV2ZWxvcG1lbnQgZWZmb3J0cyBmaW5hbmNpYWxseSBieSBwdXJjaGFzaW5nIHJlbGF0ZWQgc29mdHdhcmUgdG9vbHMgZnJvbSBjb21wYW5pZXMgYW5kIG9yZ2FuaXphdGlvbnMgdGhhdCBoZWxwIGRldmVsb3AgaXQsIGluY2x1ZGluZyBmdW5kaW5nIGZvciBkZXZlbG9wZXIgdGltZSBpbiBncmFudCBwcm9wb3NhbHMuIFlvdSBjYW4gc3VwcG9ydCB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBpbiBnZW5lcmFsIGJ5IGJlY29taW5nIGEgbWVtYmVyIG9yZ2FuaXphdGlvbiBvZiBFY2xpcHNlLiBCdXQgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIHRoYXQgeW91IGNhbiBjb250cmlidXRlIGlzIHlvdXIgb3duIHRpbWUgYW5kIGVudGh1c2lhc20sIGVpdGhlciB0aHJvdWdoIGRpcmVjdGx5IGNvbnRyaWJ1dGluZyB0byBBTVAgb3IgYnkgcHJvbW90aW5nIGl0cyB1c2UgaW4gYmxvZ3MgYW5kIG90aGVyIHNvY2lhbCBtZWRpYS4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgY29udHJpYnV0aW5nIHRvIEFNUCwgdGhlIGZvbGxvd2luZyBzZWN0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iSW1wcm92ZSB0aGlzIERvY3VtZW50YXRpb24hIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW1wcm92ZV90aGlzX0RvY3VtZW50YXRpb24uMjEiPjwvYT5JbXByb3ZlIHRoaXMgRG9jdW1lbnRhdGlvbiE8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhpcyBkb2N1bWVudGF0aW9uIHdhcyBwcm9kdWNlZCB1c2luZyB0aGUgZXhjZWxsZW50IEVjbGlzcGUgaW50ZWdyYXRlZCBNeWx5biBkb2N1bWVudGF0aW9uIHRvb2xzLiBQbGVhc2Ugc2VlIAorCQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0FNUC9CdWlsZGluZyIgdGFyZ2V0PSJfbmV3Ij50aGlzIHBhZ2U8L2E+IGZvciBob3cgdG8gaGVscCB3aXRoIGRvY3VtZW50YXRpb24uCisJCQkJPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ29udHJpYnV0ZSB0byBBTVAiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb250cmlidXRlX3RvX0FNUCI+PC9hPkNvbnRyaWJ1dGUgdG8gQU1QPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlBsZWFzZSBzZWUgdGhpcyBkb2N1bWVudCBmb3Igc29tZSB0aGluZ3MgdGhhdCB3ZSBjb3VsZCB1c2UgaGVscCBvbjogCisJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvQU1QL0dldHRpbmdfSW52b2x2ZWQiIHRhcmdldD0iX25ldyI+b3VyIHdpa2k8L2E+LiBCdXQgdGhlIGJlc3QgdGhpbmcgaXMgdG8gbG9vayBhdCB0aGUgYnVnemlsbGEuIEZpbmQgYnVncyB0aGF0IHlvdSBjYW4gaGVscCB3aXRoLCBvciBhZGQgeW91ciBvd24gaWRlYXMgZm9yIGhlbHBmdWwgZmVhdHVyZXMuCisJCQkJPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj4KKzxocj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9IlJlc291cmNlcy5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj5DaGFwdGVyJm5ic3A7OC4mbmJzcDtSZXNvdXJjZXMmbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9UdXRvcmlhbHMuaHRtbCBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1R1dG9yaWFscy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODExYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9UdXRvcmlhbHMuaHRtbApAQCAtMCwwICsxLDg5NiBAQAorPGh0bWw+Cis8aGVhZD4KKzxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFsczwvdGl0bGU+Cis8bGluayBocmVmPSJib29rLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cis8bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43Ni4wIiBuYW1lPSJnZW5lcmF0b3IiPgorPGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEd1aWRlIj4KKzxsaW5rIHJlbD0icHJldiIgaHJlZj0iVXNlcl9HdWlkZS5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzMuJm5ic3A7VXNlciBHdWlkZSI+Cis8bGluayByZWw9Im5leHQiIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzUuJm5ic3A7UHJvZ3JhbWVyIEd1aWRlIj4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5DaGFwdGVyJm5ic3A7NC4mbmJzcDtUdXRvcmlhbHM8L3RoPgorPC90cj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjIwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJVc2VyX0d1aWRlLmh0bWwiPlByZXY8L2E+Jm5ic3A7PC90ZD48dGggYWxpZ249ImNlbnRlciIgd2lkdGg9IjYwJSI+Jm5ic3A7PC90aD48dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjAlIj4mbmJzcDs8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sIj5OZXh0PC9hPjwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzxocj4KKzwvZGl2PgorPGRpdiBjbGFzcz0iY2hhcHRlciIgdGl0bGU9IkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlR1dG9yaWFscyI+PC9hPkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFsczwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJ0b2MiPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0Rlc2lnbmluZ19hX01vZGVsIj5EZXNpZ25pbmcgYSBNb2RlbDwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI01vZGVsX0dvYWxzIj5Nb2RlbCBHb2FsczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjTW9kZWxfSW1wbGVtZW50YXRpb24iPk1vZGVsIEltcGxlbWVudGF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjU2V0dXAiPlNldHVwPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjT3Blbl9BZ2VudF9Nb2RlbGluZ19QZXJzcGVjdGl2ZSI+T3BlbiBBZ2VudCBNb2RlbGluZyBQZXJzcGVjdGl2ZTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0NyZWF0ZV9Qcm9qZWN0Ij5DcmVhdGUgUHJvamVjdDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI05hbWVfcHJvamVjdCI+TmFtZSBwcm9qZWN0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjQ3JlYXRlX01vZGVsIj5DcmVhdGUgTW9kZWw8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI1N0cnVjdHVyZV8zIj5TdHJ1Y3R1cmU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNCdWdfQWdlbnQiPkJ1ZyBBZ2VudDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0dyaWRfU3BhY2UiPkdyaWQgU3BhY2U8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0FjdGlvbnNfUGFydF9JIj5BY3Rpb25zIFBhcnQgSTwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0NyZWF0ZV9Jbml0aWFsaXplX1J1bGUiPkNyZWF0ZSBJbml0aWFsaXplIFJ1bGU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNSdW5fSW5pdGlhbF9Nb2RlbCI+UnVuIEluaXRpYWwgTW9kZWw8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI1N0eWxlc18yIj5TdHlsZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNDcmVhdGVfQnVnX1N0eWxlIj5DcmVhdGUgQnVnIFN0eWxlPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNBY3Rpb25zX1BhcnRfSUkiPkFjdGlvbnMgUGFydCBJSTwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0NyZWF0ZV9TZWxlY3RfYW5kX1F1ZXJ5X0FjdGlvbnMiPjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI1J1bl9GaW5hbF9Nb2RlbCI+UnVuIEZpbmFsIE1vZGVsPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlc2lnbmluZyBhIE1vZGVsIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJEZXNpZ25pbmdfYV9Nb2RlbCI+PC9hPkRlc2lnbmluZyBhIE1vZGVsPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkluIHRoaXMgdHV0b3JpYWwsIHdlJ2xsIHdhbGsgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2YgYSBjb21wbGV0ZSBtb2RlbC4gV2hpbGUgdGhlIHR1dG9yaWFsIHNlZW1zIGxlbmd0aHksIHRoYXQncyBiZWNhdXNlIHdlJ3ZlIHRyaWVkIHRvIGJlIHRob3JvdWdoIGluIGRlc2NyaWJpbmcgZWFjaCBzdGVwLiBBcyB3ZSBkZW1vbnN0cmF0ZSBpbiBhbiBvbmxpbmUgdmlkZW8sIHRoZSBhY3R1YWwgbW9kZWwgY2FuIGJlIGNyZWF0ZWQgaW4ganVzdCBhIGNvdXBsZSBvZiBtaW51dGVzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb2RlbCBHb2FscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vZGVsX0dvYWxzIj48L2E+TW9kZWwgR29hbHM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QmVmb3JlIGJlZ2lubmluZyBhIG1vZGVsaW5nIHByb2plY3QgaXQgaXMgaW1wb3J0YW50IHRvIGhhdmUgYSBjbGVhciBpZGVhIG9mIHdoYXQgaXMgYmVpbmcgbW9kZWxlZCBhbmQgaG93IGl0IHNob3VsZCBiZSBtb2RlbGVkLiBXZSBuZWVkIHRvIGtub3cgYSBiaXQgYWJvdXQgd2hlcmUgd2UgYXJlIGdvaW5nIGJlZm9yZSB3ZSBzdGFydC4gRm9yIG91ciB0YXJnZXQsIHdlJ2xsIHVzZSBhIG1vZGVsIGRlc2NyaWJlZCBpbiBhIHBhcGVyIHdyaXR0ZW4gYnkgUmFpbHNiYWNrLCBMeXRpZW4gYW5kIEdyaW1tLiBUaGV5IGRlc2NyaWJlICJTdHVwaWQgTW9kZWwiLCBhIG1vZGVsIHRoYXQgY291bGQgYmUgdXNlZCB0byBwcm92aWRlIGEgY29tbW9uIHN0YW5kYXJkIHRvIGRlbW9uc3RyYXRlZCBmZWF0dXJlcyBvZiBkaWZmZXJlbnQgQWdlbnQtQmFzZWQgTW9kZWxpbmcgcGxhdGZvcm1zLiBTZWUgCisJCQkJCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2NvbmRvci5kZXBhdWwuZWR1L35zbHl0aW5lbi9hYm0vU3R1cGlkTW9kZWxGb3JtdWxhdGlvbi5wZGYiIHRhcmdldD0iX25ldyI+aHR0cDovL2NvbmRvci5kZXBhdWwuZWR1L35zbHl0aW5lbi9hYm0vU3R1cGlkTW9kZWxGb3JtdWxhdGlvbi5wZGY8L2E+IGZvciB0aGUgY29tcGxldGUgc3BlY2lmaWNhdGlvbi4gSGVyZSBhcmUgdGhlIGtleSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGJhc2ljIG1vZGVsLgorCQkJCTwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5UaGUgc3BhY2UgaXMgYSB0d28tZGltZW5zaW9uYWwgZ3JpZCBvZiBkaW1lbnNpb25zIDEwMCB4IDEwMC4gVGhlIHNwYWNlIGlzIHRvcm9pZGFsLCBtZWFuaW5nIHRoYXQgaWYgYnVncyBtb3ZlIG9mZiBvbmUgZWRnZSBvZiB0aGUgZ3JpZCB0aGV5IGFwcGVhciBvbiB0aGUgb3Bwb3NpdGUgZWRnZS48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD4xMDAgYnVnIGFnZW50cyBhcmUgY3JlYXRlZC4gVGhleSBoYXZlIG9uZSBiZWhhdmlvcjogbW92aW5nIHRvIGEgcmFuZG9tbHkgY2hvc2VuIGdyaWQgbG9jYXRpb24gd2l0aGluICsvLSA0IGNlbGxzIG9mIHRoZWlyIGN1cnJlbnQgbG9jYXRpb24sIGluIGJvdGggdGhlIFggYW5kIFkgZGlyZWN0aW9ucy4gSWYgdGhlcmUgYWxyZWFkeSBpcyBhIGJ1ZyBhdCB0aGUgbG9jYXRpb24gKGluY2x1ZGluZyB0aGUgbW92aW5nIGJ1ZyBpdHNlbGYsIGJ1Z3MgYXJlIG5vdCBhbGxvd2VkIHRvIHN0YXkgYXQgdGhlaXIgY3VycmVudCBsb2NhdGlvbiB1bmxlc3Mgbm9uZSBvZiB0aGUgbmVpZ2hib3Job29kIGNlbGxzIGFyZSB2YWNhbnQpLCB0aGVuIGFub3RoZXIgbmV3IGxvY2F0aW9uIGlzIGNob3Nlbi4gVGhpcyBhY3Rpb24gaXMgZXhlY3V0ZWQgb25jZSBwZXIgdGltZSBzdGVwLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlRoZSBidWdzIGFyZSBkaXNwbGF5ZWQgb24gdGhlIHNwYWNlLiBCdWdzIGFyZSBkcmF3biBhcyByZWQgY2lyY2xlcy4gVGhlIGRpc3BsYXkgaXMgdXBkYXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGltZSBzdGVwLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsIEltcGxlbWVudGF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJNb2RlbF9JbXBsZW1lbnRhdGlvbiI+PC9hPk1vZGVsIEltcGxlbWVudGF0aW9uPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTZXR1cCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNldHVwIj48L2E+U2V0dXA8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik9wZW4gQWdlbnQgTW9kZWxpbmcgUGVyc3BlY3RpdmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPcGVuX0FnZW50X01vZGVsaW5nX1BlcnNwZWN0aXZlIj48L2E+T3BlbiBBZ2VudCBNb2RlbGluZyBQZXJzcGVjdGl2ZTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIHNwZWNpYWwgQWdlbnQgTW9kZWxpbmcgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5QZXJzcGVjdGl2ZTwvc3Ryb25nPjwvc3Bhbj4gY2FuIGJlIHVzZWQgdG8gc2V0dXAgeW91ciAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPldvcmtzcGFjZTwvc3Ryb25nPjwvc3Bhbj4gZm9yIG1vZGVsaW5nLiBEZXBlbmRpbmcgb24geW91ciBob3cgeW91IGluc3RhbGxlZCB0aGUgYWdlbnQgbW9kZWxpbmcgdG9vbHMsIHlvdSBjYW4gc2ltcGx5IHBpY2sgdGhlIHBlcnNwZWN0aXZlIGZyb20gdGhlIGNob2ljZXMgaW4gdGhlIHVwcGVyLXJpZ2h0IGhhbmQgb2YgeW91ciB3b3JrYmVuY2g6CisJCQkJCTwvcD4KKzxwPgorCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwwUGVyc3BlY3RpdmUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzxwPk9yLCBpZiB5b3UgY2FuJ3Qgc2VlIGl0IHRoZXJlLCB5b3UgY2FuIGFjY2VzcyBpdCBieSBzZWxlY3RpbmcgdGhlIG1lbnUgJycnT3BlbiBQZXJzcGVjdGl2ZSAmZ3Q7IE90aGVyLi4uIGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgQWdlbnQgTW9kZWxpbmcgcGVyc3BlY3RpdmUgZnJvbSB0aGUgcHJvdmlkZWQgb3B0aW9uczo8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMFBlcnNwZWN0aXZlMi5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRlIFByb2plY3QiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfUHJvamVjdCI+PC9hPkNyZWF0ZSBQcm9qZWN0PC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLCB3ZSBuZWVkIGEgcHJvamVjdCAtLSBhIGZvbGRlciB0byBvcmdhbml6ZSBvdXIgbW9kZWxzIHdpdGhpbi4gUmlnaHQtY2xpY2sgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIgYW5kIHNlbGVjdCAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPk5ldyAmZ3Q7IEFnZW50IE1vZGVsaW5nIEVzY2FwZSBQcm9qZWN0PC9zdHJvbmc+PC9zcGFuPi4KKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik5hbWUgcHJvamVjdCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik5hbWVfcHJvamVjdCI+PC9hPk5hbWUgcHJvamVjdDwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5XZSdsbCBnZXQgYSBkaWFsb2cgYWxsb3dpbmcgdXMgdG8gbmFtZSB0aGUgcHJvamVjdC4gTGV0J3MgY2FsbCBpdCBzb21ldGhpbmcgc2ltcGxlLjwvcD4KKzxwPgorCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgTW9kZWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfTW9kZWwiPjwvYT5DcmVhdGUgTW9kZWw8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+V2UnbGwgbmVlZCBhIG1vZGVsIGFzIHdlbGwuIFRoaXMgaXMgdGhlIGNvbnRhaW5lciBmb3IgYWxsIG9mIHRoZSB0aGUgYWdlbnRzIGFuZCBiZWhhdmlvcnMgd2UnbGwgYmUgZGVmaW5pbmcuIFJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0IGZvbGRlciBhbmQgY2hvb3NlIAorCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+TmV3ICZndDsgQWdlbnQgTW9kZWw8L3N0cm9uZz48L3NwYW4+LgorCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsM0NyZWF0ZU1vZGVsLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5Zb3UnbGwgc2VlIGEgbW9kZWwgY3JlYXRpb24gd2l6YXJkIGZyb20gd2hpY2ggeW91IGNhbiBuYW1lIHRoZSBtb2RlbC4gSnVzdCBnaXZlIGl0IHRoZSBuYW1lICJTdHVwaWRNb2RlbDEubWV0YWFibSIuPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDRDcmVhdGVNb2RlbC5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+Q2xpY2sgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5OZXh0PC9zdHJvbmc+PC9zcGFuPiB0byBzZWUgc29tZSBvdGhlciBvcHRpb25zLiBXZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnkgb2YgdGhpczoKKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDVDcmVhdGVQYWdlMi5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+U28ganVzdCBjbGljayB0aGUgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5GaW5pc2g8L3N0cm9uZz48L3NwYW4+IGJ1dHRvbiBhbmQgd2UncmUgcmVhZHkgdG8gbW92ZSBvbiB3aXRoIHRoZSB0dXRvcmlhbC4KKwkJCQkJPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTdHJ1Y3R1cmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdHJ1Y3R1cmVfMyI+PC9hPlN0cnVjdHVyZTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQnVnIEFnZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQnVnX0FnZW50Ij48L2E+QnVnIEFnZW50PC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgTmV3IEFnZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ3JlYXRlX05ld19BZ2VudCI+PC9hPkNyZWF0ZSBOZXcgQWdlbnQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+T3VyIGZpcnN0IHN0ZXAgaXMgdG8gY3JlYXRlIGFuIGFnZW50LiBUaGUgcm9vdCBjb250ZXh0cyBhbmQgYSBudW1iZXIgb2YgbmVjY2Vzc2FyeSBtb2RlbCBjb21wb25lbnRzIHdlcmUgYWxyZWFkeSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuIFNvIHJpZ2h0LWNsaWNrIG9uIHRoZSByb290ICJTdHVwaWRNb2RlbDEiIGNvbnRleHQgYW5kIHNlbGVjdCAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5DcmVhdGUgTWVtYmVyICZndDsgQWdlbnQ8L3N0cm9uZz48L3NwYW4+LgorCQkJCQkJPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWw2Q3JlYXRlYWdlbnQucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJOYW1lIEFnZW50Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTmFtZV9BZ2VudCI+PC9hPk5hbWUgQWdlbnQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TGV0J3MgY2FsbCBpdCAiQnVnIi4gSW4gdGhlIGxvd2VyIGxlZnQtaGFuZCBjb3JuZXIgeW91IHNob3VsZCBzZWUgdGhlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz48L3NwYW4+IFZpZXcuIFRoaXMgaXMgd2hlcmUgeW91J2xsIGVkaXQgbW9kZWwgdmFsdWVzIHdoZW4gd29ya2luZyB3aXRoIHRoZSB0cmVlIGVkaXRvci4gVGhlIHByb3BlcnRpZXMgdmlldyAtLSBhcyB3aXRoIGFueSBvdGhlciB2aWV3LS0tIGNhbiBiZSBtb3ZlZCBhbnl3aGVyZSB3aXRoaW4gdGhlIHdvcmtiZW5jaCBhbmQgaWYgeW91IGNhbid0IGZpbmQgaXQgLS0gb3IgYW55IG90aGVyIHZpZXdzIC0tIHlvdSBjYW4gYWx3YXlzIGxjb2F0ZSBpdCB0aHJvdWdoIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPldpbmRvdyAmZ3Q7IFNob3cgVmlldyAmZ3Q7IE90aGVyPC9zdHJvbmc+PC9zcGFuPi4gRmluZCB0aGUgIkxhYmVsIiBwcm9wZXJ0eSBhbmQgdHlwZSBvdXIgbmV3IG5hbWUgaW50byBpdC4gWW91J2xsIHNlZSB0aGF0IGFsbCBvZiB0aGUgcmVsYXRlZCBuYW1lIHByb3Blcml0ZXMgYXJlIGFsc28gdXBkYXRlZC4KKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsNk5hbWVCdWcucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJUaGUgQ3JlYXRlIEFnZW50IEFjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlRoZV9DcmVhdGVfQWdlbnRfQWN0aW9uIj48L2E+VGhlIENyZWF0ZSBBZ2VudCBBY3Rpb248L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+V2hpbGUgd2UndmUgYmVlbiBtYWtpbmcgdGhlc2UgY2hhbmdlcywgdGhlIG1vZGVsaW5nIGZyYW1ld29yayBoYXMgYWxzbyBiZWVuIGRvaW5nIHNvbWUgd29yayBiZWhpbmQgdGhlIHNjZW5lcy4gRm9yIGV4YW1wbGUsIGl0IGhhcyBjcmVhdGVkIGFuIGF0dHJpYnV0ZSBhbmQgYSBydWxlIHRvIGNyZWF0ZSB0aGUgYWdlbnRzLiBPcGVuIHRoZSBBY3Rpb25zIG5vZGUgYW5kIHRoZSBBdHRyaWJ1dGVzIG5vZGUgdG8gc2VlIHRoZXNlIGNoYW5nZXMuIElmIHdlIGxvb2sgYXQgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBtb2RlbCwgd2UgY2FuIHNlZSB0aGF0IGFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYWdlbnRzIGhhcyBiZWVuIGNyZWF0ZWQgY2FsbGVkICJCdWcgQ291bnQiLiBTZWxlY3QgaXQsIHRoZW4gZW50ZXIgIjEwMCIgYXMgdGhlIGRlZmF1bHQgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSB2YWx1ZSB0aGUgbW9kZWwgd2lsbCB1c2UgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGFueXdoZXJlIGVsc2UgKGxpa2UgaW4gdGhlIHBhcmFtZXRlciBsYXVuY2hlcikuPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxMEFnZW50Q291bnQucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5Zb3UgbWlnaHQgd2FudCB0byB0YWtlIGEgbG9vayBhdCB0aGUgQ3JlYXRlIEJ1Z3MgcnVsZSwgYnV0IHRoZXJlIGlzbid0IGFueXRoaW5nIHdlIG5lZWQgdG8gY2hhbmdlIHRoZXJlLjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTFCdWlsZEFnZW50cy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR3JpZCBTcGFjZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdyaWRfU3BhY2UiPjwvYT5HcmlkIFNwYWNlPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgR3JpZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9HcmlkIj48L2E+Q3JlYXRlIEdyaWQ8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TmV4dCwgd2UnbGwgY3JlYXRlIGEgZ3JpZCBmb3IgdGhlIEJ1Z3MgdG8gbW92ZSBhcm91bmQgdXBvbi4gUmlnaHQtY2xpY2sgb24gdGhlIFN0dXBpZE1vZGVsMSBjb250ZXh0IGFuZCBjaG9vc2UgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+TmV3ICZndDsgR3JpZDwvc3Ryb25nPjwvc3Bhbj4uCisJCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDdDcmVhdGVHcmlkLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2V0IEdyaWQgUGFyYW1ldGVycyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNldF9HcmlkX1BhcmFtZXRlcnMiPjwvYT5TZXQgR3JpZCBQYXJhbWV0ZXJzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk5vdywgbG9va2luZyBhdCB0aGUgcHJvcGVydGllcyBmb3IgdGhlIEdyaWQgd2UndmUganVzdCBjcmVhdGVkLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgdG8gc2V0LiBXZSB3YW50IHRvIG1ha2UgYSBudW1iZXIgb2YgY2hhbmdlcy48L3A+Cis8ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+Cis8b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSIxIj4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+U2V0IHRoZSBzcGFjZSdzICJCb3JkZXIgUnVsZSIgcHJvcGVydHkgdG8gYmUgIlBlcmlvZGljIiAtLSB0aGUgZWRnZXMgd3JhcCBhcm91bmQgZnJvbSBvbmUgZWdlIHRvIHRoZSBvdGhlci48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5TZXQgdGhlICJOZWlnaGJvcmhvb2QiIHByb3BlcnR5IHRvIGJlICJNb29yZSIgLS0gdGhhdCdzIGhvdyB3ZSBhcmUgZ29pbmcgdG8gaW50ZXJwcmV0IHRoZSBzdGF0ZW1lbnQgImluIHRoZSBYIGFuZCBZIGRpcmVjdGlvbnMiLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlNldCB0aGUgZGltZW5zaW9uYWxpdHkgdG8gIjIiLiAoWW91IG1pZ2h0IG5lZWQgdG8gZW5sYXJnZSB0aGUgUHJvcGVydHkgdmlldyBvciB1c2UgdGhlIHNjcm9sbCBiYXIgdG8gc2VlIHRoZSBEaW1lbnNpb25hbGl0eSBwcm9wZXJ0eS4pPC9wPgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsOEdyaWRQYXJhbWV0ZXJzLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+QWdhaW4sIHRoZSBmcmFtZXdvcmsgaGFzIHRha2VuIGNhcmUgb2Ygc29tZSB0aGluZ3MgZm9yIHVzIGF1dG9tYXRpY2FsbHkuIElmIHdlIG5vdyBvcGVuIHRoZSBHcmlkIG5vZGUsIHdlIGNhbiBzZWUgdGhhdCAiV2lkdGgiIGFuZCAiSGVpZ2h0IiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIHRoZSBkaW1lbnNpb25hbGl0eSB3ZSd2ZSBqdXN0IGRlZmluZWQuIFdlJ2xsIHNldCBlYWNoIG9mIHRoZW0gdG8gIjEwMCIsIHNvIHRoYXQgd2UgZW5kIHVwIHdpdGggYSAxMDAgeCAxMDAgZ3JpZC4gKFdoaWNoIGlzIHByZXR0eSBsYXJnZSBmb3IgYSBtb2RlbCBvZiB0aGlzIGtpbmQsIGJ1dCB3ZSB3YW50IHRvIGdvIHdpdGggdGhlIGJhc2ljIHNwZWNpZmljYXRpb24uKTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsOUdyaWREaW1zLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVGhlIEJ1aWxkIEdyaWQgQWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVGhlX0J1aWxkX0dyaWRfQWN0aW9uIj48L2E+VGhlIEJ1aWxkIEdyaWQgQWN0aW9uPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBBZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgaGFzIGFsc28gY3JlYXRlZCBhIEJ1aWxkIEdpcmQgQWN0aW9uIGZvciB1cy4gSWYgeW91IG5hdmlnYXRlIHRvIHRoZSBTdHVwaWRNb2RlbDEgY29udGV4dCBBY3Rpb25zIG5vZGUgYWdhaW4sIHlvdSBjYW4gc2VlIHRoZSBBY3Rpb24uIElmIHlvdSBjbGljayBvbiBpdCB5b3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgc2V0OjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTRCdWlsZEdyaWRQYXJhbXMucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5JZiB5b3UgY2xpY2sgb24gdGhlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPi4uLjwvc3Ryb25nPjwvc3Bhbj4gYnV0dG9uIG5leHQgdG8gdGhlICJBZ2VudHMiIHByb3BlcnR5IHlvdSdsbCBzZWUgc2VlIHRoZSBCdWcsIHdoaWNoIGlzIHRoZSBhZ2VudCB0aGF0IHdpbGwgYmUgbW92aW5nIGFyb3VuZCB1cG9uIHRoZSBncmlkLgorCQkJCQkJPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxM0J1aWxkR3JpZEFnZW50cy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBY3Rpb25zIFBhcnQgSSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFjdGlvbnNfUGFydF9JIj48L2E+QWN0aW9ucyBQYXJ0IEk8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBJbml0aWFsaXplIFJ1bGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfSW5pdGlhbGl6ZV9SdWxlIj48L2E+Q3JlYXRlIEluaXRpYWxpemUgUnVsZTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Ob3cgd2UgY2FuIG1ha2UgdGhlc2UgYnVncyBkbyBzb21ldGhpbmcuIExldCdzIGNyZWF0ZSBvdXIgZmlyc3QgcnVsZS4gSW4gdGhpcyBjYXNlIHdlJ3JlIGdvaW5nIHRvIGNyZWF0ZSBhIHNwZWNpYWwgSW5pdGlhbGl6ZSBBY3Rpb24gdGhhdCBleGVjdXRlcyBvbmNlIHdoZW4gdGhlIG1vZGVsIGlzIGZpcnN0IGNyZWF0ZWQgZm9yIGVhY2ggYWdlbnQuIEFsbCBBY3Rpb25zIGJlZ2luIGZyb20gdGhlIGFnZW50IChvciBzdHlsZSkgQWN0aW9ucyBsaXN0IGFuZCB0aGVyZSBhcmUgb25seSBhIGZldyBBY3Rpb25zIHRoYXQgY2FuIHNlcnZlIGFzIHJvb3RzLiBTZWUgdGhlIERlc2lnbiBzZWN0aW9uIG9mIHRoaXMgZ3VpZGUgZm9yIG11Y2ggbW9yZSBvbiB0aGF0LiBPcGVuIHRoZSBCdWcgbm9kZSBieSBjbGlja2luZyB0aGUgdHJpYW5nbGUgaWNvbiwgcmlnaHQtY2xpY2sgb24gdGhlIEFjdGlvbnMgbm9kZSBhbmQgc2VsZWN0IHRoZSAnJydDcmVhdGUgTWVtYmVyICZndDsgSW5pdGlhbGl6ZSBBY3Rpb24uPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE1Q3JlYXRlSW5pdGlhbGl6ZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBTZWxlY3QgQWN0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ3JlYXRlX1NlbGVjdF9BY3Rpb24iPjwvYT5DcmVhdGUgU2VsZWN0IEFjdGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5OZXh0LCByaWdodCBjbGljayBvbiB0aGUgbmV3IEluaXRpYWxpemUgbm9kZSBhbmQgY2hvb3NlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkNyZWF0ZSBNZW1iZXIgJmd0OyBTZWxlY3Q8L3N0cm9uZz48L3NwYW4+IHRvIGNyZWF0ZSBhIFNlbGVjdCB0YXJnZXQuCisJCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE2Q3JlYXRlU2VsZWN0LnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+U2VsZWN0cyBhcmUgdGhlIGNlbnRyYWwgYnVpbGRpbmcgYmxvY2tzIG9mIG1vZGVsIGFjdGlvbnMgYW5kIGRlZmluZSB0aGUgYmFzaXMgZm9yIFF1ZXJ5IGFuZCBMb2dpYyBBY3Rpb25zIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGFuZCB1c2VkIGluIHN1YnNlcXVlbnQgdGFyZ2V0cy4gVGFyZ2V0cyBhcmUgYWN0aW9ucyB0aGF0ICJmb2xsb3cgZnJvbSIgb3RoZXIgYWN0aW9ucy4gV2l0aCB0aGlzIFNlbGVjdCB3ZSBhcmUgZ29pbmcgdG8gYmUgc2VhcmNoaW5nIGZvciBwbGFjZXMgZm9yIHRoZSBCdWcgdG8gbW92ZSB0byBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGUgbW9kZWwgcnVuLiBIZXJlIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgc3BhY2Ugd2Ugd2lsbCBiZSBsb29raW5nIGZvciBjZWxscyB3aXRoaW4sIHNvIHdlIHNldCB0aGUgU3BhY2UgcHJvcGVydHkgdG8gIkdyaWQgMkQiLiBOb3JtYWxseSwgd2UnZCBzcGVjaWZ5IGFuIGFnZW50IGFzIHdlbGwsIGJ1dCBhcyB0aGUgR3JpZCAyRCBjZWxscyBkb24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzLCB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSB0aGVtIGV4cGxpY2l0bHkuIFNvIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQWdlbnQgcHJvcGVydHkgaXMgbnVsbCAoYmxhbmspLjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTY1U2VsZWN0Mi5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBRdWVyeSBBY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfUXVlcnlfQWN0aW9uIj48L2E+Q3JlYXRlIFF1ZXJ5IEFjdGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5OZXh0LCB3ZSBjcmVhdGUgYSBRdWVyeSBBY3Rpb24uIEEgcXVlcnkgaXMgcmVhbGx5IGEgcXVlcnkgdGVybTsgd2UncmUgc3BlY2lmeWluZyBzb21lIGFzcGVjdCBvZiB0aGUgc2VhcmNoIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbi48L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE3Q3JlYXRlUXVlcnkucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5JbiB0aGlzIGNhc2Ugd2Ugd2FudCBhIHNwZWNpYWwga2luZCBvZiBxdWVyeSwgYSBxdWVyeSB3aXRoaW4gc3BhY2UgZm9yIGFueSBhZ2VudHMgdGhhdCBhcmUgYXZhaWxhYmxlOyB0aGF0IGlzIHVub2NjdXBpZWQgYnkgYW5vdGhlciBhZ2VudC4gU28gd2Ugc2VsZWN0ICJTcGF0aWFsOiBBdmFpbGFibGUiIGZvcm0gdGhlIGRyb3AgZG93biBsaXN0IG9mIHF1ZXJ5IGZ1bmN0aW9ucy48L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE4UXVlcnlGdW5jdGlvbi5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBNb3ZlIEFjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9Nb3ZlX0FjdGlvbiI+PC9hPkNyZWF0ZSBNb3ZlIEFjdGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5GaW5hbGx5LCBhcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBpbml0aWFsIGFjdGlvbiBzcGVjaWZpY2F0aW9uLCB3ZSdsbCBjcmVhdGUgYSBNb3ZlIEFjdGlvbiB1c2luZyAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5DcmVhdGUgTWVtYmVyICZndDsgTW92ZTwvc3Ryb25nPjwvc3Bhbj4uIChOb3Qgc2hvd24uKSBUaGUgcHJvcGVydGllcyBzaG91bGQgYmUgY29ycmVjdCwgYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3Rpb24gcHJvcGVydHkgaXMgIkluaXRpYWxpemUiICh0aGUgcm9vdCksIGFuZCB0aGUgZGVzdGluYXRpb24gcHJvcGVydHkgaXMgIkJ1ZyIgKHRoZSBTZWxlY3QgQWN0aW9uIHdlJ3ZlIGRlZmluZWQgYWJvdmUpLiBMaWtlIHRoaXM6CisJCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE5TW92ZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUnVuIEluaXRpYWwgTW9kZWwiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSdW5fSW5pdGlhbF9Nb2RlbCI+PC9hPlJ1biBJbml0aWFsIE1vZGVsPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoYXQncyBhbGwgd2UgaGF2ZSB0byBkbyB0byBjcmVhdGUgb3VyIGZpcnN0IHdvcmtpbmcgbW9kZWwhIE5vdywgZ28gdG8gdGhlIAorCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UGFja2FnZSBFeHBsb3Jlcjwvc3Ryb25nPjwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgU3R1cGlkTW9kZWwxLm1ldGFhYm0gZmlsZS4gUmlnaHQtY2xpY2sgb24gaXQgYW5kIHNlbGVjdCAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkV4ZWN1dGU8L3N0cm9uZz48L3NwYW4+LiBPciBjbGljayBvbiB0aGUgZmlyc3QgIm0iIGJ1dHRvbiBpbiB0aGUgdG9vbGJhci4gKEFnYWluLCB3ZSd2ZSBzaW1wbGlmaWVkIHRoZSB0b29sYmFyIGZvciB0aGlzIHR1dG9yaWFsLCBzbyB5b3UgbWF5IGhhdmUgbW9yZSBidXR0b25zIGFwcGVhcmluZyB0aGVuIHdlJ3JlIHNob3dpbmcgaGVyZS4KKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIwRXhlY3V0ZU1vZGVsLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5BIG5ldyBwZXJzcGVjdGl2ZSBmb3IgIkFnZW50IEV4ZWN1dGlvbiIgd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gdXAgYW5kIHlvdSBjYW4gc2VlIHRoYXQgdGhlIGFnZW50cyBoYXZlIHBsYWNlZCB0aGVtc2VsdmVzIGluIHRoZSBncmlkLiBUaGV5IGRvbid0IGRvIGFueXRoaW5nIGVsc2UgeWV0LjwvcD4KKzxwPgorCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMUV4ZWN1dGUyLnBuZyAiPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTdHlsZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdHlsZXNfMiI+PC9hPlN0eWxlczwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRlIEJ1ZyBTdHlsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9CdWdfU3R5bGUiPjwvYT5DcmVhdGUgQnVnIFN0eWxlPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgU3R5bGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfU3R5bGUiPjwvYT5DcmVhdGUgU3R5bGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+V2hpbGUgRXNjYXBlIGFzc2lnbnMgYSBkZWZhdWx0IGNvbG9yIG9mIGJsYWNrIGZvciB0aGUgYWdlbnRzLCB3ZSdsbCB3YW50IHNvbWV0aGluZyBtb3JlIGludGVyZXN0aW5nIC0tIHNvIGxldCdzIG1ha2UgdGhlIEJ1Z3MgcmVkLiBBZ2VudCB2aXN1YWxpemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgb3JkaW5hcnkgYWdlbnQgcnVsZXMuIFNvIGZpcnN0LCBsZXQncyBjcmVhdGUgYSBuZXcgU3R5bGUuIFJpZ2h0IGNsaWNrIG9uIHRoZSAiU3R5bGVzIiBub2RlIGFuZCBzZWxlY3QgJycnPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMkNyZWF0ZVN0eWxlLnBuZyAiPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxwPkJ5IGRlZmF1bHQgdGhlIHN0eWxlIHdpbGwgYmUgY2FsbGVkIEJ1Z1N0eWxlMkQuIE9wZW4gdGhlIFN0eWxlIHRvIHRoZSBBY3Rpb25zIG5vZGUgYW5kIGNyZWF0ZSBhIHJ1bGUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRlIFN0eWxlIFJ1bGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDcmVhdGVfU3R5bGVfUnVsZSI+PC9hPkNyZWF0ZSBTdHlsZSBSdWxlPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjNDcmVhdGVTdHlsZVJ1bGUucG5nICI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+Tm93IHdlIG5lZWQgdG8gY3JlYXRlIGEgc2VyaWVzIG9mIGV2YWx1YXRpb25zLiBBbiBFdmFsdWF0aW9uIGlzIGxpa2UgYSBRdWVyeSBpbiB0aGF0IGl0IHBlcmZvcm1zIHNvbWUga2luZCBvZiBmdW5jdGlvbiBpbiB0aGUgYnJvYWRlc3Qgc2Vuc2UsIGJ1dCB1bmxpa2UgYSBRdWVyeSwgaXQgZG9lcyBub3QgYWZmZWN0IHdoZXRoZXIgdGFyZ2V0IChkb3duc3RyZWFtKSBBY3RzIGFyZSBwZXJmb3JtZWQuIEZvciBTdHlsZXMgd2UgaGF2ZSBhIHNldCBvZiBHcmFwaGljIGZ1bmN0aW9ucyB0aGF0IHdlIHdpbGwgY2hhaW4gdG9nZXRoZXIgdG8gZHJhdyBhIGZpZ3VyZS4gRmlyc3Qgd2UgY3JlYXRlIHRoZSBFdmFsdWF0aW9uLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBFdmFsdWF0aW9ucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9FdmFsdWF0aW9ucyI+PC9hPkNyZWF0ZSBFdmFsdWF0aW9uczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5XZSBtYWtlIHRoZSBmaXJzdCBFdmFsdWF0aW9uIGRlZmluZSBhIENvbG9yIG9mICJSZWQiLiBSaWdodCBjbGljayBvbiB0aGUgbmV3IFJ1bGUsIGFuZCBzZWxlY3QgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+TmV3ICZndDsgQ29tbWFuZCAmZ3Q7IEV2YWx1YXRlPC9zdHJvbmc+PC9zcGFuPiAobm90IHNob3duKSB0byBjcmVhdGUgYW4gRXZhbHVhdGlvbi4gVGhlbiBpbiB0aGUgZnVuY3Rpb24gcHJvcGVydHksIHNlbGVjdCAiR3JhcGhpYzogQ29sb3IgUmVkIi4KKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjRFdmFsdWF0aW9uRnVuY3Rpb24ucG5nICI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+V2UnbGwgY3JlYXRlIHR3byBtb3JlIGV2YWx1YXRpb24gdGFyZ2V0cy4gUmlnaHQtY2xpY2sgb24gdGhlICJDb2xvciBSZWQiIGV2YWx1YXRpb24gYW5kIGNyZWF0ZSBhbiBFdmFsdWF0aW9uLiBQaWNrIHRoZSAiR3JhcGhpYzogRHJhdyBPdmFsIiBmaWxsLiBGb3IgdGhlIGxhc3QgcGFydCBvZiBvdXIgc3R5bGUsIHdlIG5lZWQgdG8gYWN0dWFsbHkgZHJhdyB0aGUgZmlndXJlLiBUbyBkbyB0aGlzIHdlIGNyZWF0ZSBhIGxhc3QgRXZhbHVhdGlvbiB0YXJnZXQgZm9yICJEcmF3IE92YWwiIGFuZCBnaXZlIGl0IHRoZSAiR3JhcGhpYzogRmlsbCBTaGFwZSIgZnVuY3Rpb24uIEJ5IG5vdyBpdCBzaG91bGQgYmUgY2xlYXIgaG93IHRvIGRvIHRoaXMuICJGaWxsIiBvciAiT3V0bGluZSIgd2lsbCBhbHdheXMgY29tZSBsYXN0IGluIGEgY2hhaW4gb2YgZ3JhcGhpYyBldmFsdWF0aW9ucywgYnV0IG90aGVyd2lzZSB0aGUgb3JkZXIgc2hvdWxkbid0IG1hdHRlci4gU2VlIHRoZSBEZW1vZ3JhcGhpYyBQcmlzb25lcidzIERpbGVtbWEgbW9kZWwgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgcGljayBDb2xvcnMgYW5kIG9yIFNoYXBlcy4gWW91IHNob3VsZCBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjVGaW5pc2hTdHlsZS5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQWN0aW9ucyBQYXJ0IElJIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQWN0aW9uc19QYXJ0X0lJIj48L2E+QWN0aW9ucyBQYXJ0IElJPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRvIG1ha2Ugb3VyIGFnZW50cyBtb3ZlIHJhbmRvbWx5IGV2ZXJ5IGl0ZXJhdGlvbiwgd2Ugd2lsbCBjcmVhdGUgYSBSdWxlLiAoRm9yIHRob3NlIGZhbWlsaWFyIHdpdGggUmVwYXN0IG9yIG90aGVyIHNjaGVkdWxpbmcgb3JpZW50ZWQgQU0gcGxhdGZvcm1zLCBhIHJ1bGUgaXMganVzdCBhIHNjaGVkdWxlIHRoYXQgZ2V0cyBhY3RpdmF0ZWQgZWFjaCBhbmQgZXZlcnkgcGVyaW9kIGZvciBhbGwgYWdlbnRzLikgQXQgdGhpcyBwb2ludCBpbiB0aGUgdHV0b3JpYWwsIHdlJ2xsIHNob3cgc2NyZWVuc2hvdHMgb25seSBmb3IgYXNwZWN0cyBvZiB0aGUgbW9kZWxpbmcgcHJvY2VzcyB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIGNvdmVyZWQuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNyZWF0ZSBTZWxlY3QgYW5kIFF1ZXJ5IEFjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJOMTEyMDgiPjwvYT5DcmVhdGUgU2VsZWN0IGFuZCBRdWVyeSBBY3Rpb25zPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBCdWcgUnVsZSBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBJbml0aWFsaXplIHJ1bGUuIENyZWF0ZSBhIFNlbGVjdGlvbiBBY3Rpb24uIEFzIGJlZm9yZSwgd2UnbGwgbWFrZSB0aGUgU2VsZWN0IHN0YXRlbWVudCAiQWdlbnQiIHByb3BlcnR5IGJsYW5rLCBhcyB3ZSB3YW50IHRvIG1vdmUgdG8gYSBjZWxsLiBBcyBiZWZvcmUsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBDZWxsIGlzIGZyZWUgYmVmb3JlIHdlIHRyeSB0byBtb3ZlIGluLCBzbyB3ZSdsbCBzZWxlY3QgYSAiU3BhdGlhbDogQXZhaWxhYmxlIiBRdWVyeSBmdW5jdGlvbi4oQnkgdGhlIHdheSwgdG8gbWFrZSBzY3JvbGxpbmcgdGhyb3VnaCB0aGUgbGlzdCBlYXNpZXIsIHlvdSBjYW4gdHlwZSB0aGUgZmlyc3QgbGV0dGVycyBvZiB0aGUgc2VsZWN0aW9uLCBpbiB0aGlzIGNhc2UgIlNQIi4pPC9wPgorPHA+QnV0IG5vdywgaW5zdGVhZCBvZiBtb3ZpbmcgCisJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+YW55d2hlcmU8L3NwYW4+IHdlIHdhbnQgdG8gbW92ZSBuZWFyYnkuIFNvIG5vdywgd2UgY3JlYXRlIGEgCisJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+cGFyYWxsZWw8L3NwYW4+IG9yICJzaWJsaW5nIiBRdWVyeSBmcm9tIHRoZSBzYW1lIFNlbGVjdCByb290LiBCZWNhdXNlIHRoaXMgbmV3IFF1ZXJ5IEFjdGlvbiBpcyBhIGNoaWxkIG9mIHRoZSBTZWxlY3QgQWN0aW9uIGFuZCBub3QgdGhlICJTcGFjZSBBdmFpbGFibGUiIFF1ZXJ5IHdlJ3ZlIGp1c3QgY3JlYXRlZCwgd2UnbGwgcmlnaHQtY2xpY2sgb24gdGhlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJpdGFsaWMiPlNlbGVjdDwvc3Bhbj4gQWN0aW9uIGFuZCBjaG9vc2UgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Q3JlYXRlIFRhcmdldCAmZ3Q7IFNlbGVjdCAmZ3Q7IFF1ZXJ5PC9zdHJvbmc+PC9zcGFuPi4gTGlrZSBzbzoKKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjZDcmVhdGVRdWVyeTIucG5nICI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+T2Z0ZW4sIHdlIHdvdWxkIHBpY2sgdGhlICJTcGF0aWFsOiBOZWlnaGJvciIgZnVuY3Rpb24gdG8gdGFrZSBhIHJhbmRvbSB3YWxrLCBidXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCB3ZSBhY3R1YWxseSB3YW50IHRvIG1vdmUgaW50byBzb21lIHJhbmRvbSBDZWxsIHdpdGhpbiBkaXN0YW5jZSBmb3VyICg0KS4gU28gd2Ugd2lsbCBwaWNrICJTcGF0aWFsOiBXaXRoaW4iIGZyb20gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZpeGluZyBNb2RlbCBFcnJvcnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJGaXhpbmdfTW9kZWxfRXJyb3JzIj48L2E+Rml4aW5nIE1vZGVsIEVycm9yczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5JbnN0ZWFkIG9mIHNwZWNpZnlpbmcgdGhlIGFjdHVhbCBkaXN0YW5jZSBub3csIGxldCdzIHNlZSBob3cgdGhlIEFnZW50IE1vZGVsaW5nIEZyYW1ld29yayBlcnJvciBjaGVja2luZyBjYXBhYmlsaXRpZXMgY2FuIGhlbHAgdXMgaW4gbW9kZWwgZGV2ZWxvcG1lbnQuIFNhdmUgdGhlIG1vZGVsIGJ5IHNlbGVjdGluZyAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPjwvc3Bhbj4gZnJvbSB0aGUgYXBwbGljYXRpb24gbWVudS4gTm90aWNlIHRoYXQgYSByZWQgbWFya2VyIGFwcGVhcnMgbmV4dCB0byB0aGUgU3R1cGlkTW9kZWwxLm1ldGFhYm0gZmlsZS4gSWYgeW91IHJldmVhbCB0aGUgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UHJvYmxlbXMgVmlldzwvc3Ryb25nPjwvc3Bhbj4geW91J2xsIHNlZSBhIGxpc3Qgb2YgY3VycmVudCBlcnJvcnMgYW5kIHdhcm5pbmdzIGFuZCBpZiB5b3Ugb3BlbiB0aGUgZXJyb3JzIG5vZGUgaW4gdGhhdCBsaXN0LCB5b3UnbGwgc2VlIGFuIGl0ZW0gcmVwb3J0aW5nIHRoYXQgdGhlIGlucHV0IGhhcyBubyB2YWx1ZS4gSWYgeW91IGRvdWJsZS1jbGljayBvbiB0aGF0IGl0ZW0sIHlvdSdsbCBiZSB0YWtlbiB0byB0aGUgaW5wdXQgZm9yIHRoZSBXaXRoaW4gcXVlcnkgYW5kIHlvdSdsbCBiZSBhYmxlIHRvIGVkaXQgaXQuCisJCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI3Tm9WYWx1ZS5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5JbiBhZGRpdGlvbiB0byBlcnJvciBtYXJrZXJzLCBtZXRhQUJNIHByb3ZpZGVzIHdhcm5pbmdzIGRlc2lnbmVkIHRvIGhlbHAgeW91IGF2b2lkIGNvbW1vbiBkZXNpZ24gbWlzdGFrZXMuIEZvciBleGFtcGxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgaWYgeW91IGF0dGVtcHQgdG8gbW92ZSBhbiBhZ2VudCBmcm9tIGl0cyBzZWxlY3Rpb24gdG8gdGhlIHNhbWUgc2VsZWN0aW9uOyB0aGlzIGlzIG5vdCBzdHJpY3RseSBzcGVha2luZyBhbiBlcnJvciwgYnV0IGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLiBZb3UnbGwgYWxzbyByZWNlaXZlIGEgd2FybmluZyBmb3IgZGVmYXVsdCB2YWx1ZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHNwZWNpZmllZC4gWW91IG1pZ2h0IG5vdGljZSB0aGF0IHRoZSBEZW1vZ3JhcGhpYyBQcmlzb25uZXIncyBEaWxlbW1hIG1vZGVsIGhhcyB3YXJuaW5nIG1hcmtlcnMsIHRoaXMgaXMgYmVjYXVzZSB3ZSB3ZXJlIGhhcHB5IHdpdGggdGhlICcwJyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgYW5kIGRpZG4ndCBwcm92aWRlIGFueS4gKEJ5IHRoZSB3YXksIHlvdSBtaWdodCBhbHNvIG5vdGljZSBhIG51bWJlciBvZiBKYXZhIHdhcm5pbmdzLiBCeSBkZWZhdWx0IHRoZSBFY2xpcHNlIElERSBpcyB2ZXJ5IGNvbnNlcnZhdGl2ZSB3aGVuIGl0IGNvbWVzIHRvIHdhcm5pbmdzLCBhbmQgZXhwZWN0cyB0aGUgdXNhZ2Ugb2YgbGFuZ3VhZ2UgY29uc3RydWN0cyB0aGF0IHdlIGNob29zZSBub3QgdG8gdXNlLiBBIGZ1bGwgZGlzY3Vzc2lvbiBvZiBhbGwgb2YgdGhpcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoZSB0dXRvcmlhbCwgYnV0IHNlZSB0aGUgRWNsaXBzZSBkb2N1bWVudGF0aW9uIG9uIHByb2JsZW0gdmlld3MgZm9yIG1vcmUgaWRlYXMgYWJvdXQgaG93IHRvIGN1c3RvbWl6ZSB0aGVzZSB2aWV3cy4pPC9wPgorPHA+VG8gZml4IHRoaXMgZXJyb3Igd2UganVzdCBuZWVkIHRvIGFzc2lnbiBhIHZhbHVlIGZvciBzZWFyY2ggZGlzdGFuY2UuIFdlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPmNvdWxkPC9zdHJvbmc+PC9zcGFuPiBzaW1wbHkgY3JlYXRlIGEgbGl0ZXJhbCBmb3IgdGhlIFNwYXRpYWw6IFdpdGhpbiBRdWVyeSBidXQgdGhhdCBpc24ndCByZWFsbHkgZ29vZCBwcmFjdGljZS4gKE9yaWdpbmFsbHkgdGhlIEFnZW50IE1vZGVsaW5nIEZyYW1ld29yayBkaWRuJ3QgZXZlbiBzdXBwb3J0IExpdGVyYWwgdmFsdWVzLCBidXQgd2UgYWRkZWQgdGhlbSBmb3IgY29udmVuaWVuY2UuKSBOb3csIHdlIHdpbGwgY3JlYXRlIG91ciBmaXJzdCBBdHRyaWJ1dGUuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0aGUgQXR0cmlidXRlIHRvIGJlbG9uZyB0byB0aGUgU3R1cGlkIE1vZGVsIGFzIGl0IHdpbGwgYmUgdGhlIHNhbWUgdmFsdWUgZm9yIGFsbCBBZ2VudHMgZm9yIG5vdy4gU28gcmlnaHQtY2xpY2sgb24gdGhlIFN0dXBpZCBNb2RlbCBjb250ZXh0IEF0dHJpYnV0ZXMgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjhDcmVhdGVBdHRyaWJ1dGUucG5nICI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPHA+TmFtZSB0aGUgQXR0cmlidXRlIC0tICJCdWcgVmlzaW9uIiBzZWVtcyBkZXNjcmlwdGl2ZSAtLSBnaXZlIGl0IGEgdHlwZSBvZiBJbnRlZ2VyLCBhbmQgYXNzaWduIGl0IGEgZGVmYXVsdCB2YWx1ZSBvZiA0LiBUaGlzIHdpbGwgYWxsb3cgbW9zdCBBQk0gcGxhdGZvcm1zIHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHZpc2lvbiBhdCBydW50aW1lIG9yIHRocm91Z2ggYmF0Y2ggZGVmaW5pdGlvbnMsIHNvbWV0aGluZyB3ZSBjb3VsZG4ndCBkbyBpZiB3ZSBoYWQgdXNlZCBhIGxpdGVyYWwgdmFsdWUuPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyOUF0dHJpYnV0ZVZhbHVlcy5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5GaW5hbGx5LCB3ZSBhc3NpZ24gdGhlIFZpc2lvbiBhdHRyaWJ1dGUgdG8gdGhlICJJbnB1dCIgbm9kZSBpbiBvdXIgU3BhdGlhbDogV2l0aGluIFF1ZXJ5LjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMzBBdHRyaWJ1dGVJbnB1dC5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDcmVhdGUgSW50ZXJzZWN0aW9uIEFjdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0ZV9JbnRlcnNlY3Rpb25fQWN0aW9uIj48L2E+Q3JlYXRlIEludGVyc2VjdGlvbiBBY3Rpb248L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Tm93LCB3ZSBuZWVkIHRvIGNvbWJpbmUgdGhlIHJlcXVpcmVtZW50IHRoYXQgdGhlIGNlbGwgYmUgYXZhaWxhYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50IHRoYXQgaXQgYmUgd2l0aGluIDQgY2VsbCdzIGRpc3RhbmNlLiBUbyBhY2NvbXBsaXNoIHRoaXMsIHdlJ2xsIGFkZCBhbiBJbnRlcnNlY3Rpb24gQWN0aW9uLiBUaGUgTG9naWNhbCBBY3Rpb25zLCBpbmNsdWRpbmcgIkludGVyc2VjdGlvbiIsICJVbmlvbiIgYW5kICJOb25lIiBkZWZpbmUgaG93IFF1ZXJ5IEFjdGlvbnMgd29yayB0b2dldGhlci4gVGhlIEludGVyc2VjdGlvbiBBY3Rpb24gbmVlZHMgdG8gYmUgYSB0YXJnZXQgb2YgCisJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+Ym90aDwvc3Bhbj4gdGhlIEF2YWlsYWJsZSBhbmQgV2l0aGluIHRhcmdldHMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYWN0aW9uIGhhcyB0d28gc291cmNlcy4gU2VlIHRoZSBNb2RlbGVyJ3MgR3VpZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGFjdGlvbiBmbG93IHdvcmtzLgorCQkJCQkJPC9wPgorPHA+RWRpdGluZyBhY3Rpb25zIHdpdGggbXVsdGlwbGUgc291cmNlcyBhbmQgdGFyZ2V0cyBpcyB0aGUgbW9zdCBjb21wbGV4IGFzcGVjdCBvZiB0aGUgbW9kZWwgZWRpdG9yIHNvIHlvdSBtYXkgbmVlZCB0byB3b3JrIHdpdGggdGhpcyBleGFtcGxlIGEgYml0IGluIG9yZGVyIHRvIGdldCBhIGZlZWwgZm9yIGhvdyBpdCBzaG91bGQgd29yay4gRmlyc3QsIHdlIGNyZWF0ZSB0aGUgSW50ZXJzZWN0aW9uIEFjdGlvbiBhcyBhIHRhcmdldCBvZiB0aGUgU3BhdGlhbCBBdmFpbGFibGUgUXVlcnkuIChOb3QgdGhlIFdpdGhpbiBRdWVyeSkuPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzMUludGVyc2VjdC5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5UaGVuIHdlIG5lZWQgdG8gbWFrZSB0aGUgSW50ZXJzZWN0aW9uIEFjdGlvbiBhIHRhcmdldCBvZiB0aGUgV2l0aGluIFF1ZXJ5IGFzIHdlbGwuIFRvIGFjY29tcGxpc2ggdGhpcywgd2UgZHJhZyB0aGUgSW50ZXJzZWN0aW9uIEFjdGlvbiBvdmVyIHRoZSBXaXRoaW4gUXVlcnkgd2hpbGUgaG9sZGluZyBkb3duIHRoZSBjdHJsLWtleS4gRGVwZW5kaW5nIG9uIHlvdXIgZW52aXJvbm1lbnQsIHlvdSBtYXkgbmVlZCB0byBiZWdpbiBkcmFnZ2luZyBiZWZvcmUgeW91IGNsaWNrIHRoZSBjb250cm9sIGtleSAtLSBvdGhlcndpc2UsIHlvdXIgaW5pdGlhbCBjb250cm9sIGNsaWNrIHdpbGwgYnJpbmcgdXAgdGhlIGNvbnRleHQgbWVudS4gSXQncyBhIGJpdCBoYXJkIHRvIHNlZSB0aGlzIGluIGEgc3RhdGljIGltYWdlLCBidXQgeW91IHNpbXBseSBuZWVkIHRvIGNsaWNrIG9uIHRoZSBJbnRlcnNlY3Rpb24gQWN0aW9uLCBiZWdpbiBkcmFnZ2luZywgaG9sZCBkb3duIHRoZSBjdHJsIGtleSwgbW92ZSB0aGUgbW91c2Ugc28gdGhhdCBpdCBpcyBvdmVyIHRoZSBXaXRoaW4gdGFyZ2V0LCBhbmQgcmVsZWFzZSB0aGUgbW91c2UuIEl0IHNvdW5kcyBtb3JlIGNvbXBsaWNhdGVkIHRoZW4gaXQgaXMhPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzMkludGVyc2VjdEFkZC5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBZGQgTW92ZSBBY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBZGRfTW92ZV9BY3Rpb24iPjwvYT5BZGQgTW92ZSBBY3Rpb248L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RmluYWxseSwgYWRkIGEgTW92ZSB0YXJnZXQgdG8gdGhlIEludGVyc2VjdGlvbi48L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMzTW92ZS5wbmcgIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8cD5BIGZldyBub3RlcyBvbiB0aGUgc2NyZWVuc2hvdCBhYm92ZS4gVG8gbWFrZSB0aGluZ3MgYSBiaXQgY2xlYXJlciwgd2UndmUgZWRpdGVkIHRoZSBuYW1lcyBmb3IgdGhlIGZpbmFsIHBhbmVsLiBBbHNvLCB0aGUgSW50ZXJzZWN0aW9uIG5vZGUgbWlnaHQgbm90IGFwcGVhciBpbiB0aGUgc2FtZSBwbGFjZS4gV2UndmUgZXhwYW5kZWQgdGhlIG5vZGVzIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhhdCB3aGlsZSB0aGUgYWN0aW9ucyBhcmUgYWxsIGxpc3RlZCB0b2dldGhlciwgdGhleSBhcmUgYWN0dWFsbHkgZGVmaW5lZCBhcyBhIHRyZWUgc3RydWN0dXJlIGludGVybmFsbHkuIFlvdSBjYW4gZm9sbG93IHRoYXQgdHJlZSB0byBzZWUgYWxsIG9mIHRoZSBhY3Rpb25zIHRoYXQgbWlnaHQgYmUgdGhlIHJlc3VsdCBvZiBhbnkgb2YgdGhlIGFjdGlvbnMgaW4gdGhlIGxpc3QuIFRvIGhlbHAgdW5kZXJzdGFuZCB0aGUgc3RydWN0dXJlIGF0IGEgZ2xhbmNlLCB0aGUgbGFiZWxzIGluY2x1ZGUgYW4gJmx0Oy0gaW5kaWNhdG9yIHNob3dpbmcgdGhlIGltbWVkaWF0ZSBzb3VyY2VzIG9mIGVhY2ggb2YgdGhlIG5vZGVzLiAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iaXRhbGljIj5Ob3RlIGVzcGVjaWFsbHkgdGhhbiB3aGlsZSB0aGUgdGFyZ2V0cyBmb3IgYWN0aW9ucyBvZnRlbiBhcHBlYXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZWlyIHNvdXJjZSBhY3Rpb25zLCB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UuPC9zcGFuPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJ1biBGaW5hbCBNb2RlbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJ1bl9GaW5hbF9Nb2RlbCI+PC9hPlJ1biBGaW5hbCBNb2RlbDwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Ob3csIHdlIGNhbiBzZWxlY3QgdGhlIG1vZGVsIGluIHRoZSAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlBhY2thZ2UgTmF2aWdhdG9yPC9zdHJvbmc+PC9zcGFuPiBhZ2FpbiwgYW5kIHJ1biB0aGUgbW9kZWwuIEl0IGRvZXNuJ3QgbG9vayBtdWNoIGRpZmZlcmVudCBpbiBhIHNuYXBzaG90LCBidXQgdGhvc2UgYWdlbnRzIHNob3VsZCBub3cgYmUgbW92aW5nIGFyb3VuZC4gV2UgaGF2ZSBidWlsdCBhIGNvbXBsZXRlIEFzY2FwZSBtb2RlbCBmcm9tIG91ciBtb2RlbC4KKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDM0UnVuRmluYWwucG5nICI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5XZSBob3BlIHRoaXMgdHV0b3JpYWwgaGFzIGVuYWJsZWQgeW91IHRvIGdldCB1cCBhbmQgcnVubmluZyBhbmQgZ2l2ZW4geW91IHNvbWUgZmFtaWxpYXJpdHkgd2l0aCB0aGUgYmFzaWMgQWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrIGFwcHJvYWNoLiBUaGUgZXhhbXBsZSBtb2RlbHMgaW5jbHVkZSB0aGUgb3RoZXIgInN0dXBpZCBtb2RlbHMiIGZyb20gdGhlIHBhcGVyLCBhcyB3ZWxsIGFzIGEgbnVtYmVyIG9mIG90aGVyIGludGVyZXN0aW5nIG1vZGVscy48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9Im5hdmZvb3RlciI+Cis8aHI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwJSI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJVc2VyX0d1aWRlLmh0bWwiPlByZXY8L2E+Jm5ic3A7PC90ZD48dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIwJSI+Jm5ic3A7PC90ZD48dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDs8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sIj5OZXh0PC9hPjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwJSI+Q2hhcHRlciZuYnNwOzMuJm5ic3A7VXNlciBHdWlkZSZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7NS4mbmJzcDtQcm9ncmFtZXIgR3VpZGU8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1VzZXJfR3VpZGUuaHRtbCBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL1VzZXJfR3VpZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzAwMDUzCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvVXNlcl9HdWlkZS5odG1sCkBAIC0wLDAgKzEsMTg3NiBAQAorPGh0bWw+Cis8aGVhZD4KKzxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNoYXB0ZXImbmJzcDszLiZuYnNwO1VzZXIgR3VpZGU8L3RpdGxlPgorPGxpbmsgaHJlZj0iYm9vay5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiPgorPG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzYuMCIgbmFtZT0iZ2VuZXJhdG9yIj4KKzxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkFnZW50IE1vZGVsaW5nIEd1aWRlIj4KKzxsaW5rIHJlbD0idXAiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9InByZXYiIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDsyLiZuYnNwO01vZGVsZXIgR3VpZGUiPgorPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJUdXRvcmlhbHMuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDs0LiZuYnNwO1R1dG9yaWFscyI+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+Cis8ZGl2IGNsYXNzPSJuYXZoZWFkZXIiPgorPHRhYmxlIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIiB3aWR0aD0iMTAwJSI+Cis8dHI+Cis8dGggYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMyI+Q2hhcHRlciZuYnNwOzMuJm5ic3A7VXNlciBHdWlkZTwvdGg+Cis8L3RyPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjAlIj48YSBhY2Nlc3NrZXk9InAiIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCI+UHJldjwvYT4mbmJzcDs8L3RkPjx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNjAlIj4mbmJzcDs8L3RoPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iVHV0b3JpYWxzLmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzMuJm5ic3A7VXNlciBHdWlkZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlVzZXJfR3VpZGUiPjwvYT5DaGFwdGVyJm5ic3A7My4mbmJzcDtVc2VyIEd1aWRlPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InRvYyI+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI092ZXJ2aWV3XzUiPk92ZXJ2aWV3PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI01vZGVsaW5nIj5Nb2RlbGluZzwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNQZXJzcGVjdGl2ZSI+UGVyc3BlY3RpdmU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjQ3JlYXRpbmdfUHJvamVjdHNfYW5kX01vZGVscyI+Q3JlYXRpbmcgUHJvamVjdHMgYW5kIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNNZW51cy4yQ19Qb3B1cHNfYW5kX1Rvb2xiYXIiPk1lbnVzLCBQb3B1cHMgYW5kIFRvb2xiYXI8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjVmlld3MiPlZpZXdzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0VkaXRvciI+RWRpdG9yPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0RlZmF1bHRfVmlld3MiPkRlZmF1bHQgVmlld3M8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjRGlhZ25vc3RpY19WaWV3cyI+RGlhZ25vc3RpYyBWaWV3czwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI01vZGVsaW5nX1RyZWVfRWRpdG9yIj5Nb2RlbGluZyBUcmVlIEVkaXRvcjwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNPcGVuaW5nX3RoZV9FZGl0b3IiPk9wZW5pbmcgdGhlIEVkaXRvcjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNTdHJ1Y3R1cmVfMiI+U3RydWN0dXJlPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0FjdGlvbnNfMyI+QWN0aW9uczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjQnVpbGRpbmciPkJ1aWxkaW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0J1aWxkaW5nX01vZGVscyI+QnVpbGRpbmcgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0dlbmVyYXRpbmdfU3BlY2lhbGl6ZWRfTW9kZWxfQXJ0aWZhY3RzIj5HZW5lcmF0aW5nIFNwZWNpYWxpemVkIE1vZGVsIEFydGlmYWN0czwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNQbGF0Zm9ybV9UYXJnZXRzIj5QbGF0Zm9ybSBUYXJnZXRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0ludGVyZmFjZXMiPkludGVyZmFjZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjU2tlbGV0b24iPlNrZWxldG9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1Rlc3RfQ2FzZXMiPlRlc3QgQ2FzZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjVGV4dF9Eb2N1bWVudHMiPlRleHQgRG9jdW1lbnRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0dlbmVyYXRlX0tleV9HcmFwaGljcyI+R2VuZXJhdGUgS2V5IEdyYXBoaWNzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0Z1bmN0aW9uX0RvY3MiPkZ1bmN0aW9uIERvY3M8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0V4ZWN1dGluZyI+RXhlY3V0aW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0xhdW5jaGluZ19hX01vZGVsXy4yOEFNRi4yOSI+TGF1bmNoaW5nIGEgTW9kZWwgKEFNRik8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjRXhlY3V0ZSI+RXhlY3V0ZTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNFeGVjdXRlX0hlYWRsZXNzIj5FeGVjdXRlIEhlYWRsZXNzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0V4ZWN1dGVfSGVhZGxlc3NfLjI4RGF0YS4yOSI+RXhlY3V0ZSBIZWFkbGVzcyAoRGF0YSk8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNFeGVjdXRpbmdfYV9Nb2RlbF8uMjhKYXZhXy4yRl8zRC4yOSI+RXhlY3V0aW5nIGEgTW9kZWwgKEphdmEgLyAzRCk8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjQ29udHJvbGxpbmdfTW9kZWxzIj5Db250cm9sbGluZyBNb2RlbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTW9kZWxfRXhlY3V0aW9uX0NvbnRyb2xzIj48L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjVGhlX0FjdGl2ZV9Nb2RlbCI+VGhlIEFjdGl2ZSBNb2RlbDwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1ZpZXdzXzIiPlZpZXdzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1Byb3BlcnRpZXNfMiI+UHJvcGVydGllczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNBZ2VudF9OYXZpZ2F0b3IiPkFnZW50IE5hdmlnYXRvcjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNNb2RlbF9NYW5hZ2VyIj5Nb2RlbCBNYW5hZ2VyPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjVmlzdWFsaXphdGlvbiI+VmlzdWFsaXphdGlvbjwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCMyRF9WaWV3cyI+MkQgVmlld3M8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjM0RfVmlld3MiPjNEIFZpZXdzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0dyYXBoX1ZpZXdzIj5HcmFwaCBWaWV3czwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNDaGFydHMiPkNoYXJ0czwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0xhdW5jaGluZ19PdGhlcl9UYXJnZXRzIj5MYXVuY2hpbmcgT3RoZXIgVGFyZ2V0czwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNNb2RlbF9QYXJhbWV0ZXJpemF0aW9uIj5Nb2RlbCBQYXJhbWV0ZXJpemF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1N5bnRheCI+U3ludGF4PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0V4YW1wbGVfMiI+RXhhbXBsZTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI01vZGVsX1Rlc3RpbmciPk1vZGVsIFRlc3Rpbmc8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjU3ludGF4XzIiPlN5bnRheDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNFeGFtcGxlXzMiPkV4YW1wbGU8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTW9kZWxfRGF0YSI+TW9kZWwgRGF0YTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzxwPkluIHRoaXMgc2VjdGlvbiBvZiB0aGUgZ3VpZGUsIHdlJ2xsIGRpc2N1c3Mgc3BlY2lmaWMgYXNwZWN0cyBvZiB0aGUgQWdlbnQgTW9kZWxpbmcgdG9vbHMgYW5kIHNob3cgeW91IGhvdyB0byB1c2UgdGhlbSBpbiB5b3VyIGRheSB0byBkYXkgYWdlbnQgZGV2ZWxvcG1lbnQgYWN0aXZpdGllcy4gV2UgZGlzY3VzcyBvbmx5IHRvb2xzIHNwZWNpZmljIHRvIEFnZW50IE1vZGVsaW5nIGl0c2VsZi4gRm9yIG1vcmUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9vbHMsIHN1Y2ggYXMgaG93IHRvIGN1c3RvbWl6ZSBlZGl0b3JzLCB2aWV3cywgYW5kIHBlcnNwZWN0aXZlcywgc2VlIHRoZSAKKwkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zdHJvbmc+PC9zcGFuPi4KKwkJPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik92ZXJ2aWV3Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJPdmVydmlld181Ij48L2E+T3ZlcnZpZXc8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIEFnZW50IE1vZGVsaW5nIFBsYXRmb3JtIHByb3ZpZGVzIHR3byBnZW5lcmFsIG1vZGVzIG9yICJwZXJzcGVjdGl2ZXMiIGZvciB3b3JraW5nIHdpdGggQWdlbnQgTW9kZWxzLjwvcD4KKzxwPgorCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9QZXJzcGVjdGl2ZXMucG5nIj48L2Rpdj4KKzxwPgorCQkJCis8L3A+Cis8cD4KKwkJCQkKKzxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkFnZW50IE1vZGVsaW5nPC9zdHJvbmc+PC9zcGFuPiBzdXBwb3J0cyBhbGwgYXNwZWN0cyBvZiB3b3JraW5nIHdpdGggbW9kZWxzLCBpbmNsdWRpbmcgZWRpdGluZyBtb2RlbHMgYW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyBhbGwgdGhlIG9mIHlvdXIgY29kZSBhbmQgZG9jdW1lbnRhdGlvbi4gCisJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+QWdlbnQgRXhlY3V0aW9uPC9zdHJvbmc+PC9zcGFuPiBzdXBwb3J0cyBydW5uaW5nIGFuZCBleHBsb3JpbmcgdGhvc2UgbW9kZWxzLiBBIGtleSBmZWF0dXJlIG9mIHRoZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSBpcyB0aGUgYWJpbGl0eSB0byBleGVjdXRlIG1vZGVscyB3aXRoaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgdGhhdCB0aGV5IGFyZSBkZXZlbG9wZWQgd2l0aGluIC0tIHlvdSBkb24ndCBuZWVkIHRvIGxhdW5jaCBhIHNlcGFyYXRlIGVudmlyb25tZW50IGluIG9yZGVyIHRvIHJ1biBhIG1vZGVsLiBBZ2VudCBFeGVjdXRpb24gYXV0b21hdGljYWxseSBhY3RpdmF0ZXMgd2hlbiB5b3UgbGF1bmNoIGEgbW9kZWwuIFdlJ2xsIGRpc2N1c3MgdGhlIGFnZW50IG1vZGVsaW5nIHRvb2xzIGZpcnN0LCBhbmQgdGhlbiB0dXJuIHRvIGFnZW50IGV4ZWN1dGlvbi4KKwkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsaW5nIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJNb2RlbGluZyI+PC9hPk1vZGVsaW5nPC9oMj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQZXJzcGVjdGl2ZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlBlcnNwZWN0aXZlIj48L2E+UGVyc3BlY3RpdmU8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIFByb3ZpZGVzIGEgY3VzdG9tIGxheW91dCBtZW51cyBhbmQgdG9vbHMgc3BlY2lmaWMgdG8gd29ya2luZyB3aXRoIGFnZW50IG1vZGVscy4gQmVjYXVzZSB0aGUgYWdlbnQgbW9kZWxpbmcgcHJvY2VzcyBhbHNvIG9mdGVuIGludm9sdmVzIEphdmEgYW5kIEVjbGlwc2UgUGx1Z2luIGRldmVsb3BtZW50IHdlIGluY2x1ZGUgZWFzeSBhY2Nlc3MgdG8gbWFueSBvZiB0aG9zZSB0b29scyBoZXJlIGFzIHdlbGwuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRpbmcgUHJvamVjdHMgYW5kIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0aW5nX1Byb2plY3RzX2FuZF9Nb2RlbHMiPjwvYT5DcmVhdGluZyBQcm9qZWN0cyBhbmQgTW9kZWxzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBjYW4gY3JlYXRlIHByb2plY3RzIGFuZCBwcm9qZWN0IGNvbXBvbmVudHMgdXNpbmcgdGhlIFBvcHVwIG1lbnUuIEp1c3QgY2xpY2sgaW4gYSBibGFuayBzcGFjZSB3aXRoaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIuIEFueSBpbnN0YWxsZWQgcHJvamVjdCB0YXJnZXRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhpcyBtZW51LiBGb3IgZXhhbXBsZSwgaWYgeW91J3ZlIGluc3RhbGxlZCB0aGUgU2ltcGhvbnkgdGFyZ2V0LCB5b3UnZCBzZWUgdGhhdCBkaXNwbGF5ZWQgaW4gdGhpcyBtZW51IGFzIHdlbGwuPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsM0NyZWF0ZU1vZGVsLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1lbnVzLCBQb3B1cHMgYW5kIFRvb2xiYXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNZW51cy4yQ19Qb3B1cHNfYW5kX1Rvb2xiYXIiPjwvYT5NZW51cywgUG9wdXBzIGFuZCBUb29sYmFyPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBwb3B1cCBtZW51cyBhbmQgYXBwbGljYXRpb24gbWVudXMgcHJvdmlkZSBhY2Nlc3MgdG8gdmFyaW91cyBtb2RlbCBmZWF0dXJlcyBhbmQgYXJlIGNvbnRleHQgc2Vuc2l0aXZlLiAgVGhyb3VnaG91dCB0aGVzZSBzY3JlZW5zaG90cywgd2UndmUgY3VzdG9taXplZCB0aGUgdG9vbGJhciBpbiBvcmRlciB0byBvbmx5IHNob3cgdGhlIGFnZW50IE1vZGVsaW5nIHNwZWNpZmljIGZlYXR1cmVzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlZpZXdzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVmlld3MiPjwvYT5WaWV3czwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5CeSBkZWZhdWx0IHRoZSB3b3JrYmVuY2ggaW5jbHVkZXMgYSBudW1iZXIgb2Ygdmlld3MuIFNlZSB0aGUgV29ya2JlbmNoIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdGhleSBjYW4gYmUgY3VzdG9taXplZCBhY2Nlc3NlZCBhbmQgdXNlZC48L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Rvb2xzL1dvcmtiZW5jaC5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRWRpdG9yIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRWRpdG9yIj48L2E+RWRpdG9yPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgaXMgbm90IHRlY2huaWNhbGx5IGEgdmlldyBpbiBpdHNlbGYuIEl0IGlzIHRoZSBtYWpvciBmb2N1cyBvZiB0aGUgd29ya2JlbmNoIGFuZCBjb250YWlucyBhbnkgZWRpdCBtb2RlbHMgb3Igb3RoZXIgZmlsZXMgc3VjaCBhcyBKYXZhIHNvdXJjZSBvciBwYXJhbWV0ZXJzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkRlZmF1bHQgVmlld3MiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJEZWZhdWx0X1ZpZXdzIj48L2E+RGVmYXVsdCBWaWV3czwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgZGVmYXVsdCBtb2RlbGluZyB2aWV3cyBhcmUgdmlzaWJsZSBieSBkZWZhdWx0LjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQYWNrYWdlIEV4cGxvcmVyIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUGFja2FnZV9FeHBsb3JlciI+PC9hPlBhY2thZ2UgRXhwbG9yZXI8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U3VwcG9ydHMgbmF2aWdhdGlvbiB3aXRoaW4gcHJvamVjdHMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUHJvcGVydGllcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlByb3BlcnRpZXMiPjwvYT5Qcm9wZXJ0aWVzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBwcm9wZXJ0aWVzIGFsbG93cyB5b3UgdG8gdmlldyBhbmQgZWRpdCBzcGVjaWZpYyBkZXRhaWxzIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9iamVjdC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWxlY3QgYSBtb2RlbCBjb250ZXh0LCB5b3UnbGwgYmUgYWJsZSB0byBlZGl0IGl0cyBhdHRyaWJ1dGVzIGhlcmUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iT3V0bGluZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik91dGxpbmUiPjwvYT5PdXRsaW5lPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBvdXRsaW5lIHZpZXcgc3VwcG9ydHMgZWFzeSBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgZWRpdGVkIGZpbGVzLiBTZWUgdGhlIG1vZGVsIGVkaXRpbmcgc2VjdGlvbnMgZm9yIG1vcmUgb24gaG93IHRoZSBvdXRsaW5lIGNhbiBiZSB1c2VkIHRvIGFzc2lzdCBleHBsb3JhdGlvbiBvZiBBZ2VudCBNb2RlbHMuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJEaWFnbm9zdGljIFZpZXdzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRGlhZ25vc3RpY19WaWV3cyI+PC9hPkRpYWdub3N0aWMgVmlld3M8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZpZXdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwbG9yZSBpc3N1ZXMgdGhhdCBtaWdodCBjb21lIHVwIGR1cmluZyB0aGUgbW9kZWxpbmcgcHJvY2Vzcy4gWW91IGNhbiBzZWUgdGhlbSBvbiB0aGUgbG93ZXIgbGVmdC1oYW5kIGNvcm5lciBvZiB0aGUgc2NyZWVuc2hvdCBhYm92ZS4gQ2xpY2sgb24gb25lIG9mIHRoZSBpY29ucyB0byB2aWV3IHRoZWlyIGNvbnRlbnRzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQcm9ibGVtcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlByb2JsZW1zIj48L2E+UHJvYmxlbXM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhpcyB2aWV3IGlzIG9uZSB0aGF0IHlvdSdsbCBiZWNvbWUgdmVyeSBmYW1pbGlhciB3aXRoLiBJdCBpcyB1c2VkIHRvIGRpc3BsYXkgc3BlY2lmaWMgYWJvdXQgcHJvYmxlbXMgd2l0aCBhbnkgb2YgdGhlIGFydGlmYWN0cyAoZmlsZXMpIGluIHlvdXIgbW9kZWxpbmcgcHJvamVjdC4gSWYgeW91IHNlZSBhIHJlZCBvciB5ZWxsb3cgbWFya2VyIG9uIGEgZmlsZSwgb3BlbmluZyB0aGUgdmlldyB3aWxsIHByZXNlbnQgYSBsaXN0IG9mIHRoZSBpc3N1ZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHJlcG9ydGVkLiBGb3IgYSB1c2FnZSBleGFtcGxlLCBwbGVhc2Ugc2VlIHRoZSBUdXRvcmlhbC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb25zb2xlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ29uc29sZSI+PC9hPkNvbnNvbGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhpcyB2aWV3IGRpc3BsYXlzIHRleHQgKGNvbnNvbGUpIG91dHB1dCBmb3IgYXBwcm9wcmlhdGUgcHJvY2Vzc2VzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGxhdW5jaCBhbiBBc2NhcGUgcHJvamVjdCwgdGhpcyB3aWxsIGRpc3BsYXkgYW55IG91dHB1dCB0aGF0IHdvdWxkIGdvIHRvIHRoZSBKYXZhIGNvbnNvbGUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRXJyb3JzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRXJyb3JzIj48L2E+RXJyb3JzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgaXMgYW5vdGhlciB2aWV3IHRoYXQgeW91IHdpbGwgZmluZCB2YWx1YWJsZSBpbiB5b3VyIGRheSB0byBkYXkgbW9kZWxpbmcgYWN0aXZpdGllcy4gVGhlIGVycm9yIGxvZyBsaXN0cyBldmVyeXRoaW5nIGltcG9ydGFudCB0aGF0IGhhcHBlbnMgZHVyaW5nIG1vZGVsIGV4ZWN1dGlvbi4gSXQncyB0aGUgZmlyc3QgcGxhY2UgdG8gbG9vayBpZiBzb21ldGhpbmcgbXlzdGVyaW91cyBnb2VzIHdyb25nLCBhbmQgd2hlbiB5b3UgcmVwb3J0IHByb2JsZW1zIGl0J3MgYWx3YXlzIGhlbHBmdWwgdG8gaW5jbHVkZSBhbnl0aGluZyB0aGF0IGNvdWxkIGJlIHJlbGV2YW50IGluIHRoZSBsb2cuIERlc3BpdGUgaXRzIG5hbWUsIHRoZSBFcnJvcnMgdmlldyBpcyBub3QganVzdCBmb3IgcmVwb3J0aW5nIGVycm9ycyAtLSBpdCBpcyBhbHNvIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIG9uIG5vcm1hbCBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgd2hlbiBtb2RlbHMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHRoYXQgaXMgcmVwb3J0ZWQgdG8gdGhlIGxvZywgYXMgd2UgY2FuIHNlZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsaW5nIFRyZWUgRWRpdG9yIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTW9kZWxpbmdfVHJlZV9FZGl0b3IiPjwvYT5Nb2RlbGluZyBUcmVlIEVkaXRvcjwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgaW5jbHVkZXMgYSBmdWxsLWZlYXR1cmVkIG1vZGVsIGVkaXRvciBiYXNlZCBvbiB0aGUgRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsncyBFZGl0IHRvb2xzLiBBbGwgYXNwZWN0cyBvZiBhbiBBTUYgbW9kZWwgY2FuIGJlIG1hbmFnZWQgZnJvbSB3aXRoaW4gdGhpcyB0b29sLiBOb3RlIHRoYXQgdGhlIHRyZWUgZWRpdG9yIGlzIG9ubHkgb25lIG9mIG1hbnkgd2F5cyBvZiBlZGl0aW5nIGEgbW9kZWwuIE90aGVyIGVkaXRvcnMgb2YgQU1GIG1vZGVscyBpbmNsdWRlIHRleHR1YWwgbGFuZ3VhZ2VzIGFuZCBjdXN0b20gZWRpdG9ycyB0aGF0IGFyZSBwYXJ0IG9mIGNvbW1lcmNpYWwgb2ZmZXJpbmdzLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPcGVuaW5nIHRoZSBFZGl0b3IiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPcGVuaW5nX3RoZV9FZGl0b3IiPjwvYT5PcGVuaW5nIHRoZSBFZGl0b3I8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VG8gb3BlbiBhIG1vZGVsIGluIHRoZSBlZGl0b3IsIHNpbXBseSBkb3VibGUtY2xpY2sgb24gaXQuIElmIHRoZSBtb2RlbCBkb2Vzbid0IG9wZW4gaW4gdGhlIG1vZGVsIGVkaXRvciAoaWYgZm9yIGV4YW1wbGUgaXQgaGFkIGJlZW4gcHJldmlvdXNseSBvcGVuZWQgdXNpbmcgYW5vdGhlciBlZGl0b3IpLCB5b3UgY2FuIGFsd2F5cyBhY2Nlc3MgdGhlIGVkaXRvciB1c2luZyAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPk9wZW4gV2l0aCAmZ3Q7IE90aGVyLi4uPC9zdHJvbmc+PC9zcGFuPiBhbmQgc2VsZWN0aW5nICJNZXRhQUJNIEVkaXRvciIuIFRoZSBlZGl0b3IgaGFzIHR3byBwYWdlcywgYW4gRWRpdG9yIHBhZ2UgdGhhdCB3ZSdsbCBmb2N1cyBvbiBmaXJzdCBhbmQgYSAiZGVzY3JpcHRpb24iIHBhZ2UgdGhhdCB3ZSdsbCBkaXNjdXNzIGF0IHRoZSBlbmQgb2YgdGhpcyBzZWN0aW9uLgorCQkJCQk8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTdHJ1Y3R1cmUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTdHJ1Y3R1cmVfMiI+PC9hPlN0cnVjdHVyZTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbW9kZWwgaXMgY29tcG9zZWQgb2Ygbm9kZXMgcmVwcmVzZW50aW5nIHNwZWNpZmljIG1vZGVsIGVudGl0aWVzIHN1Y2ggYXMgYWdlbnRzLCBhY3Rpb25zIGFuZCBzcGFjZXMuIEZvciBkZXRhaWxzIGFib3V0IGFueSBvZiB0aGVzZSBlbnRpdGllcywgc2VlIHRoZSBDb25jZXB0cyBzZWN0aW9uLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPcGVuaW5nIENvbXBvbmVudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPcGVuaW5nX0NvbXBvbmVudHMiPjwvYT5PcGVuaW5nIENvbXBvbmVudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QWZ0ZXIgb3BlbmluZyBhIG1vZGVsLCB5b3UgY2FuIHNlZSB0aGUgY29udGVudHMgYnkgY2xpY2tpbmcgdGhlIFRyaWFuZ2xlIHN5bWJvbCB0byB0aGUgbGVmdCBvZiBhbiBpdGVtLiBGb3IgZXhhbXBsZSwgb3BlbmluZyB0aGUgcm9vdCBjb250ZXh0IG5vZGUsIHdlIHNlZTo8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdG9vbHMvRWRpdG9yLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRpbmcgQ29tcG9uZW50cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0aW5nX0NvbXBvbmVudHMiPjwvYT5DcmVhdGluZyBDb21wb25lbnRzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBhZGQgbm9kZXMgYnkgcmlnaHQtY2xpY2tpbmcgb24gYSBub2RlLCBsaWtlIHNvOjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9FZGl0b3JBZGQucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFZGl0aW5nIENvbXBvbmVudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFZGl0aW5nX0NvbXBvbmVudHMiPjwvYT5FZGl0aW5nIENvbXBvbmVudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VG8gZWRpdCBjb21wb25lbnRzLCBzZWxlY3QgdGhlIG5vZGUgeW91IHdhbnQgdG8gbW9kaWZ5LiBUaGUgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UHJvcGVydGllcyBWaWV3PC9zdHJvbmc+PC9zcGFuPiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgYWdlbnQgZGV0YWlscy4gVXNlIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMuIEluIHRoZSBzY3JlZW5zaG90IGJlbG93LCB3ZSdyZSBlZGl0aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBDaXR5IHNwYWNlLgorCQkJCQkJPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Rvb2xzL0VkaXRvckVkaXRpbmcucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb3ZpbmcgQ29tcG9uZW50cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vdmluZ19Db21wb25lbnRzIj48L2E+TW92aW5nIENvbXBvbmVudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IGNhbiBvZnRlbiByZWFycmFuZ2UgbW9kZWwgY29tcG9uZW50cyBieSBkcmFnZ2luZyB0aGVtIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2UncmUgY3JlYXRpbmcgYSBtb2RlbCBvZiBhIHJlZ2lvbmFsIGVwaWRlbWljIGJ5IGNyZWF0aW5nIGEgQ2l0eSBzdWItY29udGV4dCBhbmQgbW92aW5nIHRoZSBhZ2VudCBpbnRvIGl0OiA8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdG9vbHMvRWRpdG9yTW92aW5nLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUmVtb3ZpbmcgQ29tcG9uZW50cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlJlbW92aW5nX0NvbXBvbmVudHMiPjwvYT5SZW1vdmluZyBDb21wb25lbnRzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBjYW4gcmVtb3ZlIGFjdGlvbnMgYnkgZGVsZXRpbmcgb3IgY3V0dGluZyB0aGVtIHVzaW5nIHRoZSBwb3B1cCBtZW51LiBXaGVuIHlvdSBkZWxldGUgYW4gZW50aXR5LCBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBkZWxldGVkIGFzIHdlbGwsIGV4Y2VwdCBpbiBzb21lIHNwZWNpYWwgY2FzZXMgKHN1Y2ggYXMgd2l0aCBhY3Rpb25zKSB3aGVyZSBvdGhlciBwYXRocyB0byB0aGF0IGVudGl0eSBzdGlsbCBleGlzdC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb3B5aW5nIENvbXBvbmVudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb3B5aW5nX0NvbXBvbmVudHMiPjwvYT5Db3B5aW5nIENvbXBvbmVudHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VG8gbWFrZSBhIGNvcHkgb2YgYW4gZW50aXR5IGFuZCBwbGFjZSBpdCBpbiBhIG5ldyBsb2NhdGlvbiwgb3B0aW9uLWRyYWcgdGhlIGVudGl0eSB0byB0aGUgZGVzdGluYXRpb24uIFlvdSBjYW4gbWFrZSBhIGNvcHkgaW4gdGhlIGV4aXN0aW5nIGxvY2F0aW9uIGJ5IGRyYWdnaW5nIGl0IGludG8gdGhlIHNhbWUgcGFyZW50LiBUaGUgbmFtZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCB3aXRoICJjb3B5IiBhcHBlbmRlZCB0byBpdC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJFZGl0aW5nIEF0dHJpYnV0ZXMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFZGl0aW5nX0F0dHJpYnV0ZXMiPjwvYT5FZGl0aW5nIEF0dHJpYnV0ZXM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGF0dHJpYnV0ZXMgbm9kZSAtLSBhbG9uZyB3aXRoIHRoZSBhY3Rpb25zIGFuZCBzdHlsZXMgbm9kZXMgLS0gcmVwcmVzZW50cyBhIGdyb3VwIG9mIGNvbXBvbmVudHMgcmF0aGVyIHRoYW4gYW4gZW50aXR5IGl0c2VsZi4gSXQgY29udGFpbnMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgcGFyZW50IGFnZW50IG9yIGNvbnRleHQuIEluIHRoZSBleGFtcGxlcyBiZWxvdywgd2UgY2FuIHNlZSB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIEVwaWRlbWljIHJvdXRlIG1vZGVsLiBOb3RlIHRoYXQgdGhlIHRvcCBsZXZlbCBhdHRyaWJ1dGVzIGluIGEgcm9vdCBjb250ZXh0IGFjdCBhcyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIG1vZGVsIGl0c2VsZi48L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdG9vbHMvRWRpdG9yQXR0cmlidXRlcy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkVkaXRpbmcgU3R5bGVzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRWRpdGluZ19TdHlsZXMiPjwvYT5FZGl0aW5nIFN0eWxlczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgU3R5bGVzIG5vZGUgaXMgYW5vdGhlciBncm91cCBub2RlLCBpbiB0aGlzIGNhc2UgcmVwcmVzZW50aW5nIGEgc2V0IG9mIHN0eWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgYWdlbnRzLiBXaGVuIGNyZWF0aW5nIGEgc3R5bGUsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgUnVsZSBmb3IgZWFjaCBzdHlsZSBhcyB3ZWxsLCBsaWtlIHNvOjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9FZGl0b3JTdHlsZXMucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJBY3Rpb25zXzMiPjwvYT5BY3Rpb25zPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFjdGlvbnMgYXJlIGEga2V5IGFuZCByZWxhdGl2ZWx5IGNvbXBsZXggYXNwZWN0IG9mIHRoZSBtb2RlbCBlZGl0b3IuIEJlY2F1c2UgYWN0aW9ucyBhcmUgYWN0dWFsbHkgcmVsYXRlZCBpbiBhIGdyYXBoIHN0cnVjdHVyZSwgYSB0cmVlLWJhc2VkIGVkaXRvciB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlcHJlc2VudCBhIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBvZiBhY3Rpb24gcmVsYXRpb25zaGlwcyBkaXJlY3RseS4gKFRoaXMgaXMgYWN0dWFsbHkgbm8gZGlmZmVyZW50IGZyb20gbW9zdCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgLS0gZm9yIGV4YW1wbGUsIEphdmEgY29kZSBpcyBlZGl0ZWQgaW4gYSB0ZXh0IGJhc2VkIGVkaXRvciwgYnV0IHRoZSBjYWxsIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgY29tcGxleCBncmFwaC4gQWR2YW5jZSB0b29scyBkZXZlbG9wZWQgYnkgQU1QIGNvbnRyaWJ1dG9ycyBkbyBzdXBwb3J0IG1vcmUgc29waGlzdGljYXRlZCBtZXRob2RzIGZvciBhY3Rpb24gYnJvd3NpbmcgYW5kIHdlJ2xsIGhhdmUgc2ltcGxlIHZlcnNpb25zIG9mIHRoZW0gYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgQU1GIGVkaXQgdG9vbHMuKSBUaGVyZWZvcmUsIGl0J3MgaGVscGZ1bCB0byB0YWtlIHRpbWUgdG8gdW5kZXJzdGFuZCBob3cgYWN0aW9uIHJlbGF0aW9uc2hpcHMgYXBwZWFyIGluIHRoZSBlZGl0b3IuPC9wPgorPHA+TGlrZSBhdHRyaWJ1dGVzIGFuZCBzdHlsZXMsIGV2ZXJ5IGFnZW50IGhhcyBhIHNpbmdsZSBBY3Rpb25zIG5vZGVzIHdoaWNoIGNvbnRhaW5zIGl0cyBSb290IEFjdGlvbihzKS48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ3JlYXRpbmcgQWN0aW9ucyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNyZWF0aW5nX0FjdGlvbnMiPjwvYT5DcmVhdGluZyBBY3Rpb25zPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPllvdSBjcmVhdGUgYWN0aW9ucyBhcyB3aXRoIGFueSBvdGhlciBjb21wb25lbnQsIGJ5IHJpZ2h0LWNsaWNraW5nIG9uIHRoZSBzb3VyY2UgYWN0aW9uIGFuZCBjaG9vc2luZyB0aGUgbmV3IGFjdGlvbi4gVGhlIG1lbnUgaXMgb3JnYW5pemVkIGJ5IHVzYWdlLjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9FZGl0b3JBY3Rpb25NZW51LnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRWRpdGluZyBBY3Rpb25zIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRWRpdGluZ19BY3Rpb25zIj48L2E+RWRpdGluZyBBY3Rpb25zPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFjdGlvbnMgYW5kIHRoZWlyIGlucHV0cyBhcmUgZWRpdGVkIGp1c3QgbGlrZSBhbnkgb3RoZXIgbW9kZWwgY29tcG9uZW50LiBDbGljayBvbiB0aGUgYWN0aW9uIG9yIGlucHV0IHlvdSB3YW50IHRvIGVkaXQgYW5kIHRoZW4gbWFrZSBjaGFuZ2VzIHRvIGl0IGluIHRoZSBwcm9wZXJ0aWVzIGVkaXRvci48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJPcmRlciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik9yZGVyIj48L2E+T3JkZXI8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+R2VuZXJhbGx5LCBhY3Rpb24gc291cmNlcyB3aWxsIGFwcGVhciBhYm92ZSB0aGVpciB0YXJnZXRzLiBJbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSBzb3VyY2UgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBhbmQgdGhhdCB0YXJnZXQgaGFzIG5vIG90aGVyIHNvdXJjZXMsIHRoZXkgd2lsbCBhcHBlYXIgZGlyZWN0bHkgYWJvdmUgb25lIGFub3RoZXIuIEl0cyBpbXBvcnRhbnQgdG8gbm90ZSBob3dldmVyIHRoYXQgCisJCQkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+dGhlIG9yZGVyIG9mIHRoZSBub2RlcyBkb2VzIG5vdCBpbmRpY2F0ZSBhIHNwZWNpZmljIHNvdXJjZSBhbmQgdGFyZ2V0IHJlbGF0aW9uc2hpcDwvc3Bhbj4uIEZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgdGFyZ2V0cyBmb3IgYSBzb3VyY2UsIHRoZXkgd2lsbCB0eXBpY2FsbHkgZm9sbG93IHRoYXQgc291cmNlIGltbWVkaWF0ZWx5LiBUbyBtYWtlIHRoZSByZWxhdGlvbnNoaXBzIGNsZWFyLCBldmVyeSBhY3Rpb24gbGlzdHMgaXRzIHNvdXJjZSBhY3Rpb25zIGFzIHBhcnQgb2YgdGhlIGFjdGlvbiBsYWJlbC4gQWdlbnQgc2VsZWN0aW9ucyBhbHNvIGFwcGVhciBhcyBwYXJ0IG9mIHRoZSBsYWJlbC4KKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9BY3Rpb25zRXhhbXBsZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxwPkluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgSW5pdGlhbGl6ZSBMb2NhdGlvbiAiSW5pdGlhbGl6ZSBBY3Rpb24iIGlzIHN0cmFpZ2h0Zm9yd2FyZC4gV2Ugc2ltcGx5IGRlZmluZSBhIFNlbGVjdCBBY3Rpb24sIGEgUXVlcnkgQWN0aW9uIHRhcmdldCBmb3IgdGhhdCBzZWxlY3Rpb24sIGFuZCB0aGVuIGEgTW92ZSBBY3Rpb24gdGFyZ2V0IGZvciB0aGUgcXVlcnkuIFRoZSAiVHJhbnNtaXNzaW9uIiBSdWxlIGlzIG1vcmUgY29tcGxpY2F0ZWQuIE5vdGUgZm9yIGV4YW1wbGUgdGhhdCB0aGUgIkluZmVjdGlvdXMiIFVuaW9uIEFjdGlvbiBpcyB0aGUgdGFyZ2V0IG9mIGJvdGggdGhlICJBc3ltcHRvbWF0aWMgSW5mZWN0aW91cyIgYW5kICAiU3ltcHRvbWF0aWMgSW5mZWN0aW91cyIgUXVlcnkgQWN0aW9ucy4gVGhlICJWdWxuZXJhYmxlIE5laWdoYm9yIiBhY3Rpb24gaGFzIHRoZSBsYWJlbCAiVnVsbmVyYWJsZSBOZWlnaGJvciBbUG90ZW50aWFsIEV4cG9zdXJlXSAmbHQ7LSBbUG90ZW50aWFsIEV4cG9zdXJlXSIgaW5kaWNhdGluZyB0aGF0IHRoZSAiUG90ZW50aWFsIEV4cG9zdXJlIiBhY3Rpb24gc2VydmVzIGFzIGl0cyBzZWxlY3Rpb24gYXMgd2VsbCBhcyBpdHMgc291cmNlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkluaXRpYWwgT3JkZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJJbml0aWFsX09yZGVyIj48L2E+SW5pdGlhbCBPcmRlcjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5BIG5ldyBhY3Rpb24ncyBpbml0aWFsIHRhcmdldCB3aWxsIGJlIHRoZSBhY3Rpb24gdGhhdCB5b3UgY2xpY2tlZCBvbiB3aGVuIGNyZWF0aW5nIGl0LiBGb3IgYW4gYWN0aW9uIHRoYXQgc2hvdWxkIGFsd2F5cyBhY3Qgd2l0aGluIGEgZ2l2ZW4gcm9vdCBhY3Rpb24gKGkuZS4gUnVsZSwgU2NoZWR1bGUsIGV0Yy4uKSwgYWRkIGl0IHRvIHRoZSByb290IGFjdGlvbi4gQSByb290IGFjdGlvbiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHRhcmdldC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDaGFuZ2luZyBTb3VyY2VzIGFuZCBUYXJnZXRzIChSZW9yZGVyaW5nKSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNoYW5naW5nX1NvdXJjZXNfYW5kX1RhcmdldHNfLjI4UmVvcmRlcmluZy4yOSI+PC9hPkNoYW5naW5nIFNvdXJjZXMgYW5kIFRhcmdldHMgKFJlb3JkZXJpbmcpPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFuIGFjdGlvbidzIHRhcmdldCBjYW4gYmUgY2hhbmdlZCBieSBkcmFnZ2luZyBpdCBvdmVyIHRoZSBuZXcgdGFyZ2V0IGFjdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgZnJvbSB0aGF0IG9mIHN0YW5kYXJkIGVudGl0eSBtb3ZlbWVudC4gWW91IGNhbm5vdCBtYWtlIGFuIGFjdGlvbiBhIHRhcmdldCBvZiBhbiBhY3Rpb24gdGhhdCBpcyBpdHNlbGYgYSBzb3VyY2Ugb2YgdGhlIG1vZGlmaWVkIGFjdGlvbiEgKFNlZSB0aGUgY29uY2VwdHMgc2VjdGlvbiBmb3Igd2h5LikgVXNpbmcgdGhlIGRlZmF1bHQgdHJlZSBlZGl0b3IgeW91IGNhbm5vdCBjaGFuZ2UgYW4gYWN0aW9uJ3MgdGFyZ2V0cyBkaXJlY3RseTsgaW5zdGVhZCBzZWxlY3QgdGhlIGFjdGlvbidzIHRhcmdldCBhbmQgbW92ZSB0aGF0LiA8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJBZGRpbmcgU291cmNlcyBhbmQgVGFyZ2V0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFkZGluZ19Tb3VyY2VzX2FuZF9UYXJnZXRzIj48L2E+QWRkaW5nIFNvdXJjZXMgYW5kIFRhcmdldHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QXMgZGlzY3Vzc2VkIGVhcmxpZXIsIGFjdGlvbnMgb2Z0ZW4gaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIGFuZCB0YXJnZXRzLiBUbyBtYWtlIGFuIGFjdGlvbiB0aGUgdGFyZ2V0IG9mIGFuIGFkZGl0aW9uYWwgYWN0aW9uLCBjbGljayBvbiB0YXJnZXQgYWN0aW9uLCBob2xkIGRvd24gdGhlIGNvbnRyb2wga2V5LCBhbmQgZHJhZyB0aGUgYWN0aW9uIHRvIGl0cyBuZXcgZGVzdGluYXRpb24uIFNlZSB0aGUgdHV0b3JpYWwgZm9yIGEgY29tcGxldGUgZXhhbXBsZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJSZW1vdmluZyBTb3VyY2VzIGFuZCBUYXJnZXRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUmVtb3ZpbmdfU291cmNlc19hbmRfVGFyZ2V0cyI+PC9hPlJlbW92aW5nIFNvdXJjZXMgYW5kIFRhcmdldHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IGNhbm5vdCByZW1vdmUgc2luZ2xlIHNvdXJjZXMgZnJvbSB0YXJnZXRzIGRpcmVjdGx5IHVzaW5nIHRoZSB0cmVlIGVkaXRvci4gSW5zdGVhZCwgZmlyc3QgZHJhZyB0aGUgYWdlbnQgdG8gYSBzb3VyY2Ugbm9kZXMgdGhhdCB3aWxsIGJlIHBhcnQgb2YgaXRzIGNoYW5nZWQgc2V0IG9mIHNvdXJjZXMuIFRoYXQgd2lsbCByZW1vdmUgYWxsIGV4aXN0aW5nIGFjdGlvbnMgc291cmNlcyBidXQgZm9yIHRoZSBvbmUgeW91IGhhdmUganVzdCBkcmFnZ2VkIGl0IHRvLiBUaGVuIGFkZCBiYWNrIGFueSBvZiB0aGUgb3RoZXIgc291cmNlIGFuZCB0YXJnZXQgbm9kZXMgeW91IHdpc2ggdG8gcmV0YWluLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlJlbW92aW5nIEFjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJSZW1vdmluZ19BY3Rpb25zIj48L2E+UmVtb3ZpbmcgQWN0aW9uczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Zb3UgY2FuIHJlbW92ZSBhY3Rpb25zIGluIHRoZSBzYW1lIHdheSBhcyB3aXRoIHN0cnVjdHVyYWwgbW9kZWwgY29tcG9uZW50cy4gTm90ZSB0aGF0IGp1c3QgYXMgd2hlbiB5b3UgZGVsZXRlIGFuIGFnZW50LCBhbGwgb2YgdGhhdCBhZ2VudCdzIGF0dHJpYnV0ZXMsIGFjdGlvbnMgYW5kIHN0eWxlcyBhcmUgYWxzbyBkZWxldGVkIGZvcm0gdGhlIG1vZGVsLCB3aGVuIHlvdSBkZWxldGUgYW4gQWN0aW9uLCBhbnkgb2YgaXRzIHRhcmdldHMgd2lsbCBhbHNvIGJlIHJlbW92ZWQsIHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIHNvdXJjZSBhY3Rpb24gcGF0aCB0aGF0IGNvbm5lY3RzIGl0IHRvIHRoZSByb290IGFjdGlvbi4gQW5kIG9mIGNvdXJzZSwgYW55IHRhcmdldHMgb2Ygc3VjaCB0YXJnZXRzIHdpbGwgYmUgYWZmZWN0ZWQgaW4gdGhlIHNhbWUgd2F5IGFuZCBzbyBvbi4gSWYgeW91IHJlbW92ZSBhIG5vZGUgZnJvbSBoaWdoIGluIHRoZSBhY3Rpb24gdHJlZSBhIGxvdCBvZiBub2RlcyBjb3VsZCBkaXNhcHBlYXIgYXQgb25jZSEgSWYgeW91IGhhdmUgYWN0aW9ucyB0aGF0IHlvdSB3YW50IHRvIHJldGFpbiBhcyBwYXJ0IG9mIHRoZSBmbG93LCB5b3Ugc2hvdWxkIGZpcnN0IG1ha2UgdGhlbSB0YXJnZXRzIG9mIGEgbmV3IGFjdGlvbiBiZWZvcmUgZGVsZXRpbmcgdGhlaXIgcGFyZW50IGFjdGlvbi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDb3B5aW5nIEFjdGlvbnMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDb3B5aW5nX0FjdGlvbnMiPjwvYT5Db3B5aW5nIEFjdGlvbnM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q29weWluZyBhY3Rpb25zIHdvcmtzIGp1c3QgYXMgd2l0aCBvdGhlciBlbnRpdGllcywgYW5kIGNvcGllcyB3aWxsIGJlY29tZSB0YXJnZXRzIG9mIHRoZWlyIG9wdGlvbi1kcmFnIGRlc3RpbmF0aW9uLiA8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJRdWVyeSBhbmQgRXZhbHVhdGlvbiBJbnB1dHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJRdWVyeV9hbmRfRXZhbHVhdGlvbl9JbnB1dHNfMiI+PC9hPlF1ZXJ5IGFuZCBFdmFsdWF0aW9uIElucHV0czwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgbnVtYmVyIG9mIGlucHV0cyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzZWxlY3RlZCBmdW5jdGlvbnMuIChJbiByYXJlIGNhc2VzIHdoZXJlIGEgZnVuY3Rpb24gY2FuIHRha2UgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMgeW91IG1heSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHZhbHVlcyBvciBkZWxldGUgZXhpc3Rpbmcgb25lcy4pIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2UncmUgcGlja2luZyB0aGUgU3ltcHRvbSBJbmZlY3Rpb3VzIHN0YXR1cyBmb3IgYSBxdWVyeSB0aGF0IHdpbGwgYWZmZWN0IHRoZSBwb3RlbnRpYWxseSBleHBvc2VkIGFnZW50cy4gTm90ZSB0aGF0IGlzIGluc3RlYWQgeW91IHdhbnRlZCB0byBjb21wYXJlIGFub3RoZXIga2luZCBvZiB2YWx1ZSAtLSBmb3IgZXhhbXBsZSBhbiBJbnRlZ2VyIHZhbHVlIC0tIHlvdSB3b3VsZCBuZWVkIHRvIGNoYW5nZSB0aGUgZmlyc3QgaW5wdXQgbGlzdGVkIGJlZm9yZSBjaGFuZ2luZyB0aGUgc2Vjb25kIGlucHV0IHNvIHRoYXQgeW91IHdpbGwgYmUgYWJsZSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMgZm9yIHRoZSBzZWNvbmQuPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Rvb2xzL0lucHV0cy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IklucHV0IExpdGVyYWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW5wdXRfTGl0ZXJhbHNfMiI+PC9hPklucHV0IExpdGVyYWxzPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRvIGNyZWF0ZSBhbiBpbnB1dCB2YWx1ZSwgcmlnaHQgY2xpY2sgb24gdGhlIGlucHV0IGFuZCBzZWxlY3QgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Q3JlYXRlIE1lbWJlciAmZ3Q7IExpdGVyYWw8L3N0cm9uZz48L3NwYW4+LiBUaGVuIHNwZWNpZnkgdGhlIGFjdHVhbCB2YWx1ZSBpbiB0aGUgVmFsdWUgcHJvcGVydHkgaW4gdGhlIAorCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlByb3BlcnRpZXMgVmlldzwvc3Ryb25nPjwvc3Bhbj4uCisJCQkJCQk8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJCdWlsZGluZyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPgorPGEgbmFtZT0iQnVpbGRpbmciPjwvYT5CdWlsZGluZzwvaDI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQnVpbGRpbmcgTW9kZWxzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQnVpbGRpbmdfTW9kZWxzIj48L2E+QnVpbGRpbmcgTW9kZWxzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPklmIHlvdSd2ZSB1c2VkIG90aGVyIGRldmVsb3BtZW50IGVudmlyb25tZW50cywgeW91J3JlIHByb2JhYmx5IHVzZWQgdG8gYSBzZXBhcmF0ZSBidWlsZCBzdGVwLiBGb3IgZXhhbXBsZSwgaWYgeW91IGVkaXQgYSBzZXQgb2YgSmF2YSBmaWxlcywgeW91IG1pZ2h0IGludm9rZSBhIGNvbXBpbGUgY29tbWFuZC4gRWNsaXBzZSBhbmQgdGhlIEFnZW50IE1vZGVsaW5nIFBsYXRmb3JtIHN1cHBvcnQgYXV0b21hdGljIGJ1aWxkaW5nLiBUaGlzIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8gYnVpbGQgeW91ciBjb2RlLCB5b3Ugc2ltcGx5IHNhdmUgdGhlIG1vZGVsIGFuZCB0aGUgZW52aXJvbm1lbnQgdGFrZXMgY2FyZSBvZiB0aGUgcmVzdC4gV2hhdCBnZXRzIGJ1aWx0IGlzIGRlZmluZWQgYnkgdGhlIHByb2plY3QuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2F2ZSBhIG1vZGVsIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBhbiBBZ2VudCBNb2RlbGluZyBFc2NhcGUgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1ciBhdXRvbWF0aWNhbGx5OjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5UaGUgRXNjYXBlIGJ1aWxkZXIgZ2VuZXJhdGVzIEphdmEgY29kZSBmb3IgdGhlIEVzY2FwZSBBUEksIGluY2x1ZGluZyBzdXBwb3J0IGZvciBzcGVjaWFsaXplZCBncmFwaGljcyBhbmQgKGlmIGVuYWJsZWQpIDNEIHZpc3VhbGl6YXRpb24uPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+VGhlIERvY3VtZW50YXRpb24gYnVpbGRlciBnZW5lcmF0ZXMgY3VzdG9tIGh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1vZGVsLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlRoZSBKYXZhIGJ1aWxkZXIgdGFrZXMgdGhlIEphdmEgY29kZSBnZW5lcmF0ZWQgYWJvdmUgYW5kIGNvbXBpbGVzIGl0LjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlRoZSBNYW5pZmVzdCBhbmQgU2NoZW1hIGJ1aWxkZXJzIHBhY2thZ2UgdGhlIHByb2plY3QgZm9yIHVzZSBhcyBwYXJ0IG9mIHRoZSBFY2xpcHNlIHBsdWdpbiBlbnZpcm9ubWVudC48L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPHA+U28gd2hhdCBkbyB5b3UgZG8gaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBkaWZmZXJlbnQgdGFyZ2V0LCBzdWNoIGFzIFJlcGFzdD8gSGVyZSwgeW91IHNpbXBseSBjcmVhdGUgYW5vdGhlciBwcm9qZWN0IGFuZCBkcmFnIHRoZSBtb2RlbCBpbnRvIGl0LiBZb3UgY2FuIGFsc28gZWRpdCB0aGUgYnVpbGRlcnMgZm9yIGEgZ2l2ZW4gcHJvamVjdCAoc2VlIHRoZSBXb3JrYmVuY2ggRG9jdW1lbnRhdGlvbikgYnV0IHlvdSdsbCBvbmx5IHdhbnQgdG8gZG8gdGhhdCBpZiB5b3UncmUgbWFraW5nIHBlcm1hbmVudCBjaGFuZ2VzIHRvIHRoZSBwcm9qZWN0IGl0c2VsZi48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHZW5lcmF0aW5nIFNwZWNpYWxpemVkIE1vZGVsIEFydGlmYWN0cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkdlbmVyYXRpbmdfU3BlY2lhbGl6ZWRfTW9kZWxfQXJ0aWZhY3RzIj48L2E+R2VuZXJhdGluZyBTcGVjaWFsaXplZCBNb2RlbCBBcnRpZmFjdHM8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+WW91IGNhbiBhbHNvIG1hbnVhbGx5IGdlbmVyYXRlIGNvZGUgZm9yIG1vZGVscy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGNvZGUgZm9yIGEgbW9kZWwgaW4gYSBub24gdGFyZ2V0IHByb2plY3QgYW5kIGRvbid0IHdhbnQgdGhlIGF1dG9tYXRpYyBidWlsZCBjYXBhYmlsaXRpZXMuIFRoZXJlIGFyZSBhbHNvIHNwZWNpYWxpemVkIHRhcmdldHMgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIG1hbnVhbGx5IHRoYXQgYXJlIGJ1bmRsZWQgd2l0aCB0aGUgdG9vbHMgLS0gQU1QIHBsdWdpbiBkZXZlbG9wZXJzIGNhbiBlYXNpbHkgYWRkIGN1c3RvbSBnZW5lcmF0aW9uIHRhcmdldHMgZm9yIHRoaXMgbWVudS4gVG8gZ2VuZXJhdGUgY3VzdG9tIGFydGlmYWN0cywgcmlnaHQtY2xpY2sgb24gYSBtb2RlbCBhbmQgc2VsZWN0IAorCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5HZW5lcmF0ZTwvc3Ryb25nPjwvc3Bhbj4uCisJCQkJPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9HZW5lcmF0ZU1lbnUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPHA+VGFyZ2V0cyBpbmNsdWRlOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJQbGF0Zm9ybSBUYXJnZXRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iUGxhdGZvcm1fVGFyZ2V0cyI+PC9hPlBsYXRmb3JtIFRhcmdldHM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q3JlYXRlcyBjb2RlIGZvciBvbmUgb2YgdGhlIGluc3RhbGxlZCB0YXJnZXRzLCBzdWNoIGFzIEFzY2FwZSwgRXNjYXBlLCBhbmQgU2ltcGhvbnkuIChBZ2FpbiwgdGhlc2UgZ2VuZXJhdG9ycyBhcmUgdW5uZWNlc3NhcnkgZm9yIHByb2plY3RzIHRoYXQgYWxyZWFkeSBoYXZlIHRhcmdldCBzcGVjaWZpYyBidWlsZGVycyBjb25maWd1cmVkLik8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJJbnRlcmZhY2VzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iSW50ZXJmYWNlcyI+PC9hPkludGVyZmFjZXM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q3JlYXRlcyBhIGNvbXBsZXRlIHNldCBvZiBpbnRlcmZhY2VzIGZvciB0aGUgbW9kZWwgY2xhc3Nlcy4gVGhlc2UgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZXZlbG9wbWVudCBhbmQgaW50ZWdyYXRpb24gaW4gZW50ZXJwcmlzZSBlbnZpcm9ubWVudHMuIEdlbmVyYXRlZCBjbGFzc2VzIGFyZSBwbGFjZWQgaW4gdGhlIHNyYyBkaXJlY3Rvcnkgd2l0aCAiSSIgYWRkZWQgdG8gdGhlIG5hbWUuIEZvciBleGFtcGxlLCBpZiB5b3UgZ2VuZXJhdGUgaW50ZXJmYWNlcyBmb3IgYSBtb2RlbCB3aXRoIGFuICJJbmRpdmlkdWFsIiBhZ2VudCwgdGhpcyB0YXJnZXQgd2lsbCBjcmVhdGUgYW4gIklJbmRpdmlkdWFsIiBpbnRlcmZhY2UgdGhhdCBpbmNsdWRlcyBnZXR0ZXJzLCBzZXR0ZXJzIGFuZCBtZXRob2RzIGZvciBhbGwgb2YgdGhlIGFnZW50J3MgYXR0cmlidXRlcyBhbmQgYWN0aW9ucy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTa2VsZXRvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNrZWxldG9uIj48L2E+U2tlbGV0b248L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+Q3JlYXRlcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBtb2RlbC4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uLCBidXQgd2l0aG91dCB0aGUgYWN0aW9uIGltcGxlbWVudGF0aW9ucy4gQWdhaW4sIHRoZXNlIGNsYXNzZXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgdXNlIGluIGVudGVycHJpc2UgYW5kIG90aGVyIHNwZWNpYWxpemVkIGVudmlyb25tZW50cy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJUZXN0IENhc2VzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVGVzdF9DYXNlcyI+PC9hPlRlc3QgQ2FzZXM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+R2VuZXJhdGVzIGJhc2Ugc3VwcG9ydCAobmVlZGluZyBjdXN0b21pemF0aW9uKSB0ZXN0IGNhc2VzIGZvciB1c2UgaW4gSlVuaXQgdGVzdHMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVGV4dCBEb2N1bWVudHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJUZXh0X0RvY3VtZW50cyI+PC9hPlRleHQgRG9jdW1lbnRzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkNyZWF0ZXMgc2ltcGxlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgdXNlIGluIG90aGVyIGRvY3VtZW50cy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJHZW5lcmF0ZSBLZXkgR3JhcGhpY3MiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJHZW5lcmF0ZV9LZXlfR3JhcGhpY3MiPjwvYT5HZW5lcmF0ZSBLZXkgR3JhcGhpY3M8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhpcyBzcGVjaWFsaXplZCB0YXJnZXQgc3VwcG9ydHMgdGhlIGNyZWF0aW9uIG9mIGdyYXBoaWMga2V5cyBmb3IgdGhlIG1vZGVsLiBUbyB1c2UgdGhpcyB0YXJnZXQ6PC9wPgorPGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPgorPG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkdlbmVyYXRlIHRoZSBjb2RlLjwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPkFkZCBhIGRlcGVuZGVuY3kgdG8gdGhlIE1hbmlmZXN0IGZvciAib3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXh0cmFzIi48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5JbiB0aGUgc3JjdXRpbCBkaXJlY3RvcnkgZmluZCB0aGUgSmF2YSBzb3VyY2UgY29kZSBmb3IgdGhlIGNhbHNzIHtSb290Q29udGV4dH1HcmFwaGljc1dyaXRlci4gRm9yIGV4YW1wbGUsIGZvciB0aGUgRXBpZGVtaWMgbW9kZWwsIHRoaXMgd291bGQgYmUgc3JjdXRpbC9uYW1lLm1pbGVzcGFya2VyLmVwaS9FcGlkZW1pY0dyYXBoaWNzV3JpdGVyLmphdmEuPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+UmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgCisJCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlJ1biBBcyAmZ3Q7IEphdmEgQXBwbGljYXRpb248L3N0cm9uZz48L3NwYW4+LgorCQkJCQkJCTwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPlJlZnJlc2ggdGhlIHByb2plY3QgYnkgcmlnaHQtY2xpY2tpbmcgb24gaXQgYW5kIHNlbGVjdGluZyAKKwkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UmVmcmVzaDwvc3Ryb25nPjwvc3Bhbj4uCisJCQkJCQkJPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+VGhlIERvYyBkaXJlY3Rvcnkgd2lsbCBub3cgY29udGFpbiBhIG51bWJlciBvZiBuZXcgZmlsZXMsIGluY2x1ZGluZzwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9ImEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD57Um9vdENvbnRleHR9S2V5LnBuZzwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPntSb290Q29udGV4dH1HcmFwaGljc0tleS5odG1sPC9wPgorPC9saT4KKzwvb2w+Cis8L2Rpdj4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8cD5Cb3RoIGZpbGVzIGNvbnRhaW4gZ3JhcGhpYyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIG1vZGVsIHVzaW5nIHRoZSBkZWZpbml0aW9ucyBkZWZpbmVkIGJ5IHRoZSBtb2RlbCBzdHlsZXMsIHZlcnkgdXNlZnVsIGFydGlmYWN0cyBmb3IgaW5jbHVzaW9uIGluIHBhcGVycyBhbmQgd2ViIHBhZ2VzIGRlc2NyaWJpbmcgeW91ciBtb2RlbC4gRm9yIGV4YW1wbGUsIGhlcmUgaXMgdGhlIEVwaWRlbWljS2V5LnBuZzo8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy90b29scy9FcGlkZW1pY0tleS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRnVuY3Rpb24gRG9jcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZ1bmN0aW9uX0RvY3MiPjwvYT5GdW5jdGlvbiBEb2NzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkdlbmVyYXRlcyBXaWtpVGV4dCBkb2N1bWVudGF0aW9uIGZvciBmdW5jdGlvbiBsaWJyYXJpZXMuIFdlIHVzZSBpdCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24gaW4gdGhpcyBndWlkZSE8L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRXhlY3V0aW5nIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+Cis8YSBuYW1lPSJFeGVjdXRpbmciPjwvYT5FeGVjdXRpbmc8L2gyPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxhdW5jaGluZyBhIE1vZGVsIChBTUYpIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTGF1bmNoaW5nX2FfTW9kZWxfLjI4QU1GLjI5Ij48L2E+TGF1bmNoaW5nIGEgTW9kZWwgKEFNRik8L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHRhYmxlIGlkPSJOMTBEMTMiPgorPHRyPgorCQkJCQkJCis8dGQ+TGF1bmNoaW5nIEFNRiBhbmQgRXNjYXBlIG1vZGVscyBpcyBlYXN5LiBXaGVuIGFuIEFNRiBmaWxlIGlzIHNlbGVjdGVkIC0tIGluIGFueSBvZiB0aGUgcGVyc3BlY3RpdmVzIC0tIHRoZSB0b29sYmFyIGFuZCBBcHBsaWNhdGlvbiBtZW51cyBhcmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBmaWxlIHlvdSd2ZSBzZWxlY3RlZCBhbmQgcHJvdmlkZSBjb252ZW5pZW50IGFjY2VzcyB0byBvdGhlciBmdW5jdGlvbnMuIEZvciBleGFtcGxlLCB3aGVuIHdlIGNsaWNrIG9uIGEgbWV0YWFibSBmaWxlIGluIHRoZSBwYWNrYWdlIGV4cGxvcmVyLCBtb2RlbCBleGVjdXRpb24gYnV0dG9ucyBhcHBlYXIgaW4gdGhlIHRvb2xiYXIuPC90ZD4KKwkJCQkJCTx0ZD4KKwkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvdG9vbHMvRWRpdG9yVG9vbGJhci5wbmciPjwvZGl2PgorCQkJCQkJCis8L3RkPgorCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkKKzx0ZD5JZiB5b3UgcmlnaHQtY2xpY2sgb24gYSBmaWxlIGEgcG9wLXVwIG1lbnUgYXBwZWFycyBsaWtlIHRoZSBvbmUgdG8gdGhlIGZhciByaWdodCAtLSBpbiB0aGlzIGNhc2Ugd2UncmUgc2VsZWN0aW5nIHRoZSAiRXhlY3V0ZSBIZWFkbGVzcyIgb3B0aW9uLiBUbyBsYXVuY2ggYSBtb2RlbCwganVzdCBzZWxlY3Qgb25lIG9mIHRoZSBvcHRpb25zLiAoTm90ZSB0aGF0IHRoZSBleGVjdXRpb24gZnJhbWV3b3JrIGRvZXNuJ3Qga25vdyB3aGV0aGVyIHlvdXIgY29kZSBleGlzdHMgaW4gYW4gRXNjYXBlIHByb2plY3Qgb3IgYW5vdGhlciB0YXJnZXQgcHJvamVjdC4gSWYgeW91IGF0dGVtcHQgdG8gZXhlY3V0ZSBhIC5tZXRhYWJtIG1vZGVsIGluIGFuIEFzY2FwZSBwcm9qZWN0IGZvciBleGFtcGxlLCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IuKTwvdGQ+CisJCQkJCQk8dGQ+CisJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Rvb2xzL0VkaXRvck1lbnUucG5nIj48L2Rpdj4KKwkJCQkJCQorPC90ZD4KKwkJCQkJCis8L3RyPgorPC90YWJsZT4KKzxwPk9uZSBhIG1vZGVsIGhhcyBiZWVuIGxhdW5jaGVkLCB0aGUgQWdlbnQgRXhlY3V0aW9uIFBlcnNwZWN0aXZlIGF1dG9tYXRpY2FsbHkgYmVjb21lcyBhY3RpdmUuIFRoZSBQcm92aWRlcyBhIGN1c3RvbSBsYXlvdXQgbWVudXMgYW5kIHRvb2xzIHNwZWNpZmljIHRvIGV4ZWN1dGluZyBhZ2VudCBtb2RlbHMuPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNFeGVjTmV3LnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzxwPlRoZSBleGVjdXRpb24gb3B0aW9ucyBhcmU6PC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4ZWN1dGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFeGVjdXRlIj48L2E+RXhlY3V0ZTwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5MYXVuY2hlcyB0aGUgbW9kZWwgdXNpbmcgZGVmYXVsdCBncmFwaGljcywgb3BlbmluZyB0aGUgQWdlbnQgRXhlY3V0aW9uIHBlcnNwZWN0aXZlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4ZWN1dGUgSGVhZGxlc3MiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFeGVjdXRlX0hlYWRsZXNzIj48L2E+RXhlY3V0ZSBIZWFkbGVzczwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5MYXVuY2hlcyB0aGUgbW9kZWwgd2l0aG91dCBncmFwaGljcywgb3BlbmluZyB0aGUgQWdlbnQgRXhlY3V0aW9uIHBlcnNwZWN0aXZlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4ZWN1dGUgSGVhZGxlc3MgKERhdGEpIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRXhlY3V0ZV9IZWFkbGVzc18uMjhEYXRhLjI5Ij48L2E+RXhlY3V0ZSBIZWFkbGVzcyAoRGF0YSk8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+TGF1bmNoZXMgdGhlIG1vZGVsIHdpdGggYW4gb2JzZXJ2ZXIgdGhhdCBjb2xsZWN0cyBkYXRhIGludG8gdGhlIEFNRiBhZGF0YSBtb2RlbCByZXByZXNlbnRhdGlvbi48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4ZWN1dGluZyBhIE1vZGVsIChKYXZhIC8gM0QpIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iRXhlY3V0aW5nX2FfTW9kZWxfLjI4SmF2YV8uMkZfM0QuMjkiPjwvYT5FeGVjdXRpbmcgYSBNb2RlbCAoSmF2YSAvIDNEKTwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Zb3UgY2FuIGV4ZWN1dGUgYW55IEVzY2FwZSBtb2RlbCBkaXJlY3RseSBmcm9tIGl0cyBKYXZhIGZpbGUgYnkgcmlnaHQtY2xpY2tpbmcgb24gaXQuIFRoaXMgaXMgdXNlZCBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gZGlyZWN0bHkgaW4gSmF2YSwgb3IgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIG9yIHRoYXQgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLCBzdWNoIGFzIHRoZSAzRCB2ZXJzaW9ucyBvZiBBTUYgbW9kZWxzLiBJbiBvcmRlciBmb3IgdGhlIG1vZGVsIHRvIGxhdW5jaCBjb3JyZWN0bHksIGl0IG11c3QgaGF2ZSBhcyBhIHN1cGVyY2xhc3MgdGhlIEVzY2FwZSAiU2NhcGUiIGNsYXNzLiBJbiB0aGUgZm9sbG93aW5nIHNjcmVlbnNob3QsIHdlJ3ZlIGxhdW5jaGVkIGEgM0QgdmVyc2lvbiBvZiB0aGUgRXBpZGVtaWMgbW9kZWwuIFRoZSAzRCBtb2RlbHMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZvciBhbGwgLm1ldGFhYm0gbW9kZWxzLiBZb3UgY2FuIGFsc28gbGF1bmNoIGEgbW9kZWwgaW50byAzRCBieSBjbGlja2luZyBvbiB0aGUgbW9kZWwgZmlsZSBhbmQgY2xpY2tpbmcgdGhlIHNlY29uZCAoRXhlY3V0ZSBNb2RlbCB3aXRoIDNEKSBleGVjdXRlIGJ1dHRvbi48L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pYzNELnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNvbnRyb2xsaW5nIE1vZGVscyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNvbnRyb2xsaW5nX01vZGVscyI+PC9hPkNvbnRyb2xsaW5nIE1vZGVsczwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5PbmNlIGEgbW9kZWwgaGFzIGJlZW4gbGF1bmNoZWQsIHRoZSB0b29sYmFyIGJ1dHRvbnMgYWxsb3cgeW91IHRvIGNvbnRyb2wgbW9kZWwgZXhlY3V0aW9uLjwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL0V4ZWNDb250cm9sLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJNb2RlbCBFeGVjdXRpb24gQ29udHJvbHMiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJOMTBENkYiPjwvYT5Nb2RlbCBFeGVjdXRpb24gQ29udHJvbHM8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+RnJvbSByaWdodCB0byBsZWZ0LCB5b3UgY2FuIHN0YXJ0LCByZXN0YXJ0LCBwYXVzZSwgc3RlcCwgc3RvcCBhbmQgY2xvc2UgYSBtb2RlbC4gWW91IGNhbiBldmVuIHJ1biBtdWx0aXBsZSBtb2RlbHMgYW5kIGNvbnRyb2wgdGhlbSBpbmRlcGVuZGVudGx5LiBZb3UgY2FuIGFsc28gbW92ZSB2aWV3cyBhcm91bmQsIGNsb3NlIHRoZW0gYW5kIHNvIG9uIGFzIHdpdGggYW55IG90aGVyIEVjbGlwc2Ugdmlld3MuIEhlcmUgd2UncmUgcnVubmluZyB0d28gc2VwYXJhdGUgbW9kZWxzIGZvciBjb21wYXJpc29uLjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbENvbXBhcmlzb24ucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkJCis8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJTcGVlZCBTbGlkZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJTcGVlZF9TbGlkZXIiPjwvYT5TcGVlZCBTbGlkZXI8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+QSBzcGVjaWFsIGZlYXR1cmUgb2YgdGhlIG1vZGVsaW5nIHRvb2xzIGlzIHRoZSAiU3BlZWQgU2xpZGVyIi4gVGhpcyBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5ICJzcGVlZCB1cCIgYW5kICJzbG93IGRvd24iIHRoZSBtb2RlbCBleGVjdXRpb24uIFlvdSBjYW4gc2VlIHdoZXJlIHlvdSd2ZSBzZXQgdGhlIGN1cnJlbnQgc3BlZWQgaW4gdGhlIHN0YXR1cyBiYXIgaW4gdGhlIGxvd2VyIGxlZnQgaGFuZCBjb3JuZXIgb2YgdGhlIGVudmlyb25tZW50LjwvcD4KKzxwPkFjdHVhbGx5LCB5b3UncmUgbm90IGNvbnRyb2xsaW5nIHRoZSBzcGVlZCBvZiBtb2RlbCAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iaXRhbGljIj5leGVjdXRpb248L3NwYW4+IGF0IGFsbC4gQWdlbnQgbW9kZWxzIGFyZSBhbG1vc3QgYWx3YXlzIGNvbnN0cmFpbmVkIG5vdCBieSB0aGUgdGltZSBvZiBtb2RlbCBleGVjdXRpb24gLS0gYSB0eXBpY2FsIG1vZGVsIGNhbiBleGVjdXRlIG1hbnkgdGhvdXNhbmRzIG9mIGl0ZXJhdGlvbnMgYSBzZWNvbmQgLS0gYnV0IGJ5IHRoZSB0aW1lIGl0IHRha2VzIHRvIGRyYXcgdmlzdWFsaXphdGlvbnMuIEJ5IHVwZGF0aW5nIHRoZSB2aWV3cyBsZXNzIGZyZXF1ZW50bHkgd2UgYWxsb3cgdGhlIG1vZGVsIHRvIHJ1biBhdCBmdWxsIHNwZWVkIHVudGlsIHRoZSBuZXh0IHZpc3VhbGl6YXRpb24gcGVyaW9kLiBUaGlzIGdpdmVzIHRoZSBpbGx1c2lvbiB0aGF0IHdlJ3JlIHNwZWVkaW5nIHVwIHRoZSBtb2RlbC4gV2hlbiB3ZSBzbG93IHRoZSBtb2RlbCBkb3duLCB3ZSdyZSBpbnNlcnRpbmcgYSB3YWl0IHBlcmlvZCBiZXR3ZWVuIGVhY2ggbW9kZWwgaXRlcmF0aW9uLgorCQkJCQkJPC9wPgorPHA+VG8gaW5jcmVhc2UgbW9kZWwgZXhlY3V0aW9uIHNwZWVkLCBtb3ZlIHRoZSBzbGlkZXIgdG8gdGhlIHJpZ2h0LiBIZXJlIHdlJ3JlIG9ubHkgdXBkYXRpbmcgdGhlIG1vZGVsIGV2ZXJ5IDU2IGl0ZXJhdGlvbnMuPC9wPgorPHA+CisJCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGlvbi9TbGlkZXJSaWdodC5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxwPlRvIGRlY3JlYXNlIHNwZWVkLCBtb3ZlIHRoZSBzbGlkZXIgdG8gdGhlIGxlZnQuIEhlcmUsIHdlJ3JlIHBhdXNpbmcgYmV0d2VlbiBlYWNoIGl0ZXJhdGlvbiBmb3IgMS42NSBzZWNvbmRzLjwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vU2xpZGVyTGVmdC5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iVGhlIEFjdGl2ZSBNb2RlbCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlRoZV9BY3RpdmVfTW9kZWwiPjwvYT5UaGUgQWN0aXZlIE1vZGVsPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkFuIGltcG9ydGFudCBjb25jZXB0IGluIHRoZSBleGVjdXRpb24gd29ya2JlbmNoIGlzIHRoZSAiYWN0aXZlIG1vZGVsIi4gVGhlIGFjdGl2ZSBtb2RlbCBpcyB0aGUgbW9kZWwgdGhhdCBpcyBjb250cm9sbGVkIGJ5IHRoZSB0b29sYmFyIGJ1dHRvbnMuIEFzIGRpc2N1c3NlZCwgdGhlIEVzY2FwZSBlbnZpcm9ubWVudCBzdXBwb3J0cyBtb3JlIHRoYW4gb25lIHJ1bm5pbmcgbW9kZWwgYXQgYW55IGdpdmVuIHRpbWUuIFRoZSBhY3RpdmUgbW9kZWwgaXMgdGhlIGN1cnJlbnQgImZvY3VzZWQiIG9yIGZyb250LW1vc3QgbW9kZWwsIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhY3RpdmUgbW9kZWwgYXQgYW55IGdpdmVuIHRpbWUgYW5kIHdoZW5ldmVyIGFueSBtb2RlbHMgYXJlIHJ1bm5pbmcgb25lIG9mIHRoZW0gd2lsbCBiZSBhY3RpdmUuIFRvIG1ha2UgYSBtb2RlbCBiZWNvbWUgdGhlIGFjdGl2ZSBtb2RlbCwgeW91IHNpbXBseSBzZWxlY3QgYSB2aWV3IG9mIHRoYXQgbW9kZWwgb3Igc2VsZWN0IHRoZSBtb2RlbCBpbiB0aGUgbW9kZWwgbWFuYWdlciAoc2VlIGJlbG93KS4gV2hlbiBhIG1vZGVsIGlzIGNsb3NlZCwgYW5vdGhlciBtb2RlbCBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZC48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlZpZXdzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVmlld3NfMiI+PC9hPlZpZXdzPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZXJlIGFyZSBtYW55IHZpZXdzIHNwZWNpZmljIHRvIHRoZSBBZ2VudCBFeGVjdXRpb24gZW52aXJvbm1lbnQgdGhhdCB3aWxsIGVuYWJsZSB5b3UgdG8gZXhwbG9yZSBhbmQgY29udHJvbCBydW5uaW5nIG1vZGVscy48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iUHJvcGVydGllcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlByb3BlcnRpZXNfMiI+PC9hPlByb3BlcnRpZXM8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91IHdhbnQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCBhbiBhZ2VudCwgc2hvdyB0aGUgcHJvcGVydGllcyB2aWV3LCBhbmQgY2xpY2sgb24gYWdlbnQgaW4gdGhlIDJEIHZpZXcgb3IgYW55IG90aGVyIHZpZXdzIHRoYXQgc3VwcG9ydCBhZ2VudCBzZWxlY3Rpb24gc3VjaCBhcyB0aGUgdHJlZSB2aWV3LjwvcD4KKzxwPgorCQkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pY01vZGVsQWdlbnRQcm9wZXJ0aWVzLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5Zb3UgY2FuIGV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyAoc2V0dGluZ3MpIGZvciBtb2RlbHMgYnkgdGhlbiBjbGlja2luZyBvbiB0aGUgbW9kZWwgaW4gdGhlIE1vZGVsIE1hbmFnZXIgb3IgYnkgc2VsZWN0aW5nIGEgZ2VuZXJhbCBtb2RlIGFyZWEgc3VjaCBhcyB0aGUgZ3JheSBhcmVhIGVuY2xvc2luZyB0aGUgMkQgdmlldy48L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbFByb3BlcnRpZXMucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkFnZW50IE5hdmlnYXRvciI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkFnZW50X05hdmlnYXRvciI+PC9hPkFnZW50IE5hdmlnYXRvcjwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5BZ2VudCBOYXZpZ2F0b3I8L3N0cm9uZz48L3NwYW4+IGFsbG93cyB5b3UgdG8gc2VsZWN0IGFnZW50cyBmcm9tIGEgdHJlZSB2aWV3LiBUaGUgYWdlbnQgc2VsZWN0aW9uIGlzIGNvb3JkaW5hdGVkIGFjcm9zcyB2aWV3cyBzbyB0aGF0IGZvciBleGFtcGxlIHdoZW4geW91IHNlbGVjdCBhbiBhZ2VudCBpbiB0aGUgbmF2aWdhdG9yIGl0IGlzIGFsc28gc2VsZWN0ZWQgaW4gdGhlIDJEIHZpZXcuIEluIHRoZSBmb2xsb3dpbmcgc2NyZWVuc2hvdCB5b3UgY2FuIHNlZSBhbiBhZ2VudCBzZWxlY3RlZCBpbiBib3RoIHZpZXdzIGFzIHdlbGwgYXMgdGhlIHByb3BlcnRpZXMgZWRpdG9yLgorCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vQWdlbnROYXZpZ2F0b3IucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsIE1hbmFnZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RlbF9NYW5hZ2VyIj48L2E+TW9kZWwgTWFuYWdlcjwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz4nTW9kZWwgTWFuYWdlcjwvc3Ryb25nPjwvc3Bhbj4nIGFsbG93cyB5b3UgdG8gZXhhbWluZSBhbmQgY29udHJvbCB0aGUgc3RhdHVzIG9mIGFsbCBydW5uaW5nIG1vZGVscy4gSW4gdGhlIGZvbGxvd2luZyBzY3JlZW5zaG90LCB3ZSd2ZSBsYXVuY2hlZCBmb3VyIHNlcGFyYXRlIG1vZGVscyBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZSB0eXBpY2FsIG1vZGVsIHN0YXRlIGF0IGRpZmZlcmVudCBwZXJpb2RzLgorCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vTW9kZWxNYW5hZ2VyLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5UaGUgbWFuYWdlciBzaG93cyB0aGF0IHR3byBvZiB0aGUgbW9kZWxzIGFyZSBydW5uaW5nIGFuZCB0d28gYXJlIHBhdXNlZC4gQnkgb3BlbmluZyB0aGUgbW9kZWwgbm9kZSwgd2UgY2FuIHNlZSB0aGUgdmlld3MgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZC4gTm90ZSB0aGF0IHdlIG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBieSAiVmlld3MiIGluIHRoaXMgY29udGV4dC4gSGVyZSAiVmlld3MiIGFyZSBhbnkgdGhpbmcgdGhhdCBpcyBtb25pdG9yaW5nIHRoZSBzdGF0ZSBvZiBhIHJ1bm5pbmcgbW9kZWwuIEEgdmlldyBtYXkgbm90IGhhdmUgYSBncmFwaGljYWwgY29tcG9uZW50IGF0IGFsbC48L3A+Cis8cD5Zb3UgY2FuIG1ha2UgYW55IG1vZGVsIHRoZSBjdXJyZW50IGFjdGl2ZSBtb2RlbCBieSBjbGlja2luZyBvbiBpdHMgbm9kZSBpbiB0aGlzIHZpZXcuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IiZxdW90O0Fib3V0IHRoaXMgTW9kZWwmcXVvdDsiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSIuMjJBYm91dF90aGlzX01vZGVsLjIyIj48L2E+IkFib3V0IHRoaXMgTW9kZWwiPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSAKKwkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz4nQWJvdXQgdGhpcyBNb2RlbDwvc3Ryb25nPjwvc3Bhbj4nIHZpZXcgZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgYSAoQU1GIG9yIEphdmEgYmFzZWQpIG1vZGVsIGlmIGl0IGhhcyBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBkZXZlbG9wZXIuIEluIG9yZGVyIHRvIGFwcGVhciBpbiB0aGlzIGRpYWxvZywgY3JlYXRlIGEgZmlsZSBuYW1lZCAiQWJvdXRbTXlNb2RlbF0uaHRtbCIgd2hlcmUgIk15TW9kZWwiIGlzIHRoZSBtb2RlbCdzIFNjYXBlIENsYXNzIE5hbWUgKG5vdCB0aGUgQU1GIG1vZGVsIGZpbGUgbmFtZSkuIFRoZSBmaWxlIHNob3VsZCBiZSBwbGFjZWQgaW4gYSAicmVzIiBzb3VyY2UgZm9sZGVyIGluIHRoZSBtb2RlbCBwcm9qZWN0IGRpcmVjdG9yeSBpbiBhIHBhcmFsbGVsIGRpcmVjdG9yeSBwYXRoIHRvIHRoZSByb290IHNjYXBlJ3MgSmF2YSBjbGFzcyBwYWNrYWdlLiBGb3IgZXhhbXBsZSwgYW4gYWJvdXQgZmlsZSBmb3IgYSBtb2RlbCBkZWZpbmVkIGJ5IHRoZSBzY2FwZSAiZWR1LmJyb29rLm5vcm1zLk5vcm1zIiBzaG91bGQgYmUgcGxhY2VkIGF0ICJyZXMvZWR1L2Jyb29rL25vcm1zL0Fib3V0Tm9ybXMuaHRtbCIuIFRoZSBmaWxlIHNob3VsZCBiZSBhbiBodG1sIGZyYWdtZW50IC0tIHRoYXQgaXMsIHdpdGhvdXQgYm9keSBhbmQgaGVhZCB0YWdzIC0tIGFuZCBjYW4gaW5jbHVkZSBhbnkgdmFsaWQgaHRtbCB0YWdzLCBpbmNsdWRpbmcgbGlua3MuCisJCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL0Fib3V0Vmlldy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJWaXN1YWxpemF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iVmlzdWFsaXphdGlvbiI+PC9hPlZpc3VhbGl6YXRpb248L2gzPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIEFnZW50IE1vZGVsaW5nIEVudmlyb25tZW50IGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgbWFueSBraW5kcyBvZiAyRCBvciAzRCB2aXN1YWxpemF0aW9uLiBBTVAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB2aWV3cyBmb3IgZ2VuZXJhdGVkIG1vZGVscy4gVGhlIEVzY2FwZSBBUEkgc3VwcG9ydHMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCB2aXN1YWxpemF0aW9uIHRvIHN1cHBvcnQgQXNjYXBlIG1vZGVscyB0aGF0IGFyZW4ndCBzaG93biBoZXJlLiBMb29rIGF0IHRoZSBleGFtcGxlIG9yZy5hc2NhcGUuZXNjYXBlLm1vZGVscy5leGFtcGxlcyBhbmQgb3JnLmFzY2FwZS5lc2NhcGUubW9kZWxzLmJyb29rIGZvciBleGFtcGxlcyBvZiB0aG9zZS48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iMkQgVmlld3MiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSIyRF9WaWV3cyI+PC9hPjJEIFZpZXdzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSAKKwkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkdyYXBoaWMgMkQ8L3N0cm9uZz48L3NwYW4+IHZpZXcgaXMgdGhlIG1vc3QgY29tbW9uIHZpZXcgd2F5IHRvIHdvcmsgd2l0aCBhbiBBZ2VudCBNb2RlbCBhbmQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYW5kIGRpc3BsYXllZCBmb3IgZXhlY3V0aW5nIG1vZGVscy4KKwkJCQkJPC9wPgorPHA+CisJCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljMkRWaWV3LnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgdmlldyB3aWRnZXRzIGluIHRoZSB1cHBlci1yaWdodCBoYW5kIGNvcm5lciB0aGF0IHlvdSBjYW4gdXNlIHRvIG1vZGlmeSB0aGUgdmlldy4gWW91IGNhbjo8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU2NhbGluZyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNjYWxpbmciPjwvYT5TY2FsaW5nPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9IjEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5FbnRlciBvciBzZWxlY3QgYSBzcGVjaWZpYyBzY2FsZSBpbiB0aGUgY29tYm8gbWVudS48L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5TZWxlY3QgYSBidXR0b24gdG8gaGF2ZSB0aGUgbW9kZWwgc2NhbGUgZWl0aGVyOjwvcD4KKzxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij4KKzxvbCBjbGFzcz0ib3JkZXJlZGxpc3QiIHR5cGU9ImEiPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5GcmVlbHk8L3A+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5XaXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgdmlldzwvcD4KKzwvbGk+Cis8bGkgY2xhc3M9Imxpc3RpdGVtIj4KKzxwPldpdGhpbiB0aGUgdmVydGljYWwgYm91bmRzIG9mIHRoZSB2aWV3PC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+V2l0aGluIHRoZSBob3Jpem9udGFsIGJvdW5kcyBvZiB0aGUgdmlldzwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8L2xpPgorPGxpIGNsYXNzPSJsaXN0aXRlbSI+Cis8cD5ab29tIEluPC9wPgorPC9saT4KKzxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorPHA+Wm9vbSBPdXQ8L3A+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSIzRCBWaWV3cyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IjNEX1ZpZXdzIj48L2E+M0QgVmlld3M8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGhlIDNEIHZpZXdzIHByb3ZpZGUgYSB0aHJlZS1kaW1lbnNpb25hbCByZXByZXNlbnRhdGlvbiBvZiBhIHJ1bm5pbmcgbW9kZWwuIEN1cnJlbnRseSB0aGV5IHN1cHBvcnQgMkQgbW9kZWxzIG9ubHksIHdoaWNoIG1ha2VzIHRoZW0gMiAxLzIgRCB2aWV3cy48L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlldzNELnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5Zb3UgY2FuIG5hdmlnYXRlIGFuZCBjdXN0b21pemUgdGhlIG1vZGVsIHdpdGggdGhlIGZvbGxvd2luZyBjb250cm9sczo8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlldzNETWVudUJhci5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+RnJvbSBsZWZ0IHRvIHJpZ2h0LCB0aGV5IGFyZTo8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQW5pbWF0aW9uIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQW5pbWF0aW9uIj48L2E+QW5pbWF0aW9uPC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlR1cm5zIG9uIGFuZCBvZmYgdGhlIGludGVycG9sYXRlZCAoc21vb3RoKSBtb3ZlbWVudCBvZiBhZ2VudHMgZnJvbSBvbmUgY2VsbCB0byBhbm90aGVyLiBUaGlzIGlzIGEgdW5pcXVlIGZlYXR1cmUgb2YgQU1QIGFuZCBwcm92aWRlcyBhIHZlcnkgbmljZSB2aXN1YWxpemF0aW9uLCBidXQgaXQgZG9lcyBzbG93IGRvd24gbW9kZWwgZXhlY3V0aW9uLiBGb3IgdmVyeSBsYXJnZSBtb2RlbHMsIHlvdSBjYW4gc3dpdGNoIGl0IG9mZiAtLSB2aXN1YWxpemF0aW9uIHdpbGwgYmUgImplcmt5IiBidXQgbXVjaCBxdWlja2VyLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlBlcnNwZWN0aXZlcyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlBlcnNwZWN0aXZlcyI+PC9hPlBlcnNwZWN0aXZlczwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UaGUgdGhyZWUgcGVyc3BlY3RpdmVzIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGNhbWVyYSBsb2NhdGlvbiAtLSBpbiBvdGhlciB3b3JkcyB0aGUgcGVyc3BlY3RpdmUgZnJvbSB3aGljaCB0aGUgbW92aWUgaXMgYmVpbmcgbWFkZS4gTm90ZSB0aGF0IGlmIHRoZSBjYW1lcmEgaXMgY3VycmVudGx5IG1vdmluZyB0byBhIGdpdmVuIHBlcnNwZWN0aXZlIGFuZCB5b3Ugc2VsZWN0IGEgbmV3IHBlcnNwZWN0aXZlIHRoZSBjYW1lcmEgbWF5IGJlY29tZSBjb25mdXNlZCEgSXQgaXMgYmVzdCB0byB3YWl0IHVudGlsIHRoZSBjYW1lcmEgY29tZXMgdG8gYSBzdG9wIGJlZm9yZSBjaG9vc2luZyBhIGRpZmZlcmVudCBwZXJzcGVjdGl2ZS4gWW91IGNhbiBzcGVlZCB1cCBjYW1lcmEgbW92ZW1lbnQgYnkgcGF1c2luZyB0aGUgbW9kZWwgdGVtcG9yYXJpbHkuPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkZpcnN0IFBlcnNvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDYgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkZpcnN0X1BlcnNvbiI+PC9hPkZpcnN0IFBlcnNvbjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Nb3ZlcyB0aGUgcG9pbnQgb2YgdmlldyB0byBncm91bmQgbGV2ZWwsIGFzIGlmIHRoZSBvYnNlcnZlciB3ZXJlIGluIHRoZSBzcGFjZSBpdHNlbGYuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iT3ZlcmhlYWQiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJPdmVyaGVhZCI+PC9hPk92ZXJoZWFkPC9oNj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk1vdmVzIHRoZSBwb2ludCBvZiB2aWV3IHRvIG92ZXJoZWFkLCBnaXZpbmcgYSBzaW1pbGFyIHZpZXcgYXMgeW91IGhhdmUgd2l0aCB0aGUgMkQgdmlldy4gTm90ZSB0aGF0IGluIG1hbnkgY2FzZXMgdGhlIDNEIHZpZXcgaXMgYWN0dWFsbHkgZmFzdGVyIHRoYW4gdGhlIDJEIHZpZXcsIHNvIHRoaXMgaXMgYSBnb29kIHdheSB0byBvYnNlcnZlIGFueSBraW5kIG9mIDJEIG1vZGVsLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkhlbGljb3B0ZXIiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg2IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJIZWxpY29wdGVyIj48L2E+SGVsaWNvcHRlcjwvaDY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Nb3ZlcyB0aGUgcG9pbnQgdG8gYW4gb2JsaXF1ZSBwZXJzcGVjdGl2ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGdldHRpbmcgYW4gb3ZlcmFsbCBzZW5zZSBvZiBtb2RlbCBiZWhhdmlvci48L3A+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iR3JhcGggVmlld3MiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJHcmFwaF9WaWV3cyI+PC9hPkdyYXBoIFZpZXdzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkdyYXBoIHZpZXdzIGFsbG93IHlvdSB0byB1bmRlc3RhbmQgdGhlIG5ldHdvcmsgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHZhcmlvdXMgYWdlbnRzIGluIHRoZSBtb2RlbC4gQnkgZGVmYXVsdCwgYSBncmFwaCBpcyBjcmVhZWQgZm9yIGFsbCByZWxhdGlvbnNoaXBzLCBidXQgeW91IGNhbiBjdXN0b21pemUgdGhhdCBiZWhhdmlvciBwcm9ncmFtbWF0aWNhbGx5LiBHcmFwaHMgYXJlIGFsc28gc3VwZXItaW1wb3NlZCBvbiAyRCBtb2RlbHMsIGFzIHdlIGNhbiBzZWUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIHJ1bm5pbmcgdGhlIEVwaWRlbWljQ29udGFjdCBtb2RlbC48L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkJCis8L3A+Cis8cD5Ob3RlIHRoYXQgY29tcGxleCBtb2RlbHMgY2FuIHRha2UgYSBsb25nIHRpbWUgdG8gdmlzdWFsaXplIGFuZCB3ZSdsbCBiZSBsb29raW5nIGZvciBvcHBvcnR1bnRpdGVzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIGZ1cnRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHRoaW5rIHRoZSB2aXN1YWxpemF0aW9uIGlzIHN0dWNrIGl0IGlzIGxpa2VseSB0aGF0IGl0IGlzIHNpbXBseSBjYWxjdWxhdGluZyB0aGUgbmV4dCB2aXN1YWxpemF0aW9uIHN0ZXAgLS0gd2FpdCBhIGJpdCBiZWZvcmUgY2FuY2VsaW5nIHRoZSBtb2RlbCBvciBjbG9zaW5nIGl0LjwvcD4KKzxwPkdyYXBoIHZpZXdzIGNhbiBiZSBjdXN0b21pemVkIHdpdGggdGhlIGZvbGxvd2luZyBjb250cm9sczo8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlldzNETWVudUJhci5wbmciPjwvZGl2PgorPHA+CisJCQkJCQorPC9wPgorPHA+RnJvbSBsZWZ0IHRvIHJpZ2h0LCB0aGV5IGFyZTo8L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTGF5b3V0Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTGF5b3V0Ij48L2E+TGF5b3V0PC9oNT4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBsYXlvdXQgYnV0dG9ucyBjb250cm9sIGhvdyB0aGUgbm9kZXMgYXJlIHBsYWNlZCB3aXRoaW4gdGhlIGdyYXBoLiBZb3UgY2FuIHN3aXRoYyBiZXR3ZWVuIGxheW91dCBkeW5hbWljYWxseSB0byBnYWluIGluc2lnaHQgaW50byBuZXR3b3JrIHJlbGF0aW9uc2hpcHMuPC9wPgorPHRhYmxlIGlkPSJOMTBFODMiPgorPHRyPgorCQkJCQkJCQkKKzx0ZD4KKwkJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoRG93bi5wbmciPjwvZGl2PgorCQkJCQkJCQkKKzwvdGQ+CisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoUmlnaHQucG5nIj48L2Rpdj4KKwkJCQkJCQkJCis8L3RkPgorCQkJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQkJCis8dGQ+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5UcmVlIChEb3duKTo8L3N0cm9uZz48L3NwYW4+IFBsYWNlcyB0aGUgZ3JhcGggbm9kZXMgaW50byBhIGRvd253YXJkIG9yaWVudGVkIHRyZWUgZm9ybWF0aW9uLiBZb3UnbGwgZmluZCB0aGF0IHRoZSB0cmVlIHZpZXdzIGFyZSBtb3JlIGVmZmVjaWVudCBhdCB2aXN1YWxpemluZywgYW5kIGNhbiBiZSB2ZXJ5IG9vZCBhdCByZXByZXNlbnRpbmcgbW9kZWxzIHdpdGggYW4gaW5oZXJlbnQgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBzdWNoIGFzIGtpbnNoaXAgZGlhZ3JhbXMsIGJ1dCBkb24ndCBhbHdheXMgZ2l2ZSB0aGUgYmVzdCBpbnNpZ2h0IGludG8gdGhlIG1vZGVsIGZvciBjb21wbGV4IG5ldHdvcmsgcmVsYXRpb25zLgorCQkJCQkJCQk8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5UcmVlIChSaWdodCk6PC9zdHJvbmc+PC9zcGFuPiBUaGUgc2FtZSB0cmVlIGxheW91dCBvcmllbnRlZCBmcm9tIHRoZSByb290LW1vc3Qgbm9kZXMgcmlnaHR3YXJkLgorCQkJCQkJCQk8L3RkPgorCQkJCQkJCQorPC90cj4KKzx0cj4KKwkJCQkJCQkJCis8dGQ+CisJCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFJhZGlhbC5wbmciPjwvZGl2PgorCQkJCQkJCQkKKzwvdGQ+CisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoU3ByaW5nLnBuZyI+PC9kaXY+CisJCQkJCQkJCQorPC90ZD4KKwkJCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkJCQorPHRkPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+UmFkaWFsOjwvc3Ryb25nPjwvc3Bhbj4gUGxhY2VzIHRoZSBub2RlcyBpbiBhIHJhZGlhbCBsYXlvdXQgd2l0aCB0aGUgcm9vdC1tb3N0IG5vZGVzIGF0IHRoZSBjZW50ZXIuIFRoaXMgaXMgYSBncmVhdCB3YXkgdG8gcmVwcmVzZW50IHNlbWktaGllcmFyY2hpY2FsIG1vZGVscyB3aXRoIGNvbXBsZXggc3RydWN0dXJlLCBidXQgaXMgYSBsaXR0bGUgc2xvd2VyIHRoYW4gdGhlIHRyZWUgbGF5b3V0cy4KKwkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJPHRkPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+U3ByaW5nOjwvc3Ryb25nPjwvc3Bhbj4gVGhpcyBsYXlvdXQgdXNlcyBhIHNwcmluZyBhbmQgc3RyYWluIGFwcHJvYWNoIHRoYXQgYWxsb3dzIG5vZGVzIHRvIGZpbmQgdGhlaXIgb3duIGxvY2F0aW9uIHdpdGhpbiB0aGUgdmlzdWFsaXphdGlvbi4gSXQgY2FuIHByb3ZpZGUgYmVhdXRpZnVsIGFuZCBpbnNpZ2h0ZnVsIGRpYWdyYW1zLCBidXQgaXQgaXMgYWxzbyBzbG93ZXIgdGhhbiB0aGUgb3RoZXIgbGF5b3V0cy4gRm9yIG1vcmUgY29tcGxleCBtb2RlbHMgaXQgb2Z0ZW4gd29ya3Mgd2VsbCB0byB1c2UgdGhlIHJhZGlhbCBsYXlvdXQgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSBTcHJpbmcgbGF5b3V0IHdoZW4gZXhhbWluaW5nIHJlbGF0aW9uc2hpcHMgaW4gZGVwdGguCisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCis8L3RyPgorPC90YWJsZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlNwcmluZyBMYXlvdXQgQ3VzdG9taXphdGlvbiI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlNwcmluZ19MYXlvdXRfQ3VzdG9taXphdGlvbiI+PC9hPlNwcmluZyBMYXlvdXQgQ3VzdG9taXphdGlvbjwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Zb3UgY2FuIGN1c3RvbWl6ZSBob3cgdGhlIFNwcmluZyBieSBjbGlja2luZyBvbiB0aGUgY3VzdG9taXphdGlvbiBidXR0b24uIFRoaXMgYWxsb3dzIHlvdSB0byBjaGFuZ2UgYSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgZGV0ZXJtaW5lIGhvdyBub2RlcyBhcmUgbGF5ZWQgb3V0LiBXaGlsZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyB3b3JrIHdlbGwgd2l0aCBtYW55IGdyYXBoIHN0cnVjdHVyZXMgaXQgY2FuIGJlIGhlbHBmdWwgKGFuZCBmdW4pIHRvIHBsYXkgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgdG8gZ2V0IHRoZSBiZXN0IHZpc3VhbGl6YXRpb24uCisJCQkJCQkJfAorCQkJCQkJCTwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFNwcmluZ0RpYWxvZy5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iQ2hhcnRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ2hhcnRzIj48L2E+Q2hhcnRzPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPkEgCisJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5DaGFydDwvc3Ryb25nPjwvc3Bhbj4gdmlldyBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIGRpc3BsYXllZCBmb3IgZXhlY3V0aW5nIG1vZGVscy4gSXQgY2FuIGRpc3BsYXkgYWdncmVnYXRlIHZhbHVlcyBmb3IgYW55IG9mIHRoZSBhZ2VudCBhdHRyaWJ1dGVzIHlvdSBoYXZlIHNldCB0aGUgImdhdGhlciBkYXRhIiB2YWx1ZSB0byB0cnVlIGZvci4gQ2hhcnRzIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQuIFdoaWxlIHRoZSBidWlsdC1pbiB2aWV3IGlzIG5vdCBtZWFudCB0byBiZSB0aGUgc29sZSB0b29sIGZvciBFc2NhcGUgbW9kZWwgZGF0YSBhbmFseXNpcywgaXQgcHJvdmlkZXMgYW4gZWFzeSB0byB1c2UgYW5kIHBvd2VyZnVsIHdheSB0byBleHBsb3JlIG1vZGVscyBpbnRlcmFjdGl2ZWx5LiBUaGUgQ2hhcnQgdmlldyB3aWRnZXRzIGFsbG93IHlvdSB0byBtb2RpZnkgdGhlIGNoYXJ0IHdpdGggdGhlIGNsaWNrIG9mIGEgYnV0dG9uLgorCQkJCQk8L3A+Cis8cD4KKwkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNDaGFydE9wdGlvbnMucG5nIj48L2Rpdj4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIHRpdGxlPSJDaGFydCBUeXBlIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNSBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iQ2hhcnRfVHlwZSI+PC9hPkNoYXJ0IFR5cGU8L2g1PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+U2V2ZXJhbCBjaGFydCB0eXBlcyBhcmUgc3VwcG9ydGVkOiBUaGUgbGluZSwgYXJlYSwgYmFyIGFuZCBwaWUgY2hhcnQuIENsaWNrIG9uIG9uZSBvZiB0aGUgaWNvbnMgdG8gc2VsZWN0IHRoYXQgdHlwZS48L3A+Cis8dGFibGUgaWQ9Ik4xMEVGQSI+Cis8dHI+CisJCQkJCQkJCQorPHRkPgorCQkJCQkJCQkJCis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGlvbi9MaW5lQ2hhcnQucG5nIj48L2Rpdj4KKwkJCQkJCQkJCis8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL0FyZWFDaGFydC5wbmciPjwvZGl2PgorCQkJCQkJCQkKKzwvdGQ+CisJCQkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCQkKKzx0ZD4KKwkJCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkxpbmU8L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCTxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPkFyZWE8L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCis8L3RyPgorPHRyPgorCQkJCQkJCQkKKzx0ZD4KKwkJCQkJCQkJCQorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vQmFyQ2hhcnQucG5nIj48L2Rpdj4KKwkJCQkJCQkJCis8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL1BpZUNoYXJ0LnBuZyI+PC9kaXY+CisJCQkJCQkJCQorPC90ZD4KKwkJCQkJCQkKKzwvdHI+Cis8dHI+CisJCQkJCQkJCQorPHRkPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+QmFyPC9zdHJvbmc+PC9zcGFuPgorCQkJCQkJCQk8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5QaWU8L3N0cm9uZz48L3NwYW4+CisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCis8L3RyPgorPC90YWJsZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNoYXJ0IExlZ2VuZCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDUgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkNoYXJ0X0xlZ2VuZCI+PC9hPkNoYXJ0IExlZ2VuZDwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UdXJuIHRoZSBsZWdlbmQgb24gYW5kIG9mZiBieSBzZWxlY3RpbmcgdGhlICJUIiBpY29uLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkNoYXJ0IERhdGEiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg1IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJDaGFydF9EYXRhIj48L2E+Q2hhcnQgRGF0YTwvaDU+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UbyBzZWxlY3QgdGhlIHN0YXRpc3RpY3MgdG8gZGlzcGxheSwgc2hvdyB0aGUgCisJCQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Q2hhcnQgQ3VzdG9taXplcjwvc3Ryb25nPjwvc3Bhbj4gdmlldy4gV2hlbiB0aGUgY3VzdG9taXplciBoYXMgYmVlbiBzZWxlY3RlZCwgc2VsZWN0IGEgY2hhcnQgdG8gY3VzdG9taXplLiBUaGUgY3VzdG9taXplciBwcmVzZW50cyB0aGUgcG9zc2libGUgY2hvaWNlcyBpbiBhIDJEIGZvcm1hdC4gT24gb25lIGF4aXMgYXJlIHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBkYXRhIGJlaW5nIGNvbGxlY3RlZCwgYW5kIG9uIHRoZSBvdGhlciBhcmUgdGhlIG1lYXN1cmVtZW50cyBjb2xsZWN0ZWQgb24gdGhvc2UgYXhlcywgaS5lLiBDb3VudCwgTWluaW11bSwgTWF4aW11bSwgVmFyaWFuY2UsIFN0YW5kYXJkIERldmlhdGlvbiwgU3VtIGFuZCBBdmVyYWdlLiBUbyBjbGVhciBhbGwgc2VsZWN0aW9ucywgY2xpY2sgdGhlIEdyYXkgIlgiIGJ1dHRvbi4KKwkJCQkJCTwvcD4KKzxwPgorCQkJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNDaGFydEN1c3RvbWl6ZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCQkKKzwvcD4KKzxwPlRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciB0aGluZ3MgdG8gcGxheSBhcm91bmQgd2l0aCwgc3VjaCBhcyB6b29taW5nIHRoZSBhZ2VudCB2aWV3IG9yIHNlbGVjdGluZyBvdGhlciBjaGFydCBzZXJpZXMgdG8gZGlzcGxheSB1c2luZyB0aGUgQ2hhcnQgQ3VzdG9taXplciwgc28ganVzdCBleHBsb3JlLiBZb3UgY2FuIGFsd2F5cyBjbG9zZSBhbiBhY3RpdmUgbW9kZWwgYnkgY2xpY2tpbmcgb24gdGhlIGNsb3NlIHRvb2xiYXIgYnV0dG9uLiBPciBpZiB5b3UgY2FuJ3QgYWNjZXNzIHRoZSBtb2RlbHMgY29udHJvbHMgZm9yIHNvbWUgcmVhc29uLCB5b3UgY2FuIG9wZW4gdGhlIHByb2dyZXNzIHZpZXcgYW5kIGNsb3NlIHByb2plY3RzIGZvcm0gdGhlcmUuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkxhdW5jaGluZyBPdGhlciBUYXJnZXRzIj4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoMyBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iTGF1bmNoaW5nX090aGVyX1RhcmdldHMiPjwvYT5MYXVuY2hpbmcgT3RoZXIgVGFyZ2V0czwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5UbyBleGVjdXRlIGFwcGxpY2F0aW9ucyBmb3Igb3RoZXIgdGFyZ2V0cyBzdWNoIGFzIEFzY2FwZSBvciBTaW1waG9ueSwganVzdCByaWdodC1jbGljayBvbiB0aGUgbWV0YWFibSBtb2RlbCwgc2VsZWN0IFJ1biBBcy4uIGFuZCBwaWNrIHRoZSB0YXJnZXQgeW91IHdhbnQgdG8gbGF1bmNoLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywgd2UncmUgbGF1bmNoaW5nIEFzY2FwZSBmcm9tIHdpdGhpbiBhbiAuLmFzY2FwZSBwcm9qZWN0LjwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0aW9uL0xhdW5jaEFzY2FwZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8cD5UaGUgZXh0ZXJuYWwgdG9vbCB5b3UndmUgc2VsZWN0ZWQgd2lsbCB0aGVuIG9wZW4gaW50byBhIHNlcGFyYXRlIEphdmEgYXBwbGljYXRpb24uPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9leGVjdXRpb24vQXNjYXBlUnVubmluZy5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8cD4KKwkJCQkJCis8c3BhbiBjbGFzcz0iaXRhbGljIj5Ob3RlOjwvc3Bhbj4gcmVtZW1iZXIgdGhhdCB0aGUgbWVudSBvcHRpb25zIGFyZSBhY3RpdmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgYWN0dWFsbHkgc3VwcG9ydGVkIHdpdGhpbiBhIGdpdmVuIHByb2plY3QuIElmIHlvdSBhdHRlbXB0IHRvIFJ1biAoZXh0ZXJuYWwgdGFyZ2V0cykgb3IgRXhlY3V0ZSAoaW50ZXJuYWwgdGFyZ2V0cykgbW9kZWxzIGZyb20gYSBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGF0IHRhcmdldCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IhIAorCQkJCTwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9Ik1vZGVsIFBhcmFtZXRlcml6YXRpb24iPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgzIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJNb2RlbF9QYXJhbWV0ZXJpemF0aW9uIj48L2E+TW9kZWwgUGFyYW1ldGVyaXphdGlvbjwvaDM+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5Fc2NhcGUgcHJvdmlkZXMgZnVsbCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemF0aW9uIG9mIG1vZGVscy4gVGhpcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtYW55IHNldHMgb2YgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBtb2RlbCwgYWxsb3dpbmcgeW91IHRvIGRlY291cGxlIG1vZGVsIHJ1bnRpbWUgc2V0dGluZ3MgZnJvbSB0aGUgbW9kZWwgaXRzZWxmLiAoU3VwcG9ydCBmb3IgcGFyYW1ldGVyIHN3ZWVwcyBpcyBmb3J0aGNvbWluZy4pIFRvIGNyZWF0ZSBhIG5ldyBwYXJhbWV0ZXJpemF0aW9uLCByaWdodC1jbGljayBpbiB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gY3JlYXRlIHRoZSBwYXJhbWV0ZXIgZmlsZSwgYW5kIHNlbGVjdCAKKwkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+TmV3ICZndDsgUGFyYW1ldGVycyBGaWxlPC9zdHJvbmc+PC9zcGFuPi4KKwkJCQk8L3A+Cis8cD4KKwkJCQkJCis8L3A+Cis8ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3BhcmFtcy9DcmVhdGUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPHA+SW4gdGhlIHdpemFyZCB0aGF0IGZvbGxvd3MsIGdpdmUgeW91ciBwYXJhbWV0ZXIgZmlsZSBhIG5hbWU6PC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9wYXJhbXMvV2l6YXJkLnBuZyI+PC9kaXY+Cis8cD4KKwkJCQkKKzwvcD4KKzxwPlRoZSBlZGl0IHRoZSBmaWxlLiBTZWUgYmVsb3cgZm9yIGZpbGUgc3ludGF4LiBUaGUgcGFyYW1ldGVyIGVkaXRvciBoYXMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgY29kZS1jb21wbGV0aW9uLCBzeW50YXggaGlnaC1saWdodGluZyBhbmQgb3RoZXIgZWRpdG9yIGZlYXR1cmVzLjwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvcGFyYW1zL0VkaXQucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPHA+SW4gdGhlIGV4YW1wbGUgYmVsb3csIHdlJ3ZlIGNyZWF0ZWQgdHdvIHNlcGFyYXRlIHBhcmFtZXRlciBmaWxlcyBmb3IgdGhlIGVwaWRlbWljIG1vZGVsIHdpdGggZGlmZmVyZW50IHZhbHVlcyBmb3IgY29udGFjdCB0cmFuc21pc3Npb24gcHJvYmFiaWxpdHkuPC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9wYXJhbXMvRXhhbXBsZS5wbmciPjwvZGl2PgorPHA+CisJCQkJCis8L3A+Cis8cD5BcyB3aXRoIG90aGVyIHJ1bm5hYmxlIGZpbGVzLCB5b3UgY2FuIGxhdW5jaCBhIHBhcmFtZXRlciBmaWxlIHNpbXBseSBieSBzZWxlY3RpbmcgZXhlY3V0ZSBpbiB0aGUgcG9wdXAgbWVudSwgYXBwbGljYXRpb24gbWVudSBvciB0b29sYmFyLjwvcD4KKzxwPgorCQkJCQkKKzwvcD4KKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvcGFyYW1zL0V4ZWN1dGUucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IlN5bnRheCI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IlN5bnRheCI+PC9hPlN5bnRheDwvaDQ+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8cD5QYXJhbWV0ZXIgZmlsZXMgYXJlIHF1aXRlIHNpbXBsZS4gRXZlcnkgcGFyYW1ldGVyIGZpbGUgc3BlY2lmaWVzIHRoZSAibW9kZWwiIHRoYXQgd2lsbCBiZSBleGVjdXRlZC5UaGUgImluY29ycG9yYXRlcyIga2V5d29yZCBzdXBwb3J0cyBpbmNsdWRpbmcgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIG90aGVyIGZpbGVzLiBGaWxlIGxvY2F0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgZmlsZSwgYnV0IGl0IGlzIHVzdWFsbHkgbW9yZSBmbGV4aWJsZSB0byByZWZlciB0byBtb2RlbCBmaWxlcyByZWxhdGl2ZSB0byB0aGVpciBwcm9qZWN0IGxvY2F0aW9uLiBZb3UgY2FuIGRvIHRoYXQgYnkgaW5zZXJ0aW5nIGEgInwiIGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIG5hbWUuPC9wPgorPHA+QXR0cmlidXRlIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBhdHRyaWJ1dGUgSUQgKHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB1cHBlci1jYXNlKSBmb2xsb3dlZCBieSAiPSIgYW5kIHRoZSBkZXNpcmVkIHZhbHVlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgdGl0bGU9IkV4YW1wbGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGg0IGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJFeGFtcGxlXzIiPjwvYT5FeGFtcGxlPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPldlIGNhbiBjcmVhdGUgYSBiYXNlIHBhcmFtZXRlcnMgZmlsZSBjYWxsZWQgIkVwaUJhc2UuYXBhciIuPC9wPgorPGRpdiBjbGFzcz0ibGl0ZXJhbGxheW91dCI+Cis8cD5tb2RlbCZuYnNwOyJ8RXBpZGVtaWMubWV0YWFibSI8YnI+CitTdG9wUGVyaW9kPTUwMDxicj4KKworPC9wPgorPC9kaXY+Cis8cD5UaGlzIG1lYW5zIHRoYXQgd2UgZXhwZWN0IHRoZSBFcGlkZW1pYy5tZXRhYWJtIG1vZGVsIHRvIGJlIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LCBhbmQgd2Ugd2FudCB0aGUgbW9kZWwgdG8gc3RvcCBhdCBwZXJpb2QgNTAwLiBUaGVuIC0tIGluIHRoaXMgb3Zlcmx5IHNpbXBsZSBleGFtcGxlIC0tIHdlIGNvdWxkIGNyZWF0ZSB0d28gb3RoZXIgZmlsZXMsIEVwaUhpZ2hUcmFuc21pc3Npb24uYXBhcjo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPm1vZGVsJm5ic3A7InxFcGlkZW1pYy5tZXRhYWJtIjxicj4KK2luY29ycG9yYXRlcyZuYnNwOyJFcGlCYXNlLmFwYXIiPGJyPgorTWluQ29udGFjdFRyYW5zbWlzc2lvblByb2JhYmlsaXR5PTAuMDU8YnI+CitNYXhDb250YWN0VHJhbnNtaXNzaW9uUHJvYmFiaWxpdHk9MC4yPGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPmFuZCBFcGlMb3dUcmFuc21pc3Npb24uYXBhcjo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPm1vZGVsJm5ic3A7InxFcGlkZW1pYy5tZXRhYWJtIjxicj4KK2luY29ycG9yYXRlcyZuYnNwOyJFcGlCYXNlLmFwYXIiPGJyPgorTWluQ29udGFjdFRyYW5zbWlzc2lvblByb2JhYmlsaXR5PTAuMDxicj4KK01heENvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eT0wLjE1PGJyPgorCis8L3A+Cis8L2Rpdj4KKzxwPkJvdGggb2Ygd2hpY2ggcmVmZXJlbmNlIHRoZSBiYXNlIHNldCBvZiBwYXJhbWV0ZXJzIHdlJ3ZlIGp1c3QgZGVmaW5lZCBhbmQgYWRkIHJ1biBzcGVjaWZpYyB2YXJpYWJsZXMuIE5vdGUgdGhhdCB0aGUgaW5jb3Jwb3JhdGVzIHJlZmVyZW5jZSBpcyBhIHBhcmFtZXRlciBmaWxlIHJlbGF0aXZlIHJlZmVyZW5jZSBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgbW92ZSB0aGUgc2V0IG9mIHBhcmFtZXRlciBmaWxlcyB0byBhbnkgbG9jYXRpb24gd2Ugd2FudC4gV2l0aCB0aGVzZSB0d28gZmlsZXMgZGVmaW5lZCB3ZSBjYW4gY2xpY2sgb24gYm90aCBvZiB0aGVtIGF0IG9uY2UsIHNlbGVjdCB0aGUgRXhlY3V0ZSBidXR0b24gYW5kIGltbWVkaWF0ZWx5IGNvbXBhcmUgdGhlIHR3byB2YWx1ZXMuIChOb3Qgc2hvd24uKTwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTW9kZWwgVGVzdGluZyI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDMgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vZGVsX1Rlc3RpbmciPjwvYT5Nb2RlbCBUZXN0aW5nPC9oMz4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxwPk9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgYW5kIG92ZXItbG9va2VkIGFzcGVjdHMgb2YgbW9kZWxpbmcgaXMgdmVyaWZpY2F0aW9uLiBWZXJ5IGxvb3NlbHkgc3BlYWtpbmcsIG1vZGVsIAorCQkJCQk8c3BhbiBjbGFzcz0iaXRhbGljIj52YWxpZGF0aW9uPC9zcGFuPiBpcyB0aGUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgbW9kZWwgbWF0Y2hlcyB1cCB0byB0aGUgInJlYWwgd29ybGQiLiBNb2RlbCAKKwkJCQkJPHNwYW4gY2xhc3M9Iml0YWxpYyI+dmVyaWZpY2F0aW9uPC9zcGFuPiBpcyB0aGUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIHlvdXIgbW9kZWwgc3BlY2lmaWNhdGlvbiBtYXRjaGVzIHVwIHRvIHRoZSBtb2RlbCB5b3UndmUgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIEluIG90aGVyIHdvcmRzLCBkb2VzIHRoZSBtb2RlbCBkbyB3aGF0IHlvdSBzYXkgaXQgZG9lcz8KKwkJCQk8L3A+Cis8cD5UbyBoZWxwIHlvdSBhbnN3ZXIgdGhpcyBpbXBvcnRhbnQgcXVlc3Rpb24sIHRoZSBtb2RlbGluZyB0b29scyBpbmNsdWRlIHVuaXF1ZSBzdXBwb3J0IGZvciBhbiBhcHByb2FjaCB0byB2YWxpZGF0aW9uIGFuZCB2ZXJpZmljYXRpb24gY2FsbGVkICJ1bml0IHRlc3RpbmciLiBBIHRob3JvdWdoIGRpc2N1c3Npb24gaXMgZmFyIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwsIGJ1dCB0aGlzIGd1aWRlIHNob3VsZCBnaXZlIHlvdSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZ2V0IHRlc3RpbmcgeW91ciBvd24gbW9kZWxzLiBUZXN0aW5nIG1pZ2h0IHNlZW0gdGVkaW91cyB1dCBpdHMgYWN0dWFsbHkgYSByZWFsIHRpbWUgc2F2ZXIsIGJlY2F1c2UgeW91IGNhbiBxdWlja2x5IHJ1biBhIHNldCBvZiB0ZXN0cyB0byBlbnN1cmUgdGhhdCB5b3UgYSBuZXcgbW9kZWwgY2hhbmdlIGhhc24ndCBicm9rZW4gZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4gVGhpcyBwZWFjZSBvZiBtaW5kIGlzIHByaWNlbGVzcywgYW5kIG9uY2UgeW91IHN0YXJ0IHRlc3RpbmcsIHlvdSB3b24ndCBrbm93IGhvdyB5b3UgbGl2ZWQgd2l0aG91dCBpdCE8L3A+Cis8cD5UbyBjcmVhdGUgYSBuZXcgdGVzdCwgcmlnaHQtY2xpY2sgYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIHB1dCB0aGUgdGVzdCBmaWxlcy4gKE5vdCBzaG93bi4pIFRoZW4gd2UgY2FuIGVkaXQgdGhlIHRlc3QgZmlsZSB1c2luZyB0aGUgc3ludGF4IHNob3duIGJlbG93LiBJdCdzIGhlbHBmdWwgdG8ga2VlcCB0aGVtIG9yZ2FuaXplZCBpbiBzZXRzIG9mIGZvbGRlcnMuIFRvIGV4ZWN1dGUgYSB0ZXN0IG9yIHNldCBvZiB0ZXN0cywgc2ltcGx5IHNlbGVjdCB0aGUgdGVzdCBmaWxlcyBhbmQgY2xpY2sgIlRlc3QgT25jZSIgb3IgIlRlc3QgNSB0aW1lcyIgdG8gcnVuIGEgc2V0IG9mIGlkZW50aWNhbCB0ZXN0cy4gVGhlIGxhdHRlciBpcyB1c2VmdWwgZm9yIHN0b2NoYXN0aWMgdGVzdHMgaW4gd2hpY2ggdGVzdHMgbWF5IGNyZWF0ZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCByZXN1bHRzIGZvciB0aGUgc2FtZSByYW5kb20gc2VlZHMuIChXZSdsbCBwcm92aWRlIG1vcmUgb3B0aW9ucyBpbiBhIGZ1dHVyZSByZWxlYXNlLikgSWYgeW91IHNlbGVjdCBhbiBlbnRpcmUgZm9sZGVyLCB0aGUgZnJhbWV3b3JrIHdpbGwgcnVuIGFsbCBvZiB0aGUgdGVzdHMgaW4gdGhlIGZvbGRlci4gVGhpcyBwcm9jZXNzIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IGZvciBwYXJhbWV0ZXIgZmlsZXMsIHNvIHdlIHdvbid0IHNob3cgaXQgaGVyZS48L3A+Cis8cD5PbmNlIGEgdGVzdCBpcyBjb21wbGV0ZSwgYW4gImFyZXMiIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgInRlc3QtcmVzdWx0cyIgZm9sZGVyLiBUbyBzZWUgaG93IHlvdXIgdGVzdHMgZmFpcmVkLCBvcGVuIHRoZSAuYXJlcyBmaWxlLiBGb3IgdGhlIGV4YW1wbGUgdGVzdCBmaWxlIGJlbG93LCB3ZSBzaG91bGQgc2VlIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPHA+CisJCQkJCQorPC9wPgorPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPgorPGltZyBzcmM9ImltYWdlcy9wYXJhbXMvVGVzdFJlc3VsdHMucG5nIj48L2Rpdj4KKzxwPgorCQkJCQorPC9wPgorPHA+Tm90aWNlIHRoYXQgd2UgY2FuIHZpZXcgdGhlIGV4cGVjdGVkIHZhbHVlcyBhbmQgd2hlcmUgb3VyIHJlc3VsdHMgYWN0dWFsbHkgZmFsbC48L3A+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iU3ludGF4Ij4KKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8ZGl2PgorPGRpdj4KKzxoNCBjbGFzcz0idGl0bGUiPgorPGEgbmFtZT0iU3ludGF4XzIiPjwvYT5TeW50YXg8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+VGVzdCBmaWxlcyBhcmUgYWxzbyBwcmV0dHkgc2ltcGxlLiBJdCdzIGEgZ29vZCBpZGVhIHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCBzbyB5b3UgY2FuIHVuZGVyc3RhbmQgd2h5IHlvdSBjcmVhdGVkIGl0IGFuZCB3aGF0IGZlYXR1cmUgeW91J3JlIHRlc3RpbmcuIEp1c3QgcHV0IHF1b3RlIGNoYXJhY3RlcnMgYXJvdW5kIHlvdXIgZGVzY3JpcHRpb24uIFRoZW4sIHVzZSB0aGUgInRlc3RzIiBrZXl3b3JkIHRvIHNwZWNpZnkgd2hhdCBwYXJhbWV0ZXIgZmlsZSB5b3UnbGwgYmUgdXNpbmcuIEFnYWluIHlvdSBjYW4gdXNlIGZpbGUgb3IgcHJvamVjdCByZWxhdGl2ZSByZWZlcmVuY2VzLiBZb3UgZG9uIG5vdCBzcGVjaWZ5IGEgbW9kZWwgaGVyZSAtLSB0aGF0J3MgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSAiY29udGFpbnMiIGtleXdvcmQganVzdCBsaWtlIHRoZSBpbmNvcnBvcmF0ZXMga2V5d29yZCBmb3IgcGFyYW1ldGVyIGZpbGVzLCB0byBzcGVjaWZ5IGEgc2V0IG9mIHRlc3QgY29uc3RyYWludHMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHdpdGggdGhlIG5ldyB0ZXN0cyB5b3UndmUgZGVmaW5lZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluY2x1ZGluZyBhIHNlcmllcyBvZiAic2FuaXR5IGNoZWNrcyIgd2l0aCBvdGhlciB0ZXN0cy4gVGhlbiB5b3Ugc3BlY2lmeSB0aGUgdGVzdCBjb25zdHJhaW50cyB0aGVtc2VsdmVzLiBUaGlzIHVzZXMgdGhlIGZvbGxvd2luZyBmb3JtOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+e01lYXN1cmV9KHtUZXN0ZWRBdHRyaWJ1dGV9KSZuYnNwOz0mbmJzcDtbe01pbmltdW1Db25zdHJhaW50fSwmbmJzcDt7TWF4aW11bUNvbnN0cmFpbnR9XTxicj4KKworPC9wPgorPC9kaXY+Cis8cD5UaGUgbWVhc3VyZXMgYXZhaWxhYmxlIGFyZSBBdmVyYWdlLCBNaW5pbXVtLCBNYXhpbXVtIENvdW50IGFuZCBTdW0uIEluIG9yZGVyIGZvciBhbiBhdHRyaWJ1dGUgdG8gYmUgdGVzdGVkIHRoZSAiZ2F0aGVyIGRhdGEiIHZhbHVlIG11c3QgYmUgc2V0IGZvciB0aGF0IGF0dHJpYnV0ZS4gQWxsIE1lYXN1cmVzIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIGFsbCBhdHRyaWJ1dGUgdHlwZXMuIEJvb2xlYW5zLCBTeW1ib2xzIGFuZCBTdGF0ZXMgc2hvdWxkIG9ubHkgdXNlIHRoZSBDb3VudCBtZWFzdXJlIGFzIHRoZXkgcmVwcmVzZW50IGRpc2NyZXRlIHZhbHVlcyB0aGF0IGNhbiBlaXRoZXIgbWVldCBzb21lIGNvbmRpdGlvbiBvciBub3QuPC9wPgorPHA+VGhlIHRlc3RlZCBhdHRyaWJ1dGVzIGFyZSBxdWFsaWZpZWQgYnkgdGhlaXIgbW9kZWwgYWdlbnQgZGVmaW5pdGlvbi4gVGhlIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiBpcyBpbmNsdXNpdmUsIGFzIGltcGxpZWQgYnkgdGhlIHNxdWFyZSBicmFja2V0cy4gRnV0dXJlIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gcHJvdmlkZSByaWNoZXIgZXhwcmVzc2lvbnMgYW5kIGNvbnN0cmFpbnRzIGJ1dCBhIHZlcnkgd2lkZSByYW5nZSBvZiBjYXNlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgY29uc3RydWN0LCBlc3BlY2lhbGx5IHdoZW4gY29tYmluZWQgd2l0aCBkZXJpdmVkIGF0dHJpYnV0ZXMuIFRlc3RlZCBBdHRyaWJ1dGVzIGFyZSBhZ2FpbiBzcGVjaWZpZWQgYnkgdGhlIGF0dHJpYnV0ZSBJRCAod2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHVwcGVyLWNhc2UpIGZvbGxvd2VkIGJ5ICI9IiBhbmQgdGhlIGRlc2lyZWQgdmFsdWUuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iRXhhbXBsZSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9IkV4YW1wbGVfMyI+PC9hPkV4YW1wbGU8L2g0PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPHA+SW4gdGhlIGZvbGxvd2luZyBzaW1wbGUgZXhhbXBsZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFuIGVwaWRlbWljIGNhbid0IG9jY3VyIHdpdGhvdXQgZGlzZWFzZSB0cmFuc21pc3Npb24gdGFraW5nIHBsYWNlLiBIZXJlIHdlJ3JlIGp1c3QgbG9va2luZyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHNvbWUgdmVyeSBiYXNpYyBsb2dpYyByaWdodC4gKFRoaXMgbWlnaHQgYmUgYWxtb3N0IHRvbyBzaW1wbGUgZm9yIGEgcmVhbC13b3JsZCBkZXNpZ24sIGRlcGVuZGluZyBvbiBob3cgcmlnb3JvdXMgd2Ugd2FudCB0byBiZS4pIE5vdGUgdGhhdCBzb21lIGluZGl2aWR1YWxzIGFyZSBpbmZlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb2RlbCBydW4gc28gd2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGF0IGluIG91ciBleHBlY3RlZCByZXN1bHRzLiBTbyBmaXJzdCB3ZSBoYXZlIGRlZmluZWQgdGhlIEVwaVplcm9UcmFuc21pc3Npb24uYXBhciBmaWxlIGxpa2UgdGhlIG90aGVyIHRyYW5zbWlzc2lvbiByYXRlIHBhcmFtZXRlcml6YXRpb25zIGFib3ZlIGV4Y2VwdCB3aXRoIHRoZXNlIHNldHRpbmdzOjwvcD4KKzxkaXYgY2xhc3M9ImxpdGVyYWxsYXlvdXQiPgorPHA+TWluQ29udGFjdFRyYW5zbWlzc2lvblByb2JhYmlsaXR5PTAuMDxicj4KK01heENvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eT0wLjA8YnI+CisKKzwvcD4KKzwvZGl2PgorPHA+VGhlbiB3ZSBkZWZpbmUgb3VyIFplcm9UcmFuc21pc3Npb24uYXRlc3QgZmlsZTo8L3A+Cis8ZGl2IGNsYXNzPSJsaXRlcmFsbGF5b3V0Ij4KKzxwPiJUZXN0Jm5ic3A7dGhhdCZuYnNwO25vJm5ic3A7ZGlzZWFzZSZuYnNwO3RyYW5zbWlzc2lvbiZuYnNwO29jY3VycyZuYnNwO3dpdGgmbmJzcDtjb250YWN0Jm5ic3A7dHJhbnNtaXNzaW9uJm5ic3A7c2V0Jm5ic3A7dG8mbmJzcDswLiI8YnI+Cit0ZXN0cyZuYnNwOyJ8cGFyYW1zL0VwaVplcm9UcmFuc21pc3Npb24uYXBhciI8YnI+CitDb3VudChJbmRpdmlkdWFsLlN0YXR1cz1EZWFkKSZuYnNwOz0mbmJzcDtbMCw1XTxicj4KK0NvdW50KEluZGl2aWR1YWwuU3RhdHVzPUV4cG9zZWQpJm5ic3A7PSZuYnNwO1swLDEwXTxicj4KK0NvdW50KEluZGl2aWR1YWwuU3RhdHVzPVN5bXB0b21JbmZlY3Rpb3VzKT1bMCwwXTxicj4KKworPC9wPgorPC9kaXY+Cis8cD5IZXJlIHdlIGhhdmUgYSBuaWNlIGRlc2NyaXB0aW9uLCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyYW1ldGVyaXphdGlvbiB3ZSB3YW50IHRvIHVzZSwgYW5kIHRoZW4gdGhlIHNldCBvZiBjb25zdHJhaW50cyB3ZSB3aWxsIGFwcGx5IHRvIHRoZW0uIEFmdGVyIHJ1bm5pbmcgdGhpcyB0ZXN0LCBhIHRlc3QgcmVzdWx0IGZpbGUgbGlrZSB0aGUgb25lIGFib3ZlIHdpbGwgYmUgY3JlYXRlZCBhbmQgcGxhY2VkIGluIG91ciAidGVzdC1yZXN1bHRzIiBkaXJlY3RvcnkuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiB0aXRsZT0iTW9kZWwgRGF0YSI+Cis8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPgorPGRpdj4KKzxkaXY+Cis8aDQgY2xhc3M9InRpdGxlIj4KKzxhIG5hbWU9Ik1vZGVsX0RhdGEiPjwvYT5Nb2RlbCBEYXRhPC9oND4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzx0YWJsZSBpZD0iTjExMDFBIj4KKzx0cj4KKwkJCQkJCQkKKzx0ZD5BcyBkaXNjdXNzZWQgYWJvdmUsIHlvdSBjYW4gY29sbGVjdCBkYXRhIGZvciBhbnkgbW9kZWwgYnkgc2VsZWN0aW5nIGl0IG9yIGEgcGFyYW10ZXJzIGZpbGUgYW5kIGNsaWNraW5nIHRoZSAiRXhlY3V0ZSBNb2RlbCB3aXRoIGRhdGEgY29sbGVjdGlvbiIgYnV0dG9uLiBJZiB5b3UgdXNlIGEgcGFyYW1ldGVycyBmaWxlIHNldHRpbmcgdGhlIFN0b3BQZXJpb2QgcGFyYW1ldGVyIHdpbGwgY2F1c2UgdGhlIG1vZGVsIHRvIHN0b3AgZXhlY3V0aW5nIGFuZCBzYXZlIHRoZSBtb2RlbCBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuIE9yIHlvdSBjYW4gc3RvcCB0aGUgbW9kZWwgbWFudWFsbHkuIFRoZSBtb2RlbCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkIGludG8gYW4gImFkYXRhIiBmaWxlIGFuZCBzdG9yZWQgaW4gdGhlICJvdXRwdXQiIGRpcmVjdG9yeSBpbiB5b3VyIHByb2plY3QuIEEgbmV3IHJ1biBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggZXhlY3V0aW9uIG9mIGEgbW9kZWwuIFdlIGFyZSBjdXJyZW50bHkgZGV2ZWxvcGluZyB0b29scyBmb3IgZXhwb3J0aW5nIHRoaXMgZGF0YSB0byB2YXJpb3VzIGZpbGUgZm9ybWF0cyBhcyB3ZWxsIGFzIHByb3ZpZGluZyBtb3JlIHNlZW1sZXNzIGludGVncmF0aW9uIHRvIHNvcGhpc3RpY2F0ZWQgRWNsaXBzZSBob3N0ZWQgY2hhcnRpbmcgYW5kIHJlcG9ydCB0b29scy4gWW91IGNhbiB1c2UgQklSVCB0byBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIHNldCB1c2luZyBhbiBYTUwgc2NoZW1hIGRhdGEgc291cmNlIGFuZCB0aGVyZSBpcyBhbHNvIGFuIEVjb3JlIGRyaXZlciBhdmFpbGFibGUuIE1vZGVsIGRhdGEgY2FuIGFsc28gYmUgcHJvZHVjZWQgYnkgd3JpdGluZyBjdXN0b20gdmlld3MgZm9yIGRhdGEgb3V0cHV0LiBTZWUgdGhlIEFzY2FwZSBwcm9ncmFtbWVyIGd1aWRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkbyB0aGF0LjwvdGQ+CisJCQkJCQkJPHRkPgorCQkJCQkJCQkKKzxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0Ij4KKzxpbWcgc3JjPSJpbWFnZXMvZGF0YS9FZGl0b3IucG5nIj48L2Rpdj4KKwkJCQkJCQkKKzwvdGQ+CisJCQkJCQkKKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJuYXZmb290ZXIiPgorPGhyPgorPHRhYmxlIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIiB3aWR0aD0iMTAwJSI+Cis8dHI+Cis8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sIj5QcmV2PC9hPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+PHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7PGEgYWNjZXNza2V5PSJuIiBocmVmPSJUdXRvcmlhbHMuaHRtbCI+TmV4dDwvYT48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCUiPkNoYXB0ZXImbmJzcDsyLiZuYnNwO01vZGVsZXIgR3VpZGUmbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjQwJSI+Jm5ic3A7Q2hhcHRlciZuYnNwOzQuJm5ic3A7VHV0b3JpYWxzPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9hbXAuaHRtbCBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2FtcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9hbXAuaHRtbApAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2Jvb2suY3NzIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvYm9vay5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5NTAzZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2Jvb2suY3NzCkBAIC0wLDAgKzEsMjU2IEBACisubGl0ZXJhbGxheW91dCAuY29kZSB7CisJZGlzcGxheTogYmxvY2s7CisJYm9yZGVyOiAxcHggc29saWQgZ3JheTsKKwltYXJnaW46IDFlbTsKKwlwYWRkaW5nOiAxZW07CisJYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKK30KKworY29kZSB7CisJZGlzcGxheTogaW5saW5lOworfQorCitwcmUucHJvZ3JhbWxpc3RpbmcgeworCWRpc3BsYXk6IGJsb2NrOworCXRleHQtYWxpZ246IGxlZnQ7CisJdGV4dC1pbmRlbnQ6IDAuMDBwdDsKKwltYXJnaW4tdG9wOiAwLjAwMDAwMHB0OworCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7CisJbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OworCW1hcmdpbi1sZWZ0OiAxNXB0OworCWZvbnQtc2l6ZTogMTAuMDAwMDAwcHQ7CisJZm9udC13ZWlnaHQ6IG1lZGl1bTsKKwlmb250LXN0eWxlOiBSZWd1bGFyOworCWNvbG9yOiAjNDQ0NENDOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisJdGV4dC10cmFuc2Zvcm06IG5vbmU7CisJZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7Cit9CisKK1AuQ29kZSB7CisJZGlzcGxheTogYmxvY2s7CisJdGV4dC1hbGlnbjogbGVmdDsKKwl0ZXh0LWluZGVudDogMC4wMHB0OworCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7CisJbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsKKwltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7CisJbWFyZ2luLWxlZnQ6IDE1cHQ7CisJZm9udC1zaXplOiAxMC4wMDAwMDBwdDsKKwlmb250LXdlaWdodDogbWVkaXVtOworCWZvbnQtc3R5bGU6IFJlZ3VsYXI7CisJY29sb3I6ICM0NDQ0Q0M7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKwl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKKwlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsKK30KKworSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7CisJZGlzcGxheTogYmxvY2s7CisJdGV4dC1hbGlnbjogbGVmdDsKKwl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKKwltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OworCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OworCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKKwltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKKwlmb250LXNpemU6IDkuMDAwMDAwcHQ7CisJZm9udC13ZWlnaHQ6IG1lZGl1bTsKKwlmb250LXN0eWxlOiBJdGFsaWM7CisJY29sb3I6ICMwMDAwMDA7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKwl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKKwlmb250LWZhbWlseTogIkFyaWFsIjsKK30KKworUC5Ob3RlIHsKKwlkaXNwbGF5OiBibG9jazsKKwl0ZXh0LWFsaWduOiBsZWZ0OworCXRleHQtaW5kZW50OiAwcHQ7CisJbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7CisJbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7CisJbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OworCW1hcmdpbi1sZWZ0OiAzMHB0OworCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7CisJZm9udC13ZWlnaHQ6IG1lZGl1bTsKKwlmb250LXN0eWxlOiBJdGFsaWM7CisJY29sb3I6ICMwMDAwMDA7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKwl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKKwlmb250LWZhbWlseTogIkFyaWFsIjsKK30KKworRU0uVUlMYWJlbCB7CisJZm9udC13ZWlnaHQ6IEJvbGQ7CisJZm9udC1zdHlsZTogUmVndWxhcjsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworCXRleHQtdHJhbnNmb3JtOiBub25lOworfQorCitFTS5Db2RlTmFtZSB7CisJZm9udC13ZWlnaHQ6IEJvbGQ7CisJZm9udC1zdHlsZTogUmVndWxhcjsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworCXRleHQtdHJhbnNmb3JtOiBub25lOworCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOworfQorCitTUEFOLk5vV3JhcCB7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovCitib2R5LGgxLGgyLGgzLGg0LGg1LGg2LHAsdGFibGUsdGQsY2FwdGlvbix0aCx1bCxvbCxkbCxsaSxkZCxkdCB7CisJZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJY29sb3I6ICMwMDAwMDAKK30KKworcHJlIHsKKwlmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlCit9CisKKy8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovCisJLyogZm9sbG93aW5nIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIE9LIGZvciBEQkNTICovCitib2R5LGgxLGgyLGgzLGg0LGg1LGg2LHAsdGFibGUsdGQsY2FwdGlvbix0aCx1bCxvbCxkbCxsaSxkZCxkdCB7CisJZm9udC1zaXplOiAxMHB0OworfQorCitwcmUgeworCWZvbnQtc2l6ZTogMTBwdAorfQorCisvKiBlbmQgZm9udCBzaXplIGRlY2xhcmF0aW9ucyAqLworYm9keSB7CisJYmFja2dyb3VuZDogI0ZGRkZGRgorfQorCitoMSB7CisJZm9udC1zaXplOiAxOHB0OworCW1hcmdpbi10b3A6IDU7CisJbWFyZ2luLWJvdHRvbTogMQorfQorCitoMiB7CisJZm9udC1zaXplOiAxNXB0OworCW1hcmdpbi10b3A6IDI1OworCW1hcmdpbi1ib3R0b206IDMKK30KKworaDMgeworCWZvbnQtc2l6ZTogMTNwdDsKKwltYXJnaW4tdG9wOiAyMDsKKwltYXJnaW4tYm90dG9tOiAzCit9CisKK2g0IHsKKwlmb250LXNpemU6IDExcHQ7CisJbWFyZ2luLXRvcDogMjA7CisJbWFyZ2luLWJvdHRvbTogMzsKKwlmb250LXN0eWxlOiBpdGFsaWMKK30KKworaDUgeworCWZvbnQtc2l6ZTogOXB0OworCW1hcmdpbi10b3A6IDIwOworCW1hcmdpbi1ib3R0b206IDM7Cit9CisKK2g2IHsKKwlmb250LXNpemU6IDhwdDsKKwltYXJnaW4tdG9wOiAyMDsKKwltYXJnaW4tYm90dG9tOiAzOworCWNvbG9yOiAjMEYwRkExCit9CisKK3AgeworCW1hcmdpbi10b3A6IDEwcHg7CisJbWFyZ2luLWJvdHRvbTogMTBweAorfQorCitwcmUgeworCW1hcmdpbi1sZWZ0OiA2OworCWZvbnQtc2l6ZTogOXB0Cit9CisKK2E6bGluayB7CisJY29sb3I6ICMwMDAwRkYKK30KKworYTpob3ZlciB7CisJY29sb3I6ICMwMDAwODAKK30KKworYTp2aXNpdGVkIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQorfQorCit1bCB7CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAxMAorfQorCitsaSB7CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAwCit9CisKK2xpIHAgeworCW1hcmdpbi10b3A6IDA7CisJbWFyZ2luLWJvdHRvbTogMAorfQorCitvbCB7CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAxMAorfQorCitkbCB7CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAxMAorfQorCitkdCB7CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAwOworCWZvbnQtd2VpZ2h0OiBib2xkCit9CisKK2RkIHsKKwltYXJnaW4tdG9wOiAwOworCW1hcmdpbi1ib3R0b206IDAKK30KKworc3Ryb25nIHsKKwlmb250LXdlaWdodDogYm9sZAorfQorCitlbSB7CisJZm9udC1zdHlsZTogaXRhbGljCit9CisKK3ZhciB7CisJZm9udC1zdHlsZTogaXRhbGljCit9CisKK2Rpdi5yZXZpc2lvbiB7CisJYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOworCWJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOworCWJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOworCXBhZGRpbmctbGVmdDogNQorfQorCit0aCB7CisJZm9udC13ZWlnaHQ6IGJvbGQKK30KKwordGQgeworCXZlcnRpY2FsLWFsaWduOiB0b3AKK30KKworeHh0ZHsKKwlib3JkZXItdG9wOjJweCBzb2xpZCBibGFjazsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvNjAwcHgtTWV0YUFCTVN0cnVjdHVyZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvNjAwcHgtTWV0YUFCTVN0cnVjdHVyZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMTg5OAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy82MDBweC1NZXRhQUJNU3RydWN0dXJlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvQU1QQXJjaGl0ZWN0dXJlRGlhZ3JhbS5qcGcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvQU1QQXJjaGl0ZWN0dXJlRGlhZ3JhbS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZDA2NQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9BTVBBcmNoaXRlY3R1cmVEaWFncmFtLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvQU1QTG9nby5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvQU1QTG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNTI2MgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9BTVBMb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvRXNjYXBlRXhlY3V0aW9uU2NyZWVuc2hvdC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvRXNjYXBlRXhlY3V0aW9uU2NyZWVuc2hvdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzYTI0MgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9Fc2NhcGVFeGVjdXRpb25TY3JlZW5zaG90LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvV2lraUV4YW1wbGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL1dpa2lFeGFtcGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAwZjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL1dpa2lFeGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQmxvY2tzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNCbG9ja3MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGE4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQmxvY2tzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQ29tcGxleExvZ2ljLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNDb21wbGV4TG9naWMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzRjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQ29tcGxleExvZ2ljLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQ29tcGxleExvZ2ljTm9Pci5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zQ29tcGxleExvZ2ljTm9Pci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMzYwNgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNDb21wbGV4TG9naWNOb09yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRGlhZ3JhbS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRGlhZ3JhbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViMTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNEaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRGlhZ3JhbTgwMC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRGlhZ3JhbTgwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNEaWFncmFtODAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmOTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNFeGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZU5ldy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRXhhbXBsZU5ldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4MTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNFeGFtcGxlTmV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRmxvd1NpbXBsZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRmxvd1NpbXBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiYWY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNGbG93U2ltcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRmxvd1VuaW9uLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNGbG93VW5pb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWU1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zRmxvd1VuaW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnkxMUEucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5MTFBLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM3NDVmCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5MTFBLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnkyLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNTZWxCb3VuZGFyeTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTllNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnkyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnkyUGFydHMucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5MlBhcnRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGZmZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5MlBhcnRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnlDb21wbGV4LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNTZWxCb3VuZGFyeUNvbXBsZXgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlM2EzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnlDb21wbGV4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VsQm91bmRhcnlTaW1wbGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5U2ltcGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZiNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlbEJvdW5kYXJ5U2ltcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2VxdWVuY2UucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlcXVlbmNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDliMzVhCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NlcXVlbmNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2ltcGxlTXVsdGlwbGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NpbXBsZU11bHRpcGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzMyOTZiCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NpbXBsZU11bHRpcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2ltcGxlU2VxdWVuY2UucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NpbXBsZVNlcXVlbmNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ3MWFmCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1NpbXBsZVNlcXVlbmNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2ltcGxlU2VxdWVuY2UyLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNTaW1wbGVTZXF1ZW5jZTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODk3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zU2ltcGxlU2VxdWVuY2UyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZzFBLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNXZWF2aW5nMUEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGQyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZzFBLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZzIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmcyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0NjZmCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmcyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZ0NvbXBsZXhRdWVyeS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZ0NvbXBsZXhRdWVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNjFkOQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNXZWF2aW5nQ29tcGxleFF1ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZ0V2YWx1YXRlLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9hY3Rpb25zL0FjdGlvbnNXZWF2aW5nRXZhbHVhdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mjk4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZ0V2YWx1YXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvYWN0aW9ucy9BY3Rpb25zV2VhdmluZ1NldEFub3RoZXIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmdTZXRBbm90aGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGEyY2FhCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2FjdGlvbnMvQWN0aW9uc1dlYXZpbmdTZXRBbm90aGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZGF0YS9FZGl0b3IucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2RhdGEvRWRpdG9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTY2YzNlCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2RhdGEvRWRpdG9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDBQZXJzcGVjdGl2ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDBQZXJzcGVjdGl2ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMFBlcnNwZWN0aXZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDBQZXJzcGVjdGl2ZTIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwwUGVyc3BlY3RpdmUyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTYyMDlmCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwwUGVyc3BlY3RpdmUyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg5NTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEwQWdlbnRDb3VudC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEwQWdlbnRDb3VudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhNWY4YgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTBBZ2VudENvdW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDExQnVpbGRBZ2VudHMucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxMUJ1aWxkQWdlbnRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU2ODIxCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxMUJ1aWxkQWdlbnRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEyQnVpbGRHcmlkLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTJCdWlsZEdyaWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTAzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEyQnVpbGRHcmlkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEzQnVpbGRHcmlkQWdlbnRzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTNCdWlsZEdyaWRBZ2VudHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDEzQnVpbGRHcmlkQWdlbnRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE0QnVpbGRHcmlkUGFyYW1zLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTRCdWlsZEdyaWRQYXJhbXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmRjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE0QnVpbGRHcmlkUGFyYW1zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE1Q3JlYXRlSW5pdGlhbGl6ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE1Q3JlYXRlSW5pdGlhbGl6ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0YzRkNQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTVDcmVhdGVJbml0aWFsaXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE2NVNlbGVjdDIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxNjVTZWxlY3QyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFjOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxNjVTZWxlY3QyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE2Q3JlYXRlU2VsZWN0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTZDcmVhdGVTZWxlY3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzhmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE2Q3JlYXRlU2VsZWN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE3Q3JlYXRlUXVlcnkucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxN0NyZWF0ZVF1ZXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU1NTNkCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwxN0NyZWF0ZVF1ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE4UXVlcnlGdW5jdGlvbi5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE4UXVlcnlGdW5jdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMThRdWVyeUZ1bmN0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE5TW92ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDE5TW92ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyM2JlNQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMTlNb3ZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFhMTliCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIwRXhlY3V0ZU1vZGVsLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjBFeGVjdXRlTW9kZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzI1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIwRXhlY3V0ZU1vZGVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIxRXhlY3V0ZTIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMUV4ZWN1dGUyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTJhZmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMUV4ZWN1dGUyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIyQ3JlYXRlU3R5bGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMkNyZWF0ZVN0eWxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmUwM2UwCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyMkNyZWF0ZVN0eWxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIzQ3JlYXRlU3R5bGVSdWxlLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjNDcmVhdGVTdHlsZVJ1bGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDIzQ3JlYXRlU3R5bGVSdWxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI0RXZhbHVhdGlvbkZ1bmN0aW9uLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjRFdmFsdWF0aW9uRnVuY3Rpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2Q2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI0RXZhbHVhdGlvbkZ1bmN0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI1RmluaXNoU3R5bGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyNUZpbmlzaFN0eWxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWViOGMxCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwyNUZpbmlzaFN0eWxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI2Q3JlYXRlUXVlcnkyLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjZDcmVhdGVRdWVyeTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzRiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI2Q3JlYXRlUXVlcnkyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI3Tm9WYWx1ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI3Tm9WYWx1ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0YTg2OAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjdOb1ZhbHVlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI4Q3JlYXRlQXR0cmlidXRlLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjhDcmVhdGVBdHRyaWJ1dGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODIyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI4Q3JlYXRlQXR0cmlidXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI5QXR0cmlidXRlVmFsdWVzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMjlBdHRyaWJ1dGVWYWx1ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWJlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDI5QXR0cmlidXRlVmFsdWVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMwQXR0cmlidXRlSW5wdXQucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzMEF0dHJpYnV0ZUlucHV0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc1MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzMEF0dHJpYnV0ZUlucHV0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMxSW50ZXJzZWN0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMzFJbnRlcnNlY3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmNhODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMxSW50ZXJzZWN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMySW50ZXJzZWN0QWRkLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMzJJbnRlcnNlY3RBZGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmQyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMySW50ZXJzZWN0QWRkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMzTW92ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDMzTW92ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjMGZjYQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsMzNNb3ZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDM0UnVuRmluYWwucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzNFJ1bkZpbmFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWVmNDVkCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2VkaXRfdHV0b3JpYWwvU2ltcGxlVHV0b3JpYWwzNFJ1bkZpbmFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDNDcmVhdGVNb2RlbC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDNDcmVhdGVNb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZjRiZgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsM0NyZWF0ZU1vZGVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDRDcmVhdGVNb2RlbC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDRDcmVhdGVNb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViMmRhMAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsNENyZWF0ZU1vZGVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDVDcmVhdGVQYWdlMi5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDVDcmVhdGVQYWdlMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4OTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsNUNyZWF0ZVBhZ2UyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDZDcmVhdGVBZ2VudC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDZDcmVhdGVBZ2VudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMmE0OQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsNkNyZWF0ZUFnZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDZOYW1lQnVnLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsNk5hbWVCdWcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWFlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDZOYW1lQnVnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDdDcmVhdGVHcmlkLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsN0NyZWF0ZUdyaWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwM2EyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDdDcmVhdGVHcmlkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDhHcmlkUGFyYW1ldGVycy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDhHcmlkUGFyYW1ldGVycy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ZWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsOEdyaWRQYXJhbWV0ZXJzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDlHcmlkRGltcy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZWRpdF90dXRvcmlhbC9TaW1wbGVUdXRvcmlhbDlHcmlkRGltcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNWY4NAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9lZGl0X3R1dG9yaWFsL1NpbXBsZVR1dG9yaWFsOUdyaWREaW1zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhhbXBsZXMvRXBpZGVtaWNSZWdpb25hbC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhhbXBsZXMvRXBpZGVtaWNSZWdpb25hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhOGM2MwotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGFtcGxlcy9FcGlkZW1pY1JlZ2lvbmFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhhbXBsZXMvRXBpZGVtaWNSZWdpb25hbFJ1bi5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhhbXBsZXMvRXBpZGVtaWNSZWdpb25hbFJ1bi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNWFjZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGFtcGxlcy9FcGlkZW1pY1JlZ2lvbmFsUnVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0Fib3V0Vmlldy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0Fib3V0Vmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMDcyZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vQWJvdXRWaWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0FnZW50TmF2aWdhdG9yLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vQWdlbnROYXZpZ2F0b3IucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjE1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0FnZW50TmF2aWdhdG9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0FyZWFDaGFydC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0FyZWFDaGFydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NDE4MAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vQXJlYUNoYXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0FzY2FwZVJ1bm5pbmcucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9Bc2NhcGVSdW5uaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJkNTFkCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9Bc2NhcGVSdW5uaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0JhckNoYXJ0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vQmFyQ2hhcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjI3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0JhckNoYXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljMkRWaWV3LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWMyRFZpZXcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjNjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljMkRWaWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljM0QucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pYzNELnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ2OTBiCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pYzNELnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljQ2hhcnRDdXN0b21pemUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pY0NoYXJ0Q3VzdG9taXplLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTNmMmZlCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pY0NoYXJ0Q3VzdG9taXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljQ2hhcnRPcHRpb25zLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNDaGFydE9wdGlvbnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNGFkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljQ2hhcnRPcHRpb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljRXhlY05ldy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljRXhlY05ldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjMTMzZQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNFeGVjTmV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxBZ2VudFByb3BlcnRpZXMucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pY01vZGVsQWdlbnRQcm9wZXJ0aWVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTYwY2YzCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9FcGlkZW1pY01vZGVsQWdlbnRQcm9wZXJ0aWVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxDb21wYXJpc29uLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbENvbXBhcmlzb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmU1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxDb21wYXJpc29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxDb250cm9scy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxDb250cm9scy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YjM3YQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbENvbnRyb2xzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxQcm9wZXJ0aWVzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbFByb3BlcnRpZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTljZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxQcm9wZXJ0aWVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxSdW5uaW5nLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXBpZGVtaWNNb2RlbFJ1bm5pbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzA5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0VwaWRlbWljTW9kZWxSdW5uaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0V4ZWNDb250cm9sLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vRXhlY0NvbnRyb2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMmIwODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0V4ZWNDb250cm9sLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0xhdW5jaEFzY2FwZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0xhdW5jaEFzY2FwZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NzMyNgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vTGF1bmNoQXNjYXBlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0xpbmVDaGFydC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL0xpbmVDaGFydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNDI3MwotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vTGluZUNoYXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL01vZGVsTWFuYWdlci5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL01vZGVsTWFuYWdlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxMzA4YQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vTW9kZWxNYW5hZ2VyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1BpZUNoYXJ0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vUGllQ2hhcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjZhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1BpZUNoYXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1NsaWRlckxlZnQucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9TbGlkZXJMZWZ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjE5NzE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9TbGlkZXJMZWZ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1NsaWRlclJpZ2h0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vU2xpZGVyUmlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTRmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1NsaWRlclJpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXczRC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXczRC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MDAyNAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlldzNELnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXczRE1lbnVCYXIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3M0RNZW51QmFyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQxYzdhCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3M0RNZW51QmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiODdiMgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaERvd24ucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3R3JhcGhEb3duLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY3YzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3R3JhcGhEb3duLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaE1lbnVCYXIucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3R3JhcGhNZW51QmFyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmI3ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2V4ZWN1dGlvbi9WaWV3R3JhcGhNZW51QmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFJhZGlhbC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFJhZGlhbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlZDdjNgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoUmFkaWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFJpZ2h0LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoUmlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmVmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFJpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFNwcmluZy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFNwcmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ZDAzMQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoU3ByaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFNwcmluZ0RpYWxvZy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZXhlY3V0aW9uL1ZpZXdHcmFwaFNwcmluZ0RpYWxvZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZThkNgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9leGVjdXRpb24vVmlld0dyYXBoU3ByaW5nRGlhbG9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbi5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5OGVjNQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9mdW5jdGlvbnMvRGlzdHJpYnV0aW9uRGVzaWduLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbkNob2ljZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0Rpc3RyaWJ1dGlvbkRlc2lnbkNob2ljZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NjJjZQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9mdW5jdGlvbnMvRGlzdHJpYnV0aW9uRGVzaWduQ2hvaWNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0Z1bmN0aW9uc0RpYWdyYW0ucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2Z1bmN0aW9ucy9GdW5jdGlvbnNEaWFncmFtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzRhN2RlCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL2Z1bmN0aW9ucy9GdW5jdGlvbnNEaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0dyYXBoaWNzRnVuY3Rpb25FeGFtcGxlRGVzaWduLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9mdW5jdGlvbnMvR3JhcGhpY3NGdW5jdGlvbkV4YW1wbGVEZXNpZ24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjUyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0dyYXBoaWNzRnVuY3Rpb25FeGFtcGxlRGVzaWduLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0dyYXBoaWNzRnVuY3Rpb25FeGFtcGxlUnVuLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9mdW5jdGlvbnMvR3JhcGhpY3NGdW5jdGlvbkV4YW1wbGVSdW4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjMwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvZnVuY3Rpb25zL0dyYXBoaWNzRnVuY3Rpb25FeGFtcGxlUnVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL0NyZWF0ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL0NyZWF0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhMzU2NAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9wYXJhbXMvQ3JlYXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL0VkaXQucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FZGl0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlkNTZiCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FZGl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL0V4YW1wbGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FeGFtcGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEzYTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FeGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL0V4ZWN1dGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FeGVjdXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjY4ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3BhcmFtcy9FeGVjdXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL1Rlc3RSZXN1bHRzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9wYXJhbXMvVGVzdFJlc3VsdHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTg0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL1Rlc3RSZXN1bHRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL1dpemFyZC5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcGFyYW1zL1dpemFyZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3NjZiYgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9wYXJhbXMvV2l6YXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3ZjJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9wb2pvL1Byb2dyYW1taW5nUG9qb0dlbmVyYXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZUNvZGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Bvam8vUHJvZ3JhbW1pbmdQb2pvR2VuZXJhdGVDb2RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdlMzVlCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Bvam8vUHJvZ3JhbW1pbmdQb2pvR2VuZXJhdGVDb2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZVByb3BzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9wb2pvL1Byb2dyYW1taW5nUG9qb0dlbmVyYXRlUHJvcHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTEwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcG9qby9Qcm9ncmFtbWluZ1Bvam9HZW5lcmF0ZVByb3BzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcmVzb3VyY2VzL0FNUFVwZGF0ZVNpdGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Jlc291cmNlcy9BTVBVcGRhdGVTaXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIwYTdjCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Jlc291cmNlcy9BTVBVcGRhdGVTaXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvcmVzb3VyY2VzL0FzY2FwZVVwZGF0ZVNpdGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Jlc291cmNlcy9Bc2NhcGVVcGRhdGVTaXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNiZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Jlc291cmNlcy9Bc2NhcGVVcGRhdGVTaXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvc3RydWN0dXJlL1N0cnVjdHVyZUNvbXBsZXhEaWFncmFtLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy9zdHJ1Y3R1cmUvU3RydWN0dXJlQ29tcGxleERpYWdyYW0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNGI2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvc3RydWN0dXJlL1N0cnVjdHVyZUNvbXBsZXhEaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvc3RydWN0dXJlL1N0cnVjdHVyZVNpbXBsZURpYWdyYW0ucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3N0cnVjdHVyZS9TdHJ1Y3R1cmVTaW1wbGVEaWFncmFtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMxODk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3N0cnVjdHVyZS9TdHJ1Y3R1cmVTaW1wbGVEaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvQWN0aW9uc0V4YW1wbGUucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Rvb2xzL0FjdGlvbnNFeGFtcGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdmMWFhCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Rvb2xzL0FjdGlvbnNFeGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3IucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTVkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQWN0aW9uTWVudS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQWN0aW9uTWVudS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzYjIzMQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JBY3Rpb25NZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQWRkLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JBZGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDk1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQWRkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQXR0cmlidXRlcy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yQXR0cmlidXRlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllOWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JBdHRyaWJ1dGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yRWRpdGluZy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yRWRpdGluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NDFlYwotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JFZGl0aW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yTWVudS5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yTWVudS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5OGUyYwotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JNZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yTW92aW5nLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JNb3ZpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWFkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yTW92aW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yU3R5bGVzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JTdHlsZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2E1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yU3R5bGVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yVG9vbGJhci5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRWRpdG9yVG9vbGJhci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliMWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9FZGl0b3JUb29sYmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvRXBpZGVtaWNLZXkucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Rvb2xzL0VwaWRlbWljS2V5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY5MjZkCi0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3Rvb2xzL0VwaWRlbWljS2V5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvR2VuZXJhdGVNZW51LnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9HZW5lcmF0ZU1lbnUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDFmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvR2VuZXJhdGVNZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvSW5wdXRzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9JbnB1dHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NGJhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvSW5wdXRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvUGVyc3BlY3RpdmVzLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9QZXJzcGVjdGl2ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjc0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvUGVyc3BlY3RpdmVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvV29ya2JlbmNoLnBuZyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy90b29scy9Xb3JrYmVuY2gucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGVhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdG9vbHMvV29ya2JlbmNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdXNlcnMvQ2hlYXRTaGVldHMucG5nIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3VzZXJzL0NoZWF0U2hlZXRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUyYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW1hZ2VzL3VzZXJzL0NoZWF0U2hlZXRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdXNlcnMvSW50ZWdyYXRlZE1vZGVscy5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdXNlcnMvSW50ZWdyYXRlZE1vZGVscy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2ZjE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy91c2Vycy9JbnRlZ3JhdGVkTW9kZWxzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdXNlcnMvV2VsY29tZVNjcmVlbi5wbmcgYi9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbWFnZXMvdXNlcnMvV2VsY29tZVNjcmVlbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0ZGE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FtcC9kb2N1bWVudGF0aW9uL2NvbnRlbnRzL2ltYWdlcy91c2Vycy9XZWxjb21lU2NyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbXAvZG9jdW1lbnRhdGlvbi9jb250ZW50cy9pbmRleC5odG1sIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmFmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW1wL2RvY3VtZW50YXRpb24vY29udGVudHMvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxNiBAQAorPGh0bWw+Cis8aGVhZD4KKzxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkFnZW50IE1vZGVsaW5nIEd1aWRlPC90aXRsZT4KKzxsaW5rIGhyZWY9ImJvb2suY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc2LjAiIG5hbWU9ImdlbmVyYXRvciI+Cis8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJBZ2VudCBNb2RlbGluZyBHdWlkZSI+Cis8bGluayByZWw9Im5leHQiIGhyZWY9IkludHJvZHVjdGlvbi5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzEuJm5ic3A7SW50cm9kdWN0aW9uIj4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKzxkaXYgY2xhc3M9Im5hdmhlYWRlciI+Cis8dGFibGUgc3VtbWFyeT0iTmF2aWdhdGlvbiBoZWFkZXIiIHdpZHRoPSIxMDAlIj4KKzx0cj4KKzx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj5BZ2VudCBNb2RlbGluZyBHdWlkZTwvdGg+Cis8L3RyPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPjx0aCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNjAlIj4mbmJzcDs8L3RoPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJib29rIiB0aXRsZT0iQWdlbnQgTW9kZWxpbmcgR3VpZGUiPgorPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxkaXY+Cis8ZGl2PgorPGgxIGNsYXNzPSJ0aXRsZSI+Cis8YSBuYW1lPSJOMTAwMDEiPjwvYT5BZ2VudCBNb2RlbGluZyBHdWlkZTwvaDE+Cis8L2Rpdj4KKzwvZGl2PgorPGhyPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJ0b2MiPgorPHA+Cis8Yj5UYWJsZSBvZiBDb250ZW50czwvYj4KKzwvcD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCI+MS4gSW50cm9kdWN0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjUXVpY2tfU3RhcnQiPlF1aWNrIFN0YXJ0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjSW5zdGFsbCI+SW5zdGFsbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI1dlbGNvbWUuMjEiPldlbGNvbWUhPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjQ2hlYXQuMjEiPkNoZWF0ITwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0ZvbGxvd190aGVfVHV0b3JpYWwiPkZvbGxvdyB0aGUgVHV0b3JpYWw8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNGb2xsb3dfeW91cl9JbnRlcmVzdCI+Rm9sbG93IHlvdXIgSW50ZXJlc3Q8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0FnZW50LUJhc2VkX01vZGVsaW5nIj5BZ2VudC1CYXNlZCBNb2RlbGluZzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI090aGVyX0RvbWFpbnMiPk90aGVyIERvbWFpbnM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNUaGVfQWdlbnRfTW9kZWxpbmdfUGxhdGZvcm1fLjI4QU1QLjI5Ij5UaGUgQWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0gKEFNUCk8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNBZ2VudF9Nb2RlbGluZ19GcmFtZXdvcmtfLjI4QU1GLjI5Ij5BZ2VudCBNb2RlbGluZyBGcmFtZXdvcmsgKEFNRik8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNBZ2VudF9FeGVjdXRpb25fRnJhbWV3b3JrXy4yOEFYRi4yOSI+QWdlbnQgRXhlY3V0aW9uIEZyYW1ld29yayAoQVhGKTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0FnZW50X0dyYXBoaWNzX0ZyYW1ld29ya18uMjhBR0YuMjkiPkFnZW50IEdyYXBoaWNzIEZyYW1ld29yayAoQUdGKTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI0VzY2FwZSI+RXNjYXBlPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNDcmVkaXRzIj5DcmVkaXRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwiPjIuIE1vZGVsZXIgR3VpZGU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0FnZW50X01vZGVsaW5nX0ZyYW1ld29yayI+QWdlbnQgTW9kZWxpbmcgRnJhbWV3b3JrPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjU3RydWN0dXJlIj5TdHJ1Y3R1cmU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjT3ZlcnZpZXdfMiI+T3ZlcnZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGV0YWlscyI+RGV0YWlsczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNSZWZlcmVuY2UiPlJlZmVyZW5jZTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0FjdGlvbnNfMiI+QWN0aW9uczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNPdmVydmlld18zIj5PdmVydmlldzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNDb25jZXB0cyI+Q29uY2VwdHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRGV0YWlsc18zIj5EZXRhaWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI1JlZmVyZW5jZV8yIj5SZWZlcmVuY2U8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjRXhhbXBsZSI+RXhhbXBsZTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0Z1bmN0aW9ucyI+RnVuY3Rpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI092ZXJ2aWV3XzQiPk92ZXJ2aWV3PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTW9kZWxlcl9HdWlkZS5odG1sI0RldGFpbHNfNSI+RGV0YWlsczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik1vZGVsZXJfR3VpZGUuaHRtbCNFeGFtcGxlcyI+RXhhbXBsZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJNb2RlbGVyX0d1aWRlLmh0bWwjUmVmZXJlbmNlXzMiPlJlZmVyZW5jZTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwiPjMuIFVzZXIgR3VpZGU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjT3ZlcnZpZXdfNSI+T3ZlcnZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTW9kZWxpbmciPk1vZGVsaW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1BlcnNwZWN0aXZlIj5QZXJzcGVjdGl2ZTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNDcmVhdGluZ19Qcm9qZWN0c19hbmRfTW9kZWxzIj5DcmVhdGluZyBQcm9qZWN0cyBhbmQgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI01lbnVzLjJDX1BvcHVwc19hbmRfVG9vbGJhciI+TWVudXMsIFBvcHVwcyBhbmQgVG9vbGJhcjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlVzZXJfR3VpZGUuaHRtbCNWaWV3cyI+Vmlld3M8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTW9kZWxpbmdfVHJlZV9FZGl0b3IiPk1vZGVsaW5nIFRyZWUgRWRpdG9yPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjQnVpbGRpbmciPkJ1aWxkaW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0J1aWxkaW5nX01vZGVscyI+QnVpbGRpbmcgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0dlbmVyYXRpbmdfU3BlY2lhbGl6ZWRfTW9kZWxfQXJ0aWZhY3RzIj5HZW5lcmF0aW5nIFNwZWNpYWxpemVkIE1vZGVsIEFydGlmYWN0czwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0V4ZWN1dGluZyI+RXhlY3V0aW5nPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0xhdW5jaGluZ19hX01vZGVsXy4yOEFNRi4yOSI+TGF1bmNoaW5nIGEgTW9kZWwgKEFNRik8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjRXhlY3V0aW5nX2FfTW9kZWxfLjI4SmF2YV8uMkZfM0QuMjkiPkV4ZWN1dGluZyBhIE1vZGVsIChKYXZhIC8gM0QpPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI0NvbnRyb2xsaW5nX01vZGVscyI+Q29udHJvbGxpbmcgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1ZpZXdzXzIiPlZpZXdzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI1Zpc3VhbGl6YXRpb24iPlZpc3VhbGl6YXRpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTGF1bmNoaW5nX090aGVyX1RhcmdldHMiPkxhdW5jaGluZyBPdGhlciBUYXJnZXRzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVXNlcl9HdWlkZS5odG1sI01vZGVsX1BhcmFtZXRlcml6YXRpb24iPk1vZGVsIFBhcmFtZXRlcml6YXRpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJVc2VyX0d1aWRlLmh0bWwjTW9kZWxfVGVzdGluZyI+TW9kZWwgVGVzdGluZzwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCI+NC4gVHV0b3JpYWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjRGVzaWduaW5nX2FfTW9kZWwiPkRlc2lnbmluZyBhIE1vZGVsPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjTW9kZWxfR29hbHMiPk1vZGVsIEdvYWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNNb2RlbF9JbXBsZW1lbnRhdGlvbiI+TW9kZWwgSW1wbGVtZW50YXRpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNTZXR1cCI+U2V0dXA8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJUdXRvcmlhbHMuaHRtbCNTdHJ1Y3R1cmVfMyI+U3RydWN0dXJlPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjQWN0aW9uc19QYXJ0X0kiPkFjdGlvbnMgUGFydCBJPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iVHV0b3JpYWxzLmh0bWwjU3R5bGVzXzIiPlN0eWxlczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlR1dG9yaWFscy5odG1sI0FjdGlvbnNfUGFydF9JSSI+QWN0aW9ucyBQYXJ0IElJPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9ImNoYXB0ZXIiPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sIj41LiBQcm9ncmFtZXIgR3VpZGU8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNPdmVydmlld182Ij5PdmVydmlldzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI0RvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNPbmxpbmUiPk9ubGluZTwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1VwZGF0ZV9TaXRlIj5VcGRhdGUgU2l0ZTwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjSW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNFeGFtcGxlX0phdmFfTW9kZWxzIj5FeGFtcGxlIEphdmEgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXhwbG9yaW5nX0V4YW1wbGVfQUJNX01vZGVscyI+RXhwbG9yaW5nIEV4YW1wbGUgQUJNIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRGV2ZWxvcGluZ19Nb2RlbHMiPkRldmVsb3BpbmcgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjQ2hlYXRzaGVldCI+Q2hlYXRzaGVldDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1N0ZXBzIj5TdGVwczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXhlY3V0aW5nX01vZGVscyI+RXhlY3V0aW5nIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1R1dG9yaWFsIj5UdXRvcmlhbDwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjRXh0ZW5kaW5nX2FuZF9DdXN0b21pemluZ19BTVAiPkV4dGVuZGluZyBhbmQgQ3VzdG9taXppbmcgQU1QPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjSW50ZWdyYXRpbmdfSmF2YV9hbmRfQU1GX01vZGVscyI+SW50ZWdyYXRpbmcgSmF2YSBhbmQgQU1GIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI01ldGhvZF9BY3Rpb24iPk1ldGhvZCBBY3Rpb248L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNQcm90ZWN0ZWRfQ29kZV9SZWdpb25zIj5Qcm90ZWN0ZWQgQ29kZSBSZWdpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iUHJvZ3JhbWVyX0d1aWRlLmh0bWwjSW50ZXJmYWNlX2FuZF9CYXNlX0NsYXNzX0dlbmVyYXRpb24iPkludGVyZmFjZSBhbmQgQmFzZSBDbGFzcyBHZW5lcmF0aW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJQcm9ncmFtZXJfR3VpZGUuaHRtbCNDb252ZXJ0aW5nX0V4aXN0aW5nX0FzY2FwZV9Nb2RlbHMiPkNvbnZlcnRpbmcgRXhpc3RpbmcgQXNjYXBlIE1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI01vZGVsIj5Nb2RlbDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlByb2dyYW1lcl9HdWlkZS5odG1sI1ZpZXciPlZpZXc8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0iY2hhcHRlciI+PGEgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwiPjYuIEluc3RhbGxhdGlvbiBHdWlkZTwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI1Rvb2xzIj5Ub29sczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI0NvbXBsZXRlX0lERSI+Q29tcGxldGUgSURFPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iSW5zdGFsbGF0aW9uX0d1aWRlLmh0bWwjRWNsaXBzZV9hbmRfdGhlX0FnZW50X01vZGVsaW5nX1Rvb2xzIj5FY2xpcHNlIGFuZCB0aGUgQWdlbnQgTW9kZWxpbmcgVG9vbHM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNFeHRlbnNpb25zIj5FeHRlbnNpb25zPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJJbnN0YWxsYXRpb25fR3VpZGUuaHRtbCNNb2RlbHMiPk1vZGVsczwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ikluc3RhbGxhdGlvbl9HdWlkZS5odG1sI09idGFpbmluZ19FeGFtcGxlX01vZGVscyI+T2J0YWluaW5nIEV4YW1wbGUgTW9kZWxzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9ImNoYXB0ZXIiPjxhIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sIj43LiBOZXcgYW5kIE5vdGV3b3J0aHk8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJOZXdfYW5kX05vdGV3b3J0aHkuaHRtbCNSZWxlYXNlXzAuOC4wIj5SZWxlYXNlIDAuOC4wPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwjTW9kZWxfVmlzdWFsaXphdGlvbiI+TW9kZWwgVmlzdWFsaXphdGlvbjwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sI01vZGVsaW5nX0ZyYW1ld29yayI+TW9kZWxpbmcgRnJhbWV3b3JrPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iTmV3X2FuZF9Ob3Rld29ydGh5Lmh0bWwjTW9kZWxfRWRpdGluZyI+TW9kZWwgRWRpdGluZzwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sI01vZGVsaW5nX1Rvb2xzIj5Nb2RlbGluZyBUb29sczwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9Ik5ld19hbmRfTm90ZXdvcnRoeS5odG1sI1VzZXJfRXhwZXJpZW5jZSI+VXNlciBFeHBlcmllbmNlPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9ImNoYXB0ZXIiPjxhIGhyZWY9IlJlc291cmNlcy5odG1sIj44LiBSZXNvdXJjZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkZD4KKzxkbD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJSZXNvdXJjZXMuaHRtbCNXZWJzaXRlcyI+V2Vic2l0ZXM8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJSZXNvdXJjZXMuaHRtbCNQYXBlcnMiPlBhcGVyczwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0iY2hhcHRlciI+PGEgaHJlZj0iU3VwcG9ydC5odG1sIj45LiBTdXBwb3J0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI0lzc3VlcyI+SXNzdWVzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI0dlbmVyYWxfU3VwcG9ydC4yQ19RdWVzdGlvbnNfYW5kX0Rpc2N1c3Npb24iPkdlbmVyYWwgU3VwcG9ydCwgUXVlc3Rpb25zIGFuZCBEaXNjdXNzaW9uPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI1ZpZXdfRXhpc3RpbmdfQnVnc19hbmRfRmVhdHVyZV9SZXF1ZXN0cyI+VmlldyBFeGlzdGluZyBCdWdzIGFuZCBGZWF0dXJlIFJlcXVlc3RzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI0ZpbGVfYV9CdWciPkZpbGUgYSBCdWc8L2E+PC9zcGFuPgorPC9kdD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJTdXBwb3J0Lmh0bWwjRGlzY3Vzc19BTVBfRGV2ZWxvcG1lbnRfYW5kX1Byb2plY3QiPkRpc2N1c3MgQU1QIERldmVsb3BtZW50IGFuZCBQcm9qZWN0PC9hPjwvc3Bhbj4KKzwvZHQ+Cis8L2RsPgorPC9kZD4KKzxkdD4KKzxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJTdXBwb3J0Lmh0bWwjT3RoZXJfQ29udGFjdHMiPk90aGVyIENvbnRhY3RzPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZGQ+Cis8ZGw+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI1Byb2Zlc3Npb25hbF9TdXBwb3J0Ij5Qcm9mZXNzaW9uYWwgU3VwcG9ydDwvYT48L3NwYW4+Cis8L2R0PgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNNZWRpYV9hbmRfUHJpdmF0ZV9Db21tdW5pY2F0aW9ucyI+TWVkaWEgYW5kIFByaXZhdGUgQ29tbXVuaWNhdGlvbnM8L2E+PC9zcGFuPgorPC9kdD4KKzwvZGw+Cis8L2RkPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNHZXRfSW52b2x2ZWQiPkdldCBJbnZvbHZlZDwvYT48L3NwYW4+Cis8L2R0PgorPGRkPgorPGRsPgorPGR0PgorPHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IlN1cHBvcnQuaHRtbCNJbXByb3ZlX3RoaXNfRG9jdW1lbnRhdGlvbi4yMSI+SW1wcm92ZSB0aGlzIERvY3VtZW50YXRpb24hPC9hPjwvc3Bhbj4KKzwvZHQ+Cis8ZHQ+Cis8c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iU3VwcG9ydC5odG1sI0NvbnRyaWJ1dGVfdG9fQU1QIj5Db250cmlidXRlIHRvIEFNUDwvYT48L3NwYW4+Cis8L2R0PgorPC9kbD4KKzwvZGQ+Cis8L2RsPgorPC9kZD4KKzwvZGw+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj4KKzxocj4KKzx0YWJsZSBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSI0MCUiPiZuYnNwOzxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPk5leHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iNDAlIj4mbmJzcDs8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIj4mbmJzcDtDaGFwdGVyJm5ic3A7MS4mbmJzcDtJbnRyb2R1Y3Rpb248L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50Ly5jbGFzc3BhdGggYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTJmNjNiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnRzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtYW50bHIuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWFudGxyc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LWFwYWNoZS1iY2VsLmphciIgc291cmNlcGF0aD0ibGliL2FudC1hcGFjaGUtYmNlbHNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC1hcGFjaGUtYnNmLmphciIgc291cmNlcGF0aD0ibGliL2FudC1hcGFjaGUtYnNmc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LWFwYWNoZS1sb2c0ai5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtYXBhY2hlLWxvZzRqc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LWFwYWNoZS1vcm8uamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWFwYWNoZS1vcm9zcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtYXBhY2hlLXJlZ2V4cC5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtYXBhY2hlLXJlZ2V4cHNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWFwYWNoZS1yZXNvbHZlcnNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC1jb21tb25zLWxvZ2dpbmcuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWNvbW1vbnMtbG9nZ2luZ3NyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC1jb21tb25zLW5ldC5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtY29tbW9ucy1uZXRzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtamFpLmphciIgc291cmNlcGF0aD0ibGliL2FudC1qYWlzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtamF2YW1haWwuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWphdmFtYWlsc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LWpkZXBlbmQuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWpkZXBlbmRzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtam1mLmphciIgc291cmNlcGF0aD0ibGliL2FudC1qbWZzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtanNjaC5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtanNjaHNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC1qdW5pdC5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtanVuaXRzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtbGF1bmNoZXIuamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LWxhdW5jaGVyc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LW5ldHJleHguamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LW5ldHJleHhzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtbm9kZXBzLmphciIgc291cmNlcGF0aD0ibGliL2FudC1ub2RlcHNzcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnQtc3RhcnRlYW0uamFyIiBzb3VyY2VwYXRoPSJsaWIvYW50LXN0YXJ0ZWFtc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LXN0eWxlYm9vay5qYXIiIHNvdXJjZXBhdGg9ImxpYi9hbnQtc3R5bGVib29rc3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LXN3aW5nLmphciIgc291cmNlcGF0aD0ibGliL2FudC1zd2luZ3NyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC10cmF4LmphciIgc291cmNlcGF0aD0ibGliL2FudC10cmF4c3JjLnppcCIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LXdlYmxvZ2ljLmphciIgc291cmNlcGF0aD0ibGliL2FudC13ZWJsb2dpY3NyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS4yIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iamF2YUJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC8uY3ZzaWdub3JlIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzk0ZDAzMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YUJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50Ly5wcm9qZWN0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3Y2Q0NTUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuYXBhY2hlLmFudDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTViZDA4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmFudAotQnVuZGxlLVZlcnNpb246IDEuNy4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGliL2FudC5qYXIsCi0gbGliL2FudC1hbnRsci5qYXIsCi0gbGliL2FudC1hcGFjaGUtYmNlbC5qYXIsCi0gbGliL2FudC1hcGFjaGUtYnNmLmphciwKLSBsaWIvYW50LWFwYWNoZS1sb2c0ai5qYXIsCi0gbGliL2FudC1hcGFjaGUtb3JvLmphciwKLSBsaWIvYW50LWFwYWNoZS1yZWdleHAuamFyLAotIGxpYi9hbnQtYXBhY2hlLXJlc29sdmVyLmphciwKLSBsaWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIsCi0gbGliL2FudC1jb21tb25zLW5ldC5qYXIsCi0gbGliL2FudC1qYWkuamFyLAotIGxpYi9hbnQtamF2YW1haWwuamFyLAotIGxpYi9hbnQtamRlcGVuZC5qYXIsCi0gbGliL2FudC1qbWYuamFyLAotIGxpYi9hbnQtanNjaC5qYXIsCi0gbGliL2FudC1qdW5pdC5qYXIsCi0gbGliL2FudC1sYXVuY2hlci5qYXIsCi0gbGliL2FudC1uZXRyZXh4LmphciwKLSBsaWIvYW50LW5vZGVwcy5qYXIsCi0gbGliL2FudC1zdGFydGVhbS5qYXIsCi0gbGliL2FudC1zdHlsZWJvb2suamFyLAotIGxpYi9hbnQtc3dpbmcuamFyLAotIGxpYi9hbnQtdHJheC5qYXIsCi0gbGliL2FudC13ZWJsb2dpYy5qYXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IGltYWdlcywKLSBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIsCi0gb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQsCi0gb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLAotIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LmxvYWRlciwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcywKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYiwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20sCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4biwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZSwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYywKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhaCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LnhzbCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uYXRpdmUyYXNjaWksCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3MsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NtLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNjcmlwdCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3BsYXNoLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbSwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4LAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcywKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC53aW5kb3dzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuY29uZGl0aW9ucywKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmRlcGVuZCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZSwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlciwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNwaSwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLAotIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWwsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5qYXZhMTUsCi0gb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbCwKLSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cCwKLSBvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyLAotIG9yZy5hcGFjaGUudG9vbHMubWFpbCwKLSBvcmcuYXBhY2hlLnRvb2xzLnRhciwKLSBvcmcuYXBhY2hlLnRvb2xzLnppcAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLm9zZ2kKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFjYzE4NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2Fib3V0Lmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjU2Zjg0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXByaWwgMTYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+QW50IDEuNy4wPC9oND4KLTxwPlRoZSBwbHVnLWluIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYXMgcGFydCBvZiB0aGUgQW50IHByb2plY3QuPC9wPgotCi08cD5UaGUgQW50IGJpbmFyeSBjb2RlIGluIGFudC5qYXIgYW5kIHRoZSBzY3JpcHRzIGFudCwgYW50LmJhdCwgYW50LmNtZCwgYW50ZW52LmNtZCwgYW50UnVuLCBhbnRSdW4uYmF0LCBhbnRSdW4ucGwsIGNvbXBsZXRlLWFudC1jbWQucGwsIGVudnNldC5jbWQsIGxjcC5iYXQsIHJ1bmFudC5wbCwgcnVuYW50LnB5IGFuZCBydW5yYy5jbWQgYXJlIGluY2x1ZGVkIHdpdGggdGhlIHBsdWctaW4gd2l0aCBubyBtb2RpZmljYXRpb25zLgotVGhlIEFudCBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIHRoZSB6aXAgZmlsZXMgbmFtZWQgYW50LSpzcmMuemlwLjwvcD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIEFudCBjb2RlIGFuZCB0aGUgc2NyaXB0cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAotaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQiIHRhcmdldD0iX2JsYW5rIj5hc2wtdjIwLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LgotCi08cD5UaGUgbmFtZXMgJnF1b3Q7QW50JnF1b3Q7IGFuZCAmcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90OyBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyAKLXNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOmFwYWNoZUBhcGFjaGUub3JnIj5hcGFjaGVAYXBhY2hlLm9yZzwvYT4uPC9wPgotCi08cD5UaGUgQXBhY2hlIGF0dHJpYnV0aW9uIDxhIGhyZWY9ImFib3V0X2ZpbGVzL05PVElDRSIgdGFyZ2V0PSJfYmxhbmsiPk5PVElDRTwvYT4gZmlsZSBpcyBpbmNsdWRlZCB3aXRoIHRoZSBDb250ZW50IGluIGFjY29yZGFuY2Ugd2l0aCA0ZCBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLjwvcD4KLQotPHA+QW50IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc29mdHdhcmU6PC9wPgotCi08YmxvY2txdW90ZT4KLQk8aDQ+RE9NPC9oND4KLQk8cD5ET00gaXMgZGV2ZWxvcGVkIGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLiAgWW91ciB1c2Ugb2YgRE9NIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZQotCWZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvTElDRU5TRS5kb20uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkxJQ0VOU0UuZG9tLmh0bWw8L2E+IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBwbHVnLWluIGFuZCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotCTxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjA8L2E+LjwvcD4KLQkKLQk8aDQ+U0FYPC9oND4KLQkKLQk8cD5TQVggaXMgZGV2ZWxvcGVkIGJ5IHRoZSBTQVggcHJvamVjdCAoPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmc8L2E+KS4gIFlvdXIgdXNlIG9mIFNBWCBpcyBzdWJqZWN0IHRvIHRoZQotCXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0xJQ0VOU0Uuc2F4LnR4dCIgdGFyZ2V0PSJfYmxhbmsiPkxJQ0VOU0Uuc2F4LnR4dDwvYT4gd2hpY2ggaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHBsdWctaW4uPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2Fib3V0X2ZpbGVzL0xJQ0VOU0UuZG9tLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9MSUNFTlNFLmRvbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2U3ODk4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2Fib3V0X2ZpbGVzL0xJQ0VOU0UuZG9tLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkxpY2Vuc2U8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPHA+VGhpcyBsaWNlbnNlIGNhbWUgZnJvbTo8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMCI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjA8L2E+PC9wPgotCi08cD4KLVczQ64gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPGJyPgotQ29weXJpZ2h0IKkgMTk5NC0yMDAxIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTwvYT4sIAotPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC88L2E+PC9wPgotCi08cD4KLVRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkPGJyPgotaXRlbXMpIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGU8YnI+Ci1mb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssPGJyPgoteW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGw8YnI+Ci1jb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOjxicj4KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmU8YnI+Ci1hbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24soGZvciBhbnk8YnI+Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0PGJyPgoteW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQ8YnI+Ci1kb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0PGJyPgoteW91IG1ha2U6PC9wPgotCi08cD4KLVRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZjxicj4KLXRoZSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L3A+Ci0KLTxwPgotQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yPGJyPgotdGVybXMgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIGEgc2hvcnQgbm90aWNlIG9mIHRoZTxicj4KLWZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkPGJyPgotYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOjxicj4KLSJDb3B5cmlnaHQgqSBbJGRhdGUtb2Ytc29mdHdhcmVdIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZjxicj4KLVRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlPGJyPgotUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC48YnI+Ci1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyI8L3A+Ci0KLTxwPgotTm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFczQyBmaWxlcyw8YnI+Ci1pbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgPGJyPgotVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLik8L3A+Ci0KLTxwPgotVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQ8YnI+Ci1DT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SPGJyPgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRjxicj4KLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFPGJyPgotVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRDxicj4KLVBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLjxicj4KLUNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsPGJyPgotU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEU8YnI+Ci1TT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLjwvcD4KLQotPHA+Ci1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW48YnI+Ci1hZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dDxicj4KLXNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzPGJyPgotc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluPGJyPgotd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+Ci0KLTxwPgotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPGJyPgotVGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbjxicj4KLUF1Z3VzdCAxNCAxOTk4IHNvIGFzIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIEdQTC4gVGhpczxicj4KLXZlcnNpb24gZW5zdXJlcyB0aGF0IFczQyBzb2Z0d2FyZSBsaWNlbnNpbmcgdGVybXMgYXJlIG5vIG1vcmU8YnI+Ci1yZXN0cmljdGl2ZSB0aGFuIEdQTCBhbmQgY29uc2VxdWVudGx5IFczQyBzb2Z0d2FyZSBtYXkgYmU8YnI+Ci1kaXN0cmlidXRlZCBpbiBHUEwgcGFja2FnZXMuIFNlZSB0aGUgb2xkZXIgZm9ybXVsYXRpb24gZm9yIHRoZTxicj4KLXBvbGljeSBwcmlvciB0byB0aGlzIGRhdGUuIFBsZWFzZSBzZWUgb3VyIENvcHlyaWdodCBGQVEgZm9yIGNvbW1vbiA8YnI+Ci1xdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb208YnI+Ci1vdXIgc2l0ZSwgaW5jbHVkaW5nIHNwZWNpZmljIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlPGJyPgotbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gPGJyPgotT3RoZXIgcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZTxicj4KLWRpcmVjdGVkIHRvIHNpdGUtcG9saWN5QHczLm9yZy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9MSUNFTlNFLnNheC50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9MSUNFTlNFLnNheC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0NmIzZGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvYWJvdXRfZmlsZXMvTElDRU5TRS5zYXgudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotVGhpcyBsaWNlbnNlIGNhbWUgZnJvbTogaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9jb3B5aW5nLmh0bWwKLSAgSG93ZXZlciBwbGVhc2Ugbm90ZSBmdXR1cmUgdmVyc2lvbnMgb2YgU0FYIG1heSBiZSBjb3ZlcmVkIAotICB1bmRlciBodHRwOi8vc2F4cHJvamVjdC5vcmcvP3NlbGVjdGVkPXBkCi0KLQotVGhpcyBwYWdlIGlzIG5vdyBvdXQgb2YgZGF0ZSAtLSBzZWUgdGhlIG5ldyBTQVggc2l0ZSBhdCAKLWh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvIGZvciBtb3JlIHVwLXRvLWRhdGUKLXJlbGVhc2VzIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4gUGxlYXNlIGNoYW5nZSB5b3VyIGJvb2ttYXJrcy4KLQotCi1TQVgyIGlzIEZyZWUhCi0KLUkgaGVyZWJ5IGFiYW5kb24gYW55IHByb3BlcnR5IHJpZ2h0cyB0byBTQVggMi4wICh0aGUgU2ltcGxlIEFQSSBmb3IKLVhNTCksIGFuZCByZWxlYXNlIGFsbCBvZiB0aGUgU0FYIDIuMCBzb3VyY2UgY29kZSwgY29tcGlsZWQgY29kZSwgYW5kCi1kb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLgotU0FYIGNvbWVzIHdpdGggTk8gV0FSUkFOVFkgb3IgZ3VhcmFudGVlIG9mIGZpdG5lc3MgZm9yIGFueQotcHVycG9zZS4KLQotRGF2aWQgTWVnZ2luc29uLCBkYXZpZEBtZWdnaW5zb24uY29tCi0yMDAwLTA1LTA1CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9OT1RJQ0UgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmYjZkZGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvYWJvdXRfZmlsZXMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQotICAgPT0gIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotICAgPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICA9PQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0gICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgYWxzbyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgOgotICAgICAtIHRoZSBXM0MgY29uc29ydGl1bSAoaHR0cDovL3d3dy53M2Mub3JnKSAsCi0gICAgIC0gdGhlIFNBWCBwcm9qZWN0IChodHRwOi8vd3d3LnNheHByb2plY3Qub3JnKQotCi0gICBQbGVhc2UgcmVhZCB0aGUgZGlmZmVyZW50IExJQ0VOU0UgZmlsZXMgcHJlc2VudCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YKLSAgIHRoaXMgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9hc2wtdjIwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9hYm91dF9maWxlcy9hc2wtdjIwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvYnVpbGQucHJvcGVydGllcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjN2Q2ZmUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gbGliLyouamFyLFwKLSAgICAgICAgICAgICAgIGJpbi8qLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBldGMvCi1zcmMuaW5jbHVkZXMgPSBsaWIvKi56aXAsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgZXRjLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9jaGFuZ2Vsb2cueHNsIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NoYW5nZWxvZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMGQxMTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NoYW5nZWxvZy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08eHNsOnN0eWxlc2hlZXQKLSAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScKLSAgICB2ZXJzaW9uPScxLjAnPgotCi08IS0tCi0gICAgQ29weXJpZ2h0ICAyMDAyLDIwMDQtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIAotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgIAotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgIAotLS0+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJtb2R1bGUiLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJjdnN3ZWIiLz4KLQotICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiCi0gICAgICAgICAgICAgIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgotICAgICAgICAgICAgICBkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9zdHJpY3QuZHRkIi8+Ci0KLSAgPCEtLSBDb3B5IHN0YW5kYXJkIGRvY3VtZW50IGVsZW1lbnRzLiAgRWxlbWVudHMgdGhhdAotICAgICAgIHNob3VsZCBiZSBpZ25vcmVkIG11c3QgYmUgZmlsdGVyZWQgYnkgYXBwbHktdGVtcGxhdGVzCi0gICAgICAgdGFncy4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZTo6KlsuICE9ICcnXSIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmNvcHk+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoYW5nZWxvZyI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICAgIGJvZHksIHAgewotICAgICAgICAgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgICAgICBmb250LXNpemU6IDgwJTsKLSAgICAgICAgICAgIGNvbG9yOiAjMDAwMDAwOwotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHIsIHRkIHsKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICAgICAgYmFja2dyb3VuZDogI2VlZWVlMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGQgewotICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4OwotICAgICAgICAgIH0KLSAgICAgIC5kYXRlQW5kQXV0aG9yIHsKLSAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICAgICAgYmFja2dyb3VuZDogI2E2Y2FmMDsKLSAgICAgICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwotICAgICAgfQotICAgICAgICAgIGEgewotICAgICAgICAgICAgY29sb3I6ICMwMDAwMDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZSB7Ci0gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgICB9Ci0gICAgICAgIDwvc3R5bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPGgxPgotICAgICAgICAgIDxhIG5hbWU9InRvcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvYT4KLSAgICAgICAgPC9oMT4KLSAgICAgICAgPHAgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QXBhY2hlIEFudDwvYT4uPC9wPgotICAgICAgICA8aHIvPgotICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiPgotICAgICAgICAgIAotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vZW50cnkiPgotICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iZGF0ZSIgZGF0YS10eXBlPSJ0ZXh0IiBvcmRlcj0iZGVzY2VuZGluZyIvPgotICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0idGltZSIgZGF0YS10eXBlPSJ0ZXh0IiBvcmRlcj0iZGVzY2VuZGluZyIvPgotICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAKLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgCi0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVudHJ5Ij4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImRhdGVBbmRBdXRob3IiPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0idGltZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXV0aG9yIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8cHJlPgotPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtc2ciLz48L3ByZT4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmlsZSIvPgotICAgICAgICA8L3VsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRlIj4KLSAgICA8aT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvaT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGltZSI+Ci0gICAgPGk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2k+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImF1dGhvciI+Ci0gICAgPGk+Ci0gICAgICA8YT4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+bWFpbHRvOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvYT4KLSAgICA8L2k+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgotICAgIDxsaT4KLSAgICAgIDxhPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChwcmV2cmV2aXNpb24pID0gMCAiPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdnN3ZWIiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZHVsZSIgLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+P3Jldj08eHNsOnZhbHVlLW9mIHNlbGVjdD0icmV2aXNpb24iIC8+JmFtcDtjb250ZW50LXR5cGU9dGV4dC94LWN2c3dlYi1tYXJrdXA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3Zzd2ViIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2R1bGUiIC8+Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIiAvPj9yMT08eHNsOnZhbHVlLW9mIHNlbGVjdD0icmV2aXNpb24iIC8+JmFtcDtyMj08eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJldnJldmlzaW9uIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSIgLz4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIvPik8L2E+Ci0gICAgPC9saT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBBbnkgZWxlbWVudHMgd2l0aGluIGEgbXNnIGFyZSBwcm9jZXNzZWQsCi0gICAgICAgc28gdGhhdCB3ZSBjYW4gcHJlc2VydmUgSFRNTCB0YWdzLiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibXNnIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWZyYW1lcy54c2wgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWZyYW1lcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYWE4YjcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLQotPCEtLQotICAgIENvcHlyaWdodCAgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgCi0tLT4KLQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgotICAgIDx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KLQotICAgIDx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImJhc2VkaXIiIHNlbGVjdD0iJy4nIi8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIj4KLSAgICAgICAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgotICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgICAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1zdW1tYXJ5Lmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldyIvPgotICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgICAgIDwhLS0gcHJvY2VzcyBhbGwgZmlsZXMgLS0+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmlsZVtjb3VudChlcnJvcikgIT0gMF0iLz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Ci0gICAgICAgIDxodG1sPgotICAgICAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPkNoZWNrU3R5bGUgQXVkaXQ8L3RpdGxlPgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgotICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0iZmlsZUxpc3RGcmFtZSIvPgotICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9ImZpbGVGcmFtZSIvPgotICAgICAgICAgICAgPC9mcmFtZXNldD4KLSAgICAgICAgICAgIDxub2ZyYW1lcz4KLSAgICAgICAgICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuCi0gICAgICAgICAgICAgICAgICAgIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KLSAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8L25vZnJhbWVzPgotICAgICAgICA8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgotICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRleHQtYWxpZ246cmlnaHQiPjxoMj5DaGVja1N0eWxlIEF1ZGl0PC9oMj48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRleHQtYWxpZ246cmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aAotICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0Lyc+Q2hlY2tTdHlsZTwvYT4gYW5kCi0gICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vYW50LmFwYWNoZS5vcmcvJz5BbnQ8L2E+LjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8aHIgc2l6ZT0iMSIvPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0ib3ZlcnZpZXciPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgICA8IS0tIHBhZ2UgaGVhZGVyIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIFN1bW1hcnkgcGFydCAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN1bW1hcnkiLz4KLSAgICAgICAgICAgICAgICA8aHIgc2l6ZT0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJsZWZ0Ii8+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIEZpbGUgbGlzdCBwYXJ0IC0tPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZmlsZWxpc3QiLz4KLSAgICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci0gICAgICAgIC5iYW5uZXJjZWxsIHsKLSAgICAgICAgYm9yZGVyOiAwcHg7Ci0gICAgICAgIHBhZGRpbmc6IDBweDsKLSAgICAgICAgfQotICAgICAgICBib2R5IHsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDEwOwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwOwotICAgICAgICBmb250Om5vcm1hbCA4MCUgYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOwotICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7Ci0gICAgICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgLm9kZHJvdyB0ZCB7Ci0gICAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7Ci0gICAgICAgIH0KLSAgICAgICAgLmV2ZW5yb3cgdGQgewotICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwotICAgICAgICB9Ci0gICAgICAgIHRoLCB0ZCB7Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gICAgICAgIH0KLSAgICAgICAgdGggewotICAgICAgICBmb250LXdlaWdodDpib2xkOwotICAgICAgICBiYWNrZ3JvdW5kOiAjY2NjOwotICAgICAgICBjb2xvcjogYmxhY2s7Ci0gICAgICAgIH0KLSAgICAgICAgdGFibGUsIHRoLCB0ZCB7Ci0gICAgICAgIGZvbnQtc2l6ZToxMDAlOwotICAgICAgICBib3JkZXI6IG5vbmUKLSAgICAgICAgfQotICAgICAgICB0YWJsZS5sb2cgdHIgdGQsIHRyIHRoIHsKLQotICAgICAgICB9Ci0gICAgICAgIGgyIHsKLSAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgICAgZm9udC1zaXplOjE0MCU7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDU7Ci0gICAgICAgIH0KLSAgICAgICAgaDMgewotICAgICAgICBmb250LXNpemU6MTAwJTsKLSAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKLSAgICAgICAgY29sb3I6IHdoaXRlOwotICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgICAgIHBhZGRpbmc6IDVweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDA7Ci0gICAgICAgIH0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDwhLS0KLSAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgZmlsZXMuCi0gICAgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgICA8aDI+RmlsZXM8L2gyPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgZWFjaCBmaWxlIGNyZWF0ZSBpdHMgcGFydCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmlsZVtjb3VudChlcnJvcikgIT0gMF0iIG1vZGU9ImFsbC5jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0iZmlsZWxpc3QiPgotICAgICAgICA8aDM+RmlsZXM8L2gzPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlW2NvdW50KGVycm9yKSAhPSAwXSIgbW9kZT0iZmlsZWxpc3QiPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9ImNvdW50KGVycm9yKSIgb3JkZXI9ImRlc2NlbmRpbmciIGRhdGEtdHlwZT0ibnVtYmVyIi8+Ci0gICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlIiBtb2RlPSJmaWxlbGlzdCI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ZmlsZXMvPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcikiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPgotICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGVycm9yKSIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJmaWxlRnJhbWUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5maWxlcy88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+Ci0gICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDwhLS0KLSAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS9iL2MgdG8gLi4vLi4vLi4vCi0gICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCi0gICAgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy8nKSI+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLycpIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucygkcGF0aCwnLycpKSBhbmQgbm90KCRwYXRoID0gJycpIj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgotICAgICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgotICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9maWxlcy97c3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcil9Lmh0bWwiPgotICAgICAgICAgICAgPGh0bWw+Ci0gICAgICAgICAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48eHNsOnRleHQ+c3R5bGVzaGVldC5jc3M8L3hzbDp0ZXh0PjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDwvaGVhZD4KLSAgICAgICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGgzPkZpbGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+PC9oMz4KLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkVycm9yIERlc2NyaXB0aW9uPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TGluZTpDb2x1bW48L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlcnJvciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJ7QHNvdXJjZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIi8+PHhzbDppZiB0ZXN0PSJAY29sdW1uIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4iLz48L3hzbDppZj48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgICAgICA8L2h0bWw+Ci0gICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJzdW1tYXJ5Ij4KLSAgICAgICAgPGgzPlN1bW1hcnk8L2gzPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGVDb3VudCIgc2VsZWN0PSJjb3VudChmaWxlKSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZS9lcnJvcikiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlRXJyb3JDb3VudCIgc2VsZWN0PSJjb3VudChmaWxlW2NvdW50KGVycm9yKSAhPSAwXSkiLz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoPlRvdGFsIEZpbGVzPC90aD4KLSAgICAgICAgICAgICAgICA8dGg+RmlsZXMgV2l0aCBFcnJvcnM8L3RoPgotICAgICAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciLz4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWxlQ291bnQiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGVFcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZWQtcm93Ij4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+b2Rkcm93PC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5ldmVucm93PC94c2w6aWY+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtdGV4dC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZDQ5NmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLQotPCEtLQotICAgIENvcHlyaWdodCAgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgCi0tLT4KLQotICAgIDx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9ImNoZWNrc3R5bGUiLz4KLSAgICA8eHNsOnByZXNlcnZlLXNwYWNlIGVsZW1lbnRzPSJmaWxlIi8+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZS9maWxlL2Vycm9yIj4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+Ci0gICAgICAgIDx4c2w6dGV4dD46PC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIi8+Ci0gICAgICAgIDx4c2w6dGV4dD46PC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4iLz4KLSAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUteGRvYy54c2wgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLXhkb2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjNhYzBlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUteGRvYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKLSAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotCi08IS0tCi0gICAgQ29weXJpZ2h0ICAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAKLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAKLS0tPgotCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0gICAgPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgotCi0gICAgPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iYmFzZWRpciIgc2VsZWN0PSInLiciLz4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiPgotICAgICAgPGRvY3VtZW50PgotICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICA8dGl0bGU+Q2hlY2tzdHlsZSBBdWRpdDwvdGl0bGU+Ci0gICAgICAgIDwvcHJvcGVydGllcz4KLQotICAgICAgICA8Ym9keT4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN1bW1hcnkiLz4KLSAgICAgICAgICA8IS0tIEZpbGUgbGlzdCBwYXJ0IC0tPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZmlsZWxpc3QiLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZpbGVbY291bnQoZXJyb3IpICE9IDBdIi8+Ci0gICAgICAgIDwvYm9keT4KLSAgICAgIDwvZG9jdW1lbnQ+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJmaWxlbGlzdCI+Ci0gICAgICA8c2VjdGlvbiBuYW1lPSJGaWxlcyI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlW2NvdW50KGVycm9yKSAhPSAwXSIgbW9kZT0iZmlsZWxpc3QiPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9ImNvdW50KGVycm9yKSIgb3JkZXI9ImRlc2NlbmRpbmciIGRhdGEtdHlwZT0ibnVtYmVyIi8+Ci0gICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlIiBtb2RlPSJmaWxlbGlzdCI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ZmlsZXM8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+Ci0gICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoZXJyb3IpIi8+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgotICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vZmlsZXN7c3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcil9LnhtbCI+Ci0gICAgICAgIDxkb2N1bWVudD4KLSAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIDx0aXRsZT5DaGVja3N0eWxlIEF1ZGl0PC90aXRsZT4KLSAgICAgICAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDxzZWN0aW9uIG5hbWU9IkRldGFpbHMgZm9yIHtzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKX0iPgotICAgICAgICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRoPkVycm9yIERlc2NyaXB0aW9uPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICA8dGg+TGluZTwvdGg+Ci0gICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVycm9yIj4KLSAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IntAc291cmNlfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxpbmUiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvZG9jdW1lbnQ+Ci0gICAgICA8L3JlZGlyZWN0OndyaXRlPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0ic3VtbWFyeSI+Ci0gICAgICA8c2VjdGlvbiBuYW1lPSJTdW1tYXJ5Ij4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZSkiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9ImNvdW50KGZpbGUvZXJyb3IpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZUVycm9yQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZVtjb3VudChlcnJvcikgIT0gMF0pIi8+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGg+RmlsZXM8L3RoPgotICAgICAgICAgICAgICAgIDx0aD5GaWxlcyBXaXRoIEVycm9yczwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGVDb3VudCIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlsZUVycm9yQ291bnQiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciPgotICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5vZGRyb3c8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmV2ZW5yb3c8L3hzbDppZj4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2NvdmVyYWdlLWZyYW1lcy54c2wgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvY292ZXJhZ2UtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjgwODkwOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvY292ZXJhZ2UtZnJhbWVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgeG1sbnM6cmVkaXJlY3Q9Im9yZy5hcGFjaGUueGFsYW4ubGliLlJlZGlyZWN0IgotICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIi8+Ci08eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Ci08IS0tCi0gICAgQ29weXJpZ2h0ICAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAKLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAKLS0tPgotCi08IS0tCi0KLSBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggSlByb2JlIDMuMCBYTUwgb3V0cHV0LgotCi0gSXQgY3JlYXRlcyBhIHNldCBvZiBIVE1MIGZpbGVzIGEgbGEgamF2YWRvYyB3aGVyZSB5b3UgY2FuIGJyb3dzZSBlYXNpbHkKLSB0aHJvdWdoIGFsbCBwYWNrYWdlcyBhbmQgY2xhc3Nlcy4KLQotIEl0IGlzIGJlc3QgdXNlZCB3aXRoIEpQcm9iZSBDb3ZlcmFnZSBBbnQgdGFzayB0aGF0IGdpdmVzIHlvdSB0aGUgYmVuZWZpdAotIG9mIGEgcmVmZXJlbmNlIGNsYXNzcGF0aCBzbyB0aGF0IHlvdSBoYXZlIHRoZSBsaXN0IG9mIGNsYXNzZXMvbWV0aG9kcwotIHRoYXQgYXJlIG5vdCB1c2VkIGF0IGFsbCBpbiBhIGdpdmVuIGNsYXNzcGF0aC4KLQotIEBhdXRob3IgU3RlcGhhbmUgQmFpbGxpZXogPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIi8+Ci0KLS0tPgotCi08IS0tIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSBpcyBjdXJyZW50IGRpcmVjdG9yeSAtLT4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm9vdCBlbGVtZW50Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSIvc25hcHNob3QiPgotICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZSIgbW9kZT0id3JpdGUiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRnJhbWVzZXQgZGVmaW5pdGlvbi4gRW50cnkgcG9pbnQgZm9yIHRoZSByZXBvcnQuCi0gICAgMyBmcmFtZXM6IHBhY2thZ2VMaXN0RnJhbWUsIGNsYXNzTGlzdEZyYW1lLCBjbGFzc0ZyYW1lCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPGh0bWw+Ci0gICAgPGhlYWQ+PHRpdGxlPkNvdmVyYWdlIFJlc3VsdHMuPC90aXRsZT48L2hlYWQ+Ci0gICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgotICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+Ci0gICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0gICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0gICAgICAgIDwvZnJhbWVzZXQ+Ci0gICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotICAgIDwvZnJhbWVzZXQ+Ci0gICAgPG5vZnJhbWVzPgotICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgotICAgICAgICA8cD4KLSAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0gICAgICAgIDwvcD4KLSAgICA8L25vZnJhbWVzPgotPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBTdHlsZXNoZWV0IENTUyB1c2VkCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KLSAgICAuYmFubmVyY2VsbCB7Ci0gICAgICBib3JkZXI6IDBweDsKLSAgICAgIHBhZGRpbmc6IDBweDsKLSAgICB9Ci0gICAgYm9keSB7Ci0gICAgICBtYXJnaW4tbGVmdDogMTA7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDEwOwotICAgICAgZm9udDpub3JtYWwgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKLSAgICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgfQotICAgIC5hIHRkIHsKLSAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7Ci0gICAgfQotICAgIC5iIHRkIHsKLSAgICAgIGJhY2tncm91bmQ6ICNmZmY7Ci0gICAgfQotICAgIHRoLCB0ZCB7Ci0gICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgICB9Ci0gICAgdGggewotICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgIGJhY2tncm91bmQ6ICNjY2M7Ci0gICAgICBjb2xvcjogYmxhY2s7Ci0gICAgfQotICAgIHRhYmxlLCB0aCwgdGQgewotICAgICAgZm9udC1zaXplOjEwMCU7Ci0gICAgICBib3JkZXI6IG5vbmUKLSAgICB9Ci0gICAgdGFibGUubG9nIHRyIHRkLCB0ciB0aCB7Ci0KLSAgICB9Ci0gICAgaDIgewotICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgIGZvbnQtc2l6ZToxNDAlOwotICAgICAgbWFyZ2luLWJvdHRvbTogNTsKLSAgICB9Ci0gICAgaDMgewotICAgICAgZm9udC1zaXplOjEwMCU7Ci0gICAgICBmb250LXdlaWdodDpib2xkOwotICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKLSAgICAgIGNvbG9yOiB3aGl0ZTsKLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICAgIHBhZGRpbmc6IDVweDsKLSAgICAgIG1hcmdpbi1yaWdodDogMnB4OwotICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKLSAgICAgIG1hcmdpbi1ib3R0b206IDA7Ci0gICAgfQotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBMaXN0IG9mIGFsbCBjbGFzc2VzIGluIGFsbCBwYWNrYWdlcwotICAgIFRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgY2xhc3NMaXN0RnJhbWUKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiLz4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhY2thZ2UvY2xhc3MiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsaW5rIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYWNrYWdlLm5hbWUsJy4nLCcvJykiLz48eHNsOnRleHQ+LzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9ImNsYXNzRnJhbWUiIGhyZWY9InskbGlua30iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbGlzdCBvZiBhbGwgcGFja2FnZXMgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJzbmFwc2hvdCIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayIvPgotICAgICAgICA8L2hlYWQ+Ci0gICAgICAgIDxib2R5PgotICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+Ci0gICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFja2FnZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gb3ZlcnZpZXcgb2Ygc3RhdGlzdGljcyBpbiBwYWNrYWdlcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiLz4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICA8aDM+U3VtbWFyeTwvaDM+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8IS0tdGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkRhdGU8L3RoPgotICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+RWxhcHNlZCB0aW1lPC90aC0tPgotICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+UmVwb3J0ZWQgQ2xhc3NlczwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5NZXRob2RzIEhpdDwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0ciBjbGFzcz0iYSI+Ci0gICAgICAgICAgICAgICAgPCEtLXRkIG5vd3JhcD0ibm93cmFwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXhlY3V0aW9uX2xvZy9AcHJvZ3JhbV9zdGFydCIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGV4ZWN1dGlvbl9sb2cvQGVsYXBzZWRfdGltZSBkaXYgMTAwMCwnMC4wJykiLz5zZWNzPC90ZC0tPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQocGFja2FnZS9jbGFzcykiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X21ldGhvZHMgZGl2IGNvdi5kYXRhL0B0b3RhbF9tZXRob2RzLCcwLjAlJykiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMsJzAuMCUnKSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0gICAgICAgIFRvIGVuc3VyZSBhY2N1cmF0ZSB0ZXN0IHJ1bnMgb24gSmF2YSBhcHBsaWNhdGlvbnMsIGRldmVsb3BlcnMgbmVlZCB0byBrbm93IGhvdyBtdWNoIG9mCi0gICAgICAgIHRoZSBjb2RlIGhhcyBiZWVuIHRlc3RlZCwgYW5kIHdoZXJlIHRvIGZpbmQgYW55IHVudGVzdGVkIGNvZGUuIENvdmVyYWdlIGhlbHBzIHlvdQotICAgICAgICBsb2NhdGUgdW50ZXN0ZWQgY29kZSwgYW5kIG1lYXN1cmUgcHJlY2lzZWx5IGhvdyBtdWNoIGNvZGUgaGFzIGJlZW4gZXhlcmNpc2VkLgotICAgICAgICBUaGUgcmVzdWx0IGlzIGEgaGlnaGVyIHF1YWxpdHkgYXBwbGljYXRpb24gaW4gYSBzaG9ydGVyIHBlcmlvZCBvZiB0aW1lLgotICAgICAgICA8cC8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGgzPlBhY2thZ2VzPC9oMz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwYWNrYWdlWzFdIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KLSAgICAgICAgICAgIDwhLS0gZGlzcGxheSBwYWNrYWdlcyBhbmQgc29ydCB0aGVtIHZpYSB0aGVpciBjb3ZlcmFnZSByYXRlIC0tPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhY2thZ2UiPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgc2VsZWN0PSJjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMiLz4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcywnMC4wJScpIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIi8+Ci0gICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLSBkZXRhaWxlZCBpbmZvIGZvciBhIHBhY2thZ2UuIEl0IHdpbGwgb3V0cHV0IHRoZSBsaXN0IG9mIGNsYXNzZXMKLSwgdGhlIHN1bW1hcnkgcGFnZSwgYW5kIHRoZSBpbmZvIGZvciBlYWNoIGNsYXNzCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9IndyaXRlIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmFtZSA9ICcnIj4uPC94c2w6aWY+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzZXMubGlzdCIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ii8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjbGFzcyI+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KLSAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlIiBtb2RlPSJjbGFzc2VzLmxpc3QiPgotICAgIDxodG1sPgotICAgICAgICA8SEVBRD4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L0hFQUQ+Ci0gICAgICAgIDxCT0RZPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvSDI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgICAgIDxIMj5DbGFzc2VzPC9IMj4KLSAgICAgICAgICAgIDxUQUJMRSBXSURUSD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNsYXNzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwvVEFCTEU+Ci0gICAgICAgIDwvQk9EWT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBzdW1tYXJ5IG9mIGEgcGFja2FnZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgPEhUTUw+Ci0gICAgICAgIDxIRUFEPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvSEVBRD4KLSAgICAgICAgPCEtLSB3aGVuIGxvYWRpbmcgdGhpcyBwYWNrYWdlLCBpdCB3aWxsIG9wZW4gdGhlIGNsYXNzZXMgaW50byB0aGUgZnJhbWUgLS0+Ci0gICAgICAgIDxCT0RZIG9ubG9hZD0ib3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKSI+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KLSAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzLmhlYWRlciIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ic3RhdHMiLz4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoY2xhc3MpICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgPEgzPkNsYXNzZXM8L0gzPgotICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjbGFzcyIgbW9kZT0ic3RhdHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IGRhdGEtdHlwZT0ibnVtYmVyIiBzZWxlY3Q9ImNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KLSAgICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGRldGFpbHMgb2YgYSBjbGFzcyAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLz4KLSAgICA8SFRNTD4KLSAgICAgICAgPEhFQUQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L0hFQUQ+Ci0gICAgICAgIDxCT0RZPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgICAgICAgIDxIMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L0gzPgotCi0gICAgICAgICAgICA8IS0tIGNsYXNzIHN1bW1hcnkgLS0+Ci0gICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzIi8+Ci0gICAgICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgICAgICA8IS0tIGRldGFpbHMgb2YgbWV0aG9kcyAtLT4KLSAgICAgICAgICAgIDxIMz5NZXRob2RzPC9IMz4KLSAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1ldGhvZFsxXSIgbW9kZT0ic3RhdHMuaGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZXRob2QiIG1vZGU9InN0YXRzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IGRhdGEtdHlwZT0ibnVtYmVyIiBzZWxlY3Q9ImNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcyIvPgotICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgotICAgICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBQYWdlIEhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+Ci0gIDwhLS0gamFrYXJ0YSBsb2dvIC0tPgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iYmFubmVyY2VsbCIgcm93c3Bhbj0iMiI+Ci0gICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+Ci0gICAgICA8aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWx0PSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+Ci0gICAgICA8L2E+Ci0gICAgPC90ZD4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgQ292ZXJhZ2U8L2gyPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5zaXRyYWthLmNvbS9qcHJvYmUnPlNpdHJha2EgSlByb2JlPC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgotICAgICAgICA8L3RyPgotICA8L3RhYmxlPgotICAgIDxociBzaXplPSIxIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBQYWdlIEZvb3RlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+PGhyIG5vc2hhZGU9InllcyIgc2l6ZT0iMSIvPjwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+Ci0gICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjNTI1RDc2IiBzaXplPSItMSI+PGVtPgotICAgICAgQ29weXJpZ2h0ICYjMTY5OyAxOTk5LTIwMDEsIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAgICA8L2VtPjwvZm9udD48L2Rpdj4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJsZS5oZWFkZXIiPgotICAgIDx0cj4KLSAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPk1ldGhvZHMgSGl0PC90aD4KLSAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJzdGF0cy5oZWFkZXIiPgotICAgIDx0cj4KLSAgICAgICAgPHRoIHdpZHRoPSI5MCUiPk5hbWU8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkxpbmVzIEhpdDwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJzdGF0cyI+Ci0gICAgPHRyPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciLz4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzLCcwLjAlJykiLz4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2V8Y2xhc3MiIG1vZGU9InN0YXRzLmhlYWRlciI+Ci0gICAgPHRyPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+Ci0gICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TWV0aG9kcyBIaXQ8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkxpbmVzIEhpdDwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZXxjbGFzcyIgbW9kZT0ic3RhdHMiPgotICAgIDx0cj4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+Ci0gICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcywnMC4wJScpIi8+PC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLSAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS5iLmMgdG8gLi4vLi4vLi4vCi0gICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0gICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KLSAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgotICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICA8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gICAgPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIFRJVExFPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvTElOSz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGFsdGVybmF0ZWQgcm93IHN0eWxlIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ij4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+YTwveHNsOmlmPgotICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5iPC94c2w6aWY+Ci08L3hzbDphdHRyaWJ1dGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KLQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvamRlcGVuZC1mcmFtZXMueHNsIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2pkZXBlbmQtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EyYThhZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvamRlcGVuZC1mcmFtZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCi0gIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgIDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIAotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgIAotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgIAotLS0+Ci08IS0tCi0KLSBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggSkRlcGVuZCBYTUwgb3V0cHV0LgotCi0gSXQgY3JlYXRlcyBhIHNldCBvZiBIVE1MIGZpbGVzIGEgbGEgamF2YWRvYyB3aGVyZSB5b3UgY2FuIGJyb3dzZSBlYXNpbHkKLSB0aHJvdWdoIGFsbCBwYWNrYWdlcyBhbmQgY2xhc3Nlcy4KLQotIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmp0dWxsZXlAbm92ZWxsLmNvbSI+SmVmZiBUdWxsZXk8L2E+Ci0KLSAgLS0+Ci08eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiPgotICAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+Ci0gICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+Ci0gICA8L3JlZGlyZWN0OndyaXRlPgotCi0gIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KLSAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgotICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLSAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icGFja2FnZXMuZGV0YWlscyIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctY3ljbGVzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1jeWNsZXMuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjeWNsZXMuZGV0YWlscyIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctY3ljbGVzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJleHBsYW5hdGlvbnMiLz4KLSAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGwtcGFja2FnZXMuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJQYWNrYWdlcyIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+Ci0gIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jeWNsZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLSAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsLWN5Y2xlcy5odG1sIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkN5Y2xlcyIgbW9kZT0iYWxsLmN5Y2xlcyIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KLTxodG1sPgotICAgPGhlYWQ+Ci0gICAgICA8dGl0bGU+SkRlcGVuZCBBbmFseXNpczwvdGl0bGU+Ci0gICA8L2hlYWQ+Ci0gICAgICA8ZnJhbWVzZXQgY29scz0iMjAlLDgwJSI+Ci0gICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+Ci0gICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGwtcGFja2FnZXMuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgotICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsLWN5Y2xlcy5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgotICAgICAgICAgPC9mcmFtZXNldD4KLSAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotICAgICAgPC9mcmFtZXNldD4KLSAgICAgIDxub2ZyYW1lcz4KLSAgICAgICAgIDxoMj5GcmFtZSBBbGVydDwvaDI+Ci0gICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotICAgICAgICAgPC9wPgotICAgICAgPC9ub2ZyYW1lcz4KLTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KLSAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgYm9keSB7Ci0gICAgZm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOwotICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgfQotICAgIHRhYmxlIHRyIHRkLCB0ciB0aCB7Ci0gICAgICBmb250LXNpemU6IDY4JTsKLSAgICB9Ci0gICAgdGFibGUuZGV0YWlscyB0ciB0aHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICB0ZXh0LWFsaWduOmxlZnQ7Ci0gICAgYmFja2dyb3VuZDojYTZjYWYwOwotICAgIH0KLSAgICB0YWJsZS5kZXRhaWxzIHRyIHRkewotICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKLSAgICB9Ci0KLSAgICBwIHsKLSAgICBsaW5lLWhlaWdodDoxLjVlbTsKLSAgICBtYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOwotICAgIG1hcmdpbi1sZWZ0OjJlbTsKLSAgICBtYXJnaW4tcmlnaHQ6MmVtOwotICAgIH0KLSAgICBoMSB7Ci0gICAgbWFyZ2luOiAwcHggMHB4IDVweDsgZm9udDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgIH0KLSAgICBoMiB7Ci0gICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgfQotICAgIGgzIHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgfQotICAgIGg0IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgfQotICAgIGg1IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgfQotICAgIGg2IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgfQotICAgIC5FcnJvciB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotICAgIH0KLSAgICAuRmFpbHVyZSB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOwotICAgIH0KLSAgICAuUHJvcGVydGllcyB7Ci0gICAgdGV4dC1hbGlnbjpyaWdodDsKLSAgICB9Ci0gIDwvc3R5bGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZCIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgotICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIGFsaWduPSJsZWZ0Ij48aDI+U3VtbWFyeTwvaDI+PHRkPgotICA8L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgotICBbc3VtbWFyeV0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiPnBhY2thZ2VzPC9hPl0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LWN5Y2xlcy5odG1sIj5jeWNsZXM8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiPmV4cGxhbmF0aW9uczwvYT5dCi0gICA8L3RkPjwvdHI+PC90YWJsZT4KLSAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9ImRldGFpbHMiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgPHRoPlBhY2thZ2U8L3RoPgotICAgICAgICAgICAgICAgPHRoPlRvdGFsIENsYXNzZXM8L3RoPgotICAgICAgICAgICAgICAgPHRoPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYbnVtYmVyIj5BYnN0cmFjdCBDbGFzc2VzPC9hPjwvdGg+Ci0gICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhudW1iZXIiPkNvbmNyZXRlIENsYXNzZXM8L2E+PC90aD4KLSAgICAgICAgICAgICAgIDx0aD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGFmZmVyZW50Ij5BZmZlcmVudCBDb3VwbGluZ3M8L2E+PC90aD4KLSAgICAgICAgICAgICAgIDx0aD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGVmZmVyZW50Ij5FZmZlcmVudCBDb3VwbGluZ3M8L2E+PC90aD4KLSAgICAgICAgICAgICAgIDx0aD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGFic3RyYWN0bmVzcyI+QWJzdHJhY3RuZXNzPC9hPjwvdGg+Ci0gICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+PC90aD4KLSAgICAgICAgICAgICAgIDx0aD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT48L3RoPgotCi0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vUGFja2FnZXMvUGFja2FnZSI+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGVycm9yKSA9IDAiPgotICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+b3ZlcnZpZXctcGFja2FnZXMuaHRtbCNQSzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL1RvdGFsQ2xhc3NlcyIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQWJzdHJhY3RDbGFzc2VzIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9Db25jcmV0ZUNsYXNzZXMiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0NhIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvSSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvRCIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChlcnJvcikgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIGNvbHNwYW49IjgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJlcnJvciIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2JvZHk+Ci0gICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZCIgbW9kZT0icGFja2FnZXMuZGV0YWlscyI+Ci0gICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIGFsaWduPSJsZWZ0Ij48aDI+UGFja2FnZXM8L2gyPjx0ZD4KLSAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+c3VtbWFyeTwvYT5dCi0gIFtwYWNrYWdlc10KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LWN5Y2xlcy5odG1sIj5jeWNsZXM8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiPmV4cGxhbmF0aW9uczwvYT5dCi0gICA8L3RkPjwvdHI+PC90YWJsZT4KLQotICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9QYWNrYWdlcy9QYWNrYWdlIj4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGVycm9yKSA9IDAiPgotICAgICAgPGgzPjxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPlBLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvaDM+Ci0KLSAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPgotICAgICAgICA8dGQ+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhhZmZlcmVudCI+QWZmZXJlbnQgQ291cGxpbmdzPC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0NhIi8+PC90ZD4KLSAgICAgICAgPHRkPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYZWZmZXJlbnQiPkVmZmVyZW50IENvdXBsaW5nczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DZSIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGFic3RyYWN0bmVzcyI+QWJzdHJhY3RuZXNzPC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0EiLz48L3RkPgotICAgICAgICA8dGQ+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvSSIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9EIi8+PC90ZD4KLSAgICAgIDwvdHI+PC90YWJsZT4KLQotICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjbGFzcz0iZGV0YWlscyI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGg+QWJzdHJhY3QgQ2xhc3NlczwvdGg+Ci0gICAgICAgICAgPHRoPkNvbmNyZXRlIENsYXNzZXM8L3RoPgotICAgICAgICAgIDx0aD5Vc2VkIGJ5IFBhY2thZ2VzPC90aD4KLSAgICAgICAgICA8dGg+VXNlcyBQYWNrYWdlczwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQWJzdHJhY3RDbGFzc2VzL0NsYXNzKT0wIj4KLSAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkFic3RyYWN0Q2xhc3Nlcy9DbGFzcyI+Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkiLz48YnIvPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChDb25jcmV0ZUNsYXNzZXMvQ2xhc3MpPTAiPgotICAgICAgICAgICAgICA8aT5Ob25lPC9pPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQ29uY3JldGVDbGFzc2VzL0NsYXNzIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjxici8+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI1JSI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KFVzZWRCeS9QYWNrYWdlKT0wIj4KLSAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlVzZWRCeS9QYWNrYWdlIj4KLSAgICAgICAgICAgICAgPGE+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5vdmVydmlldy1wYWNrYWdlcy5odG1sI1BLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgICAgICAgICAgIDwvYT48YnIvPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChEZXBlbmRzVXBvbi9QYWNrYWdlKT0wIj4KLSAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkRlcGVuZHNVcG9uL1BhY2thZ2UiPgotICAgICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPm92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwjUEs8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkiLz4KLSAgICAgICAgICAgICAgPC9hPjxici8+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwhLS0gdGhpcyBpcyBvZnRlbiBhIGxvbmcgbGlzdGluZzsgcHJvdmlkZSBhIGxvd2VyIG5hdmlnYXRpb24gdGFibGUgYWxzbyAtLT4KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjx0ZD48L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5zdW1tYXJ5PC9hPl0KLSAgW3BhY2thZ2VzXQotICBbPGEgaHJlZj0ib3ZlcnZpZXctY3ljbGVzLmh0bWwiPmN5Y2xlczwvYT5dCi0gIFs8YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCI+ZXhwbGFuYXRpb25zPC9hPl0KLSAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgICAgPC9ib2R5PgotICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiIG1vZGU9ImN5Y2xlcy5kZXRhaWxzIj4KLSAgIDxodG1sPgotICAgICAgPGhlYWQ+Ci0gICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgotICAgICAgPC9oZWFkPgotICAgICAgPGJvZHk+Ci0gICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PGgyPkN5Y2xlczwvaDI+PHRkPgotICA8L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5zdW1tYXJ5PC9hPl0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiPnBhY2thZ2VzPC9hPl0KLSAgW2N5Y2xlc10KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIj5leHBsYW5hdGlvbnM8L2E+XQotICAgPC90ZD48L3RyPjwvdGFibGU+Ci0gIDwhLS08dGFibGUgd2lkdGg9IjEwMCUiPjx0cj48dGQ+Ci0gIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+Ci0gICAgWzxhIGhyZWY9IiNOVnN1bW1hcnkiPnN1bW1hcnk8L2E+XQotICBbPGEgaHJlZj0iI05WcGFja2FnZXMiPnBhY2thZ2VzPC9hPl0KLSAgWzxhIGhyZWY9IiNOVmN5Y2xlcyI+Y3ljbGVzPC9hPl0KLSAgIFs8YSBocmVmPSIjTlZleHBsYW5hdGlvbnMiPmV4cGxhbmF0aW9uczwvYT5dCi0gIDwvdGQ+PC90cj48L3RhYmxlPiAtLT4KLQotICA8eHNsOmlmIHRlc3Q9ImNvdW50KEN5Y2xlcy9QYWNrYWdlKSA9IDAiPgotICAgIDxwPlRoZXJlIGFyZSBubyBjeWNsaWMgZGVwZW5kYW5jaWVzLjwvcD4KLSAgPC94c2w6aWY+Ci0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJDeWNsZXMvUGFja2FnZSI+Ci0gICAgIDxoMz48YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4jQ1k8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQE5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+PC9hPjwvaDM+PHA+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlBhY2thZ2UiPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48YnIvPgotICAgIDwveHNsOmZvci1lYWNoPjwvcD4KLSAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwhLS0gdGhpcyBpcyBvZnRlbiBhIGxvbmcgbGlzdGluZzsgcHJvdmlkZSBhIGxvd2VyIG5hdmlnYXRpb24gdGFibGUgYWxzbyAtLT4KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjx0ZD48L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5zdW1tYXJ5PC9hPl0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiPnBhY2thZ2VzPC9hPl0KLSAgW2N5Y2xlc10KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIj5leHBsYW5hdGlvbnM8L2E+XQotICAgPC90ZD48L3RyPjwvdGFibGU+Ci0gIDwvYm9keT4KLSAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiIG1vZGU9ImV4cGxhbmF0aW9ucyI+Ci0gICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLQotICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PGgyPkV4cGxhbmF0aW9uczwvaDI+PHRkPgotICA8L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5zdW1tYXJ5PC9hPl0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiPnBhY2thZ2VzPC9hPl0KLSAgWzxhIGhyZWY9Im92ZXJ2aWV3LWN5Y2xlcy5odG1sIj5jeWNsZXM8L2E+XQotICBbZXhwbGFuYXRpb25zXQotICAgPC90ZD48L3RyPjwvdGFibGU+Ci0KLSAgPHA+VGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbnMgYXJlIGZvciBxdWljayByZWZlcmVuY2UgYW5kIGFyZSBsaWZ0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgb3JpZ2luYWwgPGEgaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+SkRlcGVuZCBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci0KLSAgPGgzPjxhIG5hbWU9IkVYbnVtYmVyIj5OdW1iZXIgb2YgQ2xhc3NlczwvYT48L2gzPgotICAgIDxwPlRoZSBudW1iZXIgb2YgY29uY3JldGUgYW5kIGFic3RyYWN0IGNsYXNzZXMgKGFuZCBpbnRlcmZhY2VzKSBpbiB0aGUgcGFja2FnZSBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIGV4dGVuc2liaWxpdHkgb2YgdGhlIHBhY2thZ2UuPC9wPgotICA8aDM+PGEgbmFtZT0iRVhhZmZlcmVudCI+QWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvaDM+Ci0gICAgPHA+VGhlIG51bWJlciBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGRlcGVuZCB1cG9uIGNsYXNzZXMgd2l0aGluIHRoZSBwYWNrYWdlIGlzIGFuIGluZGljYXRvciBvZiB0aGUgcGFja2FnZSdzIHJlc3BvbnNpYmlsaXR5LiA8L3A+Ci0gIDxoMz48YSBuYW1lPSJFWGVmZmVyZW50Ij5FZmZlcmVudCBDb3VwbGluZ3M8L2E+PC9oMz4KLSAgICA8cD5UaGUgbnVtYmVyIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgdGhlIGNsYXNzZXMgaW4gdGhlIHBhY2thZ2UgZGVwZW5kIHVwb24gaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgaW5kZXBlbmRlbmNlLiA8L3A+Ci0gIDxoMz48YSBuYW1lPSJFWGFic3RyYWN0bmVzcyI+QWJzdHJhY3RuZXNzPC9hPjwvaDM+Ci0gICAgPHA+VGhlIHJhdGlvIG9mIHRoZSBudW1iZXIgb2YgYWJzdHJhY3QgY2xhc3NlcyAoYW5kIGludGVyZmFjZXMpIGluIHRoZSBhbmFseXplZCBwYWNrYWdlIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY2xhc3NlcyBpbiB0aGUgYW5hbHl6ZWQgcGFja2FnZS4gPC9wPgotICAgIDxwPlRoZSByYW5nZSBmb3IgdGhpcyBtZXRyaWMgaXMgMCB0byAxLCB3aXRoIEE9MCBpbmRpY2F0aW5nIGEgY29tcGxldGVseSBjb25jcmV0ZSBwYWNrYWdlIGFuZCBBPTEgaW5kaWNhdGluZyBhIGNvbXBsZXRlbHkgYWJzdHJhY3QgcGFja2FnZS4gPC9wPgotICA8aDM+PGEgbmFtZT0iRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+PC9oMz4KLSAgICA8cD5UaGUgcmF0aW8gb2YgZWZmZXJlbnQgY291cGxpbmcgKENlKSB0byB0b3RhbCBjb3VwbGluZyAoQ2UgLyAoQ2UgKyBDYSkpLiBUaGlzIG1ldHJpYyBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIHBhY2thZ2UncyByZXNpbGllbmNlIHRvIGNoYW5nZS4gPC9wPgotICAgIDxwPlRoZSByYW5nZSBmb3IgdGhpcyBtZXRyaWMgaXMgMCB0byAxLCB3aXRoIEk9MCBpbmRpY2F0aW5nIGEgY29tcGxldGVseSBzdGFibGUgcGFja2FnZSBhbmQgST0xIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IGluc3RhYmxlIHBhY2thZ2UuIDwvcD4KLSAgPGgzPjxhIG5hbWU9IkVYZGlzdGFuY2UiPkRpc3RhbmNlPC9hPjwvaDM+Ci0gICAgPHA+VGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2Ugb2YgYSBwYWNrYWdlIGZyb20gdGhlIGlkZWFsaXplZCBsaW5lIEEgKyBJID0gMS4gVGhpcyBtZXRyaWMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgYmFsYW5jZSBiZXR3ZWVuIGFic3RyYWN0bmVzcyBhbmQgc3RhYmlsaXR5LiA8L3A+Ci0gICAgPHA+QSBwYWNrYWdlIHNxdWFyZWx5IG9uIHRoZSBtYWluIHNlcXVlbmNlIGlzIG9wdGltYWxseSBiYWxhbmNlZCB3aXRoIHJlc3BlY3QgdG8gaXRzIGFic3RyYWN0bmVzcyBhbmQgc3RhYmlsaXR5LiBJZGVhbCBwYWNrYWdlcyBhcmUgZWl0aGVyIGNvbXBsZXRlbHkgYWJzdHJhY3QgYW5kIHN0YWJsZSAoeD0wLCB5PTEpIG9yIGNvbXBsZXRlbHkgY29uY3JldGUgYW5kIGluc3RhYmxlICh4PTEsIHk9MCkuIDwvcD4KLSAgICA8cD5UaGUgcmFuZ2UgZm9yIHRoaXMgbWV0cmljIGlzIDAgdG8gMSwgd2l0aCBEPTAgaW5kaWNhdGluZyBhIHBhY2thZ2UgdGhhdCBpcyBjb2luY2lkZW50IHdpdGggdGhlIG1haW4gc2VxdWVuY2UgYW5kIEQ9MSBpbmRpY2F0aW5nIGEgcGFja2FnZSB0aGF0IGlzIGFzIGZhciBmcm9tIHRoZSBtYWluIHNlcXVlbmNlIGFzIHBvc3NpYmxlLiA8L3A+Ci0KLSAgICAgIDwvYm9keT4KLSAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLUNyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlIGxpbmtzIGluIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwuCi0gIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJKRGVwZW5kL1BhY2thZ2VzIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PHRkPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIiBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPnN1bW1hcnk8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctcGFja2FnZXMuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5wYWNrYWdlczwvYT5dCi0gIFs8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5jeWNsZXM8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+ZXhwbGFuYXRpb25zPC9hPl0KLSAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgICAgPGgyPlBhY2thZ2VzPC9oMj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlBhY2thZ2VbY291bnQoZXJyb3IpPTBdIiBtb2RlPSJhbGwucGFja2FnZXMubGluayI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlBhY2thZ2VbY291bnQoZXJyb3IpICZndDsgMF0iIG1vZGU9ImFsbC5wYWNrYWdlcy5ub2xpbmsiPgotICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZC9QYWNrYWdlcy9QYWNrYWdlIiBtb2RlPSJhbGwucGFja2FnZXMubGluayI+Ci0gIDx0cj4KLSAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgPGEgaHJlZj0ib3ZlcnZpZXctcGFja2FnZXMuaHRtbCNQS3tAbmFtZX0iIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgPC9hPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLQotSSBkbyBub3Qga25vdyBKRGVwZW5kIGVub3VnaCB0byBrbm93IGlmIGV2ZXJ5IGVycm9yIHJlc3VsdHMgaW4gYSBub24tYW5hbHl6ZWQgcGFja2FnZSwKLWJ1dCB0aGF0IGlzIGhvdyBJIGFtIHByZXNlbnRpbmcgaXQgdG8gdGhlIHZpZXdlci4gIFRoaXMgbWF5IG5lZWQgdG8gY2hhbmdlLgotICBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGhlcmUsIEkgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGhhbmRsZSB1bm5hbWVkIHBhY2thZ2UgOigKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZC9QYWNrYWdlcy9QYWNrYWdlIiBtb2RlPSJhbGwucGFja2FnZXMubm9saW5rIj4KLSAgPHRyPgotICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgTm90IEFuYWx5emVkOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0KLUNyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlIGxpbmtzIGluIG92ZXJ2aWV3LWN5Y2xlcy5odG1sLgotICBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGhlcmUsIEkgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGhhbmRsZSB1bm5hbWVkIHBhY2thZ2UgOigKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZC9DeWNsZXMiIG1vZGU9ImFsbC5jeWNsZXMiPgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PHRkPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIiBhbGlnbj0icmlnaHQiPgotICBbPGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPnN1bW1hcnk8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctcGFja2FnZXMuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5wYWNrYWdlczwvYT5dCi0gIFs8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5jeWNsZXM8L2E+XQotICBbPGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+ZXhwbGFuYXRpb25zPC9hPl0KLSAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgICAgPGgyPkN5Y2xlczwvaDI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iUGFja2FnZSIgbW9kZT0iYWxsLmN5Y2xlcyI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJATmFtZSIvPgotICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgPC90YWJsZT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJKRGVwZW5kL0N5Y2xlcy9QYWNrYWdlIiBtb2RlPSJhbGwuY3ljbGVzIj4KLSAgPHRyPgotICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICA8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCNDWXtATmFtZX0iIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+PC9hPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBQYWdlIEhFQURFUiAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+Ci0gICA8aDE+SkRlcGVuZCBBbmFseXNpczwvaDE+Ci0gIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gIDx0cj4KLSAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+SkRlcGVuZDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciPkFudDwvYT4uPC90ZD4KLSAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2pkZXBlbmQueHNsIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2pkZXBlbmQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWU1ZTJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qZGVwZW5kLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0KLTwhLS0KLSAgICBDb3B5cmlnaHQgIDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIAotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgIAotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgIAotLS0+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiICBlbmNvZGluZz0iVVMtQVNDSUkiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5KRGVwZW5kIEFuYWx5c2lzPC90aXRsZT4KLSAgICAgICAgCi0gICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgIGJvZHkgewotICAgICAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgICB9Ci0gICAgICB0YWJsZSB0ciB0ZCwgdHIgdGggewotICAgICAgICAgIGZvbnQtc2l6ZTogNjglOwotICAgICAgfQotICAgICAgdGFibGUuZGV0YWlscyB0ciB0aHsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIHRleHQtYWxpZ246bGVmdDsKLSAgICAgICAgYmFja2dyb3VuZDojYTZjYWYwOwotICAgICAgfQotICAgICAgdGFibGUuZGV0YWlscyB0ciB0ZHsKLSAgICAgICAgYmFja2dyb3VuZDojZWVlZWUwOwotICAgICAgfQotICAgICAgCi0gICAgICBwIHsKLSAgICAgICAgbGluZS1oZWlnaHQ6MS41ZW07Ci0gICAgICAgIG1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07Ci0gICAgICAgIG1hcmdpbi1sZWZ0OjJlbTsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OjJlbTsKLSAgICAgIH0KLSAgICAgIGgxIHsKLSAgICAgICAgbWFyZ2luOiAwcHggMHB4IDVweDsgZm9udDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgaDIgewotICAgICAgICBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLSAgICAgIH0KLSAgICAgIGgzIHsKLSAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgaDQgewotICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgICB9Ci0gICAgICBoNSB7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLSAgICAgIH0KLSAgICAgIGg2IHsKLSAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgLkVycm9yIHsKLSAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotICAgICAgfQotICAgICAgLkZhaWx1cmUgewotICAgICAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpwdXJwbGU7Ci0gICAgICB9Ci0gICAgICAuUHJvcGVydGllcyB7Ci0gICAgICAgIHRleHQtYWxpZ246cmlnaHQ7Ci0gICAgICB9Ci0gICAgICA8L3N0eWxlPgotICAgICAgICAKLSAgICAgICAgCi0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgIDwhLS1oMT5KRGVwZW5kIFJlcG9ydDwvaDE+Ci0gICAgPHVsPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgIDxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2xpPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdWwtLT4KLSAgICAKLSAgICA8aDE+PGEgbmFtZT0idG9wIj5KRGVwZW5kIEFuYWx5c2lzPC9hPjwvaDE+Ci0gICAgPHAgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+SkRlcGVuZDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciPkFudDwvYT4uPC9wPgotICAgIDxociBzaXplPSIyIiAvPgotICAgIAotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KLSAgICA8YSBuYW1lPSJOVnN1bW1hcnkiPjxoMj5TdW1tYXJ5PC9oMj48L2E+Ci0gICAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KLSAgICBbPGEgaHJlZj0iI05Wc3VtbWFyeSI+c3VtbWFyeTwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVnBhY2thZ2VzIj5wYWNrYWdlczwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVmN5Y2xlcyI+Y3ljbGVzPC9hPl0KLSAgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQotICAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgIAotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9ImRldGFpbHMiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+UGFja2FnZTwvdGg+Ci0gICAgICAgICAgICA8dGg+VG90YWwgQ2xhc3NlczwvdGg+Ci0gICAgICAgICAgICA8dGg+PGEgaHJlZj0iI0VYbnVtYmVyIj5BYnN0cmFjdCBDbGFzc2VzPC9hPjwvdGg+Ci0gICAgICAgICAgICA8dGg+PGEgaHJlZj0iI0VYbnVtYmVyIj5Db25jcmV0ZSBDbGFzc2VzPC9hPjwvdGg+Ci0gICAgICAgICAgICA8dGg+PGEgaHJlZj0iI0VYYWZmZXJlbnQiPkFmZmVyZW50IENvdXBsaW5nczwvYT48L3RoPgotICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWGVmZmVyZW50Ij5FZmZlcmVudCBDb3VwbGluZ3M8L2E+PC90aD4KLSAgICAgICAgICAgIDx0aD48YSBocmVmPSIjRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT48L3RoPgotICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWGluc3RhYmlsaXR5Ij5JbnN0YWJpbGl0eTwvYT48L3RoPgotICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT48L3RoPgotICAgICAgICAgICAgCi0gICAgICAgIDwvdHI+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vUGFja2FnZXMvUGFja2FnZSI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoZXJyb3IpID0gMCI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGE+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPiNQSzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvVG90YWxDbGFzc2VzIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQWJzdHJhY3RDbGFzc2VzIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ29uY3JldGVDbGFzc2VzIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ2EiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0EiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9JIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvRCIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGVycm9yKSAmZ3Q7IDAiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSI4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3IiLz48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC90YWJsZT4KLSAgICAKLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj48dGQ+Ci0gICAgPGEgbmFtZT0iTlZwYWNrYWdlcyI+PGgyPlBhY2thZ2VzPC9oMj48L2E+Ci0gICAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KLSAgICBbPGEgaHJlZj0iI05Wc3VtbWFyeSI+c3VtbWFyeTwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVnBhY2thZ2VzIj5wYWNrYWdlczwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVmN5Y2xlcyI+Y3ljbGVzPC9hPl0KLSAgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQotICAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgIAotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGVycm9yKSA9IDAiPgotICAgICAgICAgICAgPGgzPjxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPlBLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvaDM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPgotICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjRVhhZmZlcmVudCI+QWZmZXJlbnQgQ291cGxpbmdzPC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0NhIi8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI0VYZWZmZXJlbnQiPkVmZmVyZW50IENvdXBsaW5nczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DZSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiNFWGFic3RyYWN0bmVzcyI+QWJzdHJhY3RuZXNzPC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0EiLz48L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvSSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiNFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9EIi8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+PC90YWJsZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjbGFzcz0iZGV0YWlscyI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGg+QWJzdHJhY3QgQ2xhc3NlczwvdGg+Ci0gICAgICAgICAgICAgICAgICAgIDx0aD5Db25jcmV0ZSBDbGFzc2VzPC90aD4KLSAgICAgICAgICAgICAgICAgICAgPHRoPlVzZWQgYnkgUGFja2FnZXM8L3RoPgotICAgICAgICAgICAgICAgICAgICA8dGg+VXNlcyBQYWNrYWdlczwvdGg+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI1JSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQWJzdHJhY3RDbGFzc2VzL0NsYXNzKT0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5Ob25lPC9pPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQWJzdHJhY3RDbGFzc2VzL0NsYXNzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PGJyLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChDb25jcmV0ZUNsYXNzZXMvQ2xhc3MpPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPk5vbmU8L2k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJDb25jcmV0ZUNsYXNzZXMvQ2xhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkiLz48YnIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI1JSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KFVzZWRCeS9QYWNrYWdlKT0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5Ob25lPC9pPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iVXNlZEJ5L1BhY2thZ2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jUEs8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjxici8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoRGVwZW5kc1Vwb24vUGFja2FnZSk9MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkRlcGVuZHNVcG9uL1BhY2thZ2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jUEs8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjxici8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgCi0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkPgotICAgIDxhIG5hbWU9Ik5WY3ljbGVzIj48aDI+Q3ljbGVzPC9oMj48L2E+Ci0gICAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KLSAgICBbPGEgaHJlZj0iI05Wc3VtbWFyeSI+c3VtbWFyeTwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVnBhY2thZ2VzIj5wYWNrYWdlczwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVmN5Y2xlcyI+Y3ljbGVzPC9hPl0KLSAgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQotICAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgIAotICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQ3ljbGVzL1BhY2thZ2UpID0gMCI+Ci0gICAgICAgIDxwPlRoZXJlIGFyZSBubyBjeWNsaWMgZGVwZW5kYW5jaWVzLjwvcD4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQ3ljbGVzL1BhY2thZ2UiPgotICAgICAgICA8aDM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+PC9oMz48cD4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlBhY2thZ2UiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48YnIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD48L3A+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgCi0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkPgotICAgIDxhIG5hbWU9Ik5WZXhwbGFuYXRpb25zIj48aDI+RXhwbGFuYXRpb25zPC9oMj48L2E+Ci0gICAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KLSAgICBbPGEgaHJlZj0iI05Wc3VtbWFyeSI+c3VtbWFyeTwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVnBhY2thZ2VzIj5wYWNrYWdlczwvYT5dCi0gICAgWzxhIGhyZWY9IiNOVmN5Y2xlcyI+Y3ljbGVzPC9hPl0KLSAgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQotICAgIDwvdGQ+PC90cj48L3RhYmxlPgotICAgIAotICAgIDxwPlRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBmb3IgcXVpY2sgcmVmZXJlbmNlIGFuZCBhcmUgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgotICAgIAotICAgIDxoMz48YSBuYW1lPSJFWG51bWJlciI+TnVtYmVyIG9mIENsYXNzZXM8L2E+PC9oMz4KLSAgICAgICAgPHA+VGhlIG51bWJlciBvZiBjb25jcmV0ZSBhbmQgYWJzdHJhY3QgY2xhc3NlcyAoYW5kIGludGVyZmFjZXMpIGluIHRoZSBwYWNrYWdlIGlzIGFuIGluZGljYXRvciBvZiB0aGUgZXh0ZW5zaWJpbGl0eSBvZiB0aGUgcGFja2FnZS48L3A+Ci0gICAgPGgzPjxhIG5hbWU9IkVYYWZmZXJlbnQiPkFmZmVyZW50IENvdXBsaW5nczwvYT48L2gzPgotICAgICAgICA8cD5UaGUgbnVtYmVyIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgZGVwZW5kIHVwb24gY2xhc3NlcyB3aXRoaW4gdGhlIHBhY2thZ2UgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgcmVzcG9uc2liaWxpdHkuIDwvcD4KLSAgICA8aDM+PGEgbmFtZT0iRVhlZmZlcmVudCI+RWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvaDM+Ci0gICAgICAgIDxwPlRoZSBudW1iZXIgb2Ygb3RoZXIgcGFja2FnZXMgdGhhdCB0aGUgY2xhc3NlcyBpbiB0aGUgcGFja2FnZSBkZXBlbmQgdXBvbiBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIHBhY2thZ2UncyBpbmRlcGVuZGVuY2UuIDwvcD4KLSAgICA8aDM+PGEgbmFtZT0iRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT48L2gzPiAKLSAgICAgICAgPHA+VGhlIHJhdGlvIG9mIHRoZSBudW1iZXIgb2YgYWJzdHJhY3QgY2xhc3NlcyAoYW5kIGludGVyZmFjZXMpIGluIHRoZSBhbmFseXplZCBwYWNrYWdlIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY2xhc3NlcyBpbiB0aGUgYW5hbHl6ZWQgcGFja2FnZS4gPC9wPgotICAgICAgICA8cD5UaGUgcmFuZ2UgZm9yIHRoaXMgbWV0cmljIGlzIDAgdG8gMSwgd2l0aCBBPTAgaW5kaWNhdGluZyBhIGNvbXBsZXRlbHkgY29uY3JldGUgcGFja2FnZSBhbmQgQT0xIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IGFic3RyYWN0IHBhY2thZ2UuIDwvcD4KLSAgICA8aDM+PGEgbmFtZT0iRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+PC9oMz4KLSAgICAgICAgPHA+VGhlIHJhdGlvIG9mIGVmZmVyZW50IGNvdXBsaW5nIChDZSkgdG8gdG90YWwgY291cGxpbmcgKENlIC8gKENlICsgQ2EpKS4gVGhpcyBtZXRyaWMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgcmVzaWxpZW5jZSB0byBjaGFuZ2UuIDwvcD4KLSAgICAgICAgPHA+VGhlIHJhbmdlIGZvciB0aGlzIG1ldHJpYyBpcyAwIHRvIDEsIHdpdGggST0wIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IHN0YWJsZSBwYWNrYWdlIGFuZCBJPTEgaW5kaWNhdGluZyBhIGNvbXBsZXRlbHkgaW5zdGFibGUgcGFja2FnZS4gPC9wPgotICAgIDxoMz48YSBuYW1lPSJFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT48L2gzPgotICAgICAgICA8cD5UaGUgcGVycGVuZGljdWxhciBkaXN0YW5jZSBvZiBhIHBhY2thZ2UgZnJvbSB0aGUgaWRlYWxpemVkIGxpbmUgQSArIEkgPSAxLiBUaGlzIG1ldHJpYyBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIHBhY2thZ2UncyBiYWxhbmNlIGJldHdlZW4gYWJzdHJhY3RuZXNzIGFuZCBzdGFiaWxpdHkuIDwvcD4KLSAgICAgICAgPHA+QSBwYWNrYWdlIHNxdWFyZWx5IG9uIHRoZSBtYWluIHNlcXVlbmNlIGlzIG9wdGltYWxseSBiYWxhbmNlZCB3aXRoIHJlc3BlY3QgdG8gaXRzIGFic3RyYWN0bmVzcyBhbmQgc3RhYmlsaXR5LiBJZGVhbCBwYWNrYWdlcyBhcmUgZWl0aGVyIGNvbXBsZXRlbHkgYWJzdHJhY3QgYW5kIHN0YWJsZSAoeD0wLCB5PTEpIG9yIGNvbXBsZXRlbHkgY29uY3JldGUgYW5kIGluc3RhYmxlICh4PTEsIHk9MCkuIDwvcD4KLSAgICAgICAgPHA+VGhlIHJhbmdlIGZvciB0aGlzIG1ldHJpYyBpcyAwIHRvIDEsIHdpdGggRD0wIGluZGljYXRpbmcgYSBwYWNrYWdlIHRoYXQgaXMgY29pbmNpZGVudCB3aXRoIHRoZSBtYWluIHNlcXVlbmNlIGFuZCBEPTEgaW5kaWNhdGluZyBhIHBhY2thZ2UgdGhhdCBpcyBhcyBmYXIgZnJvbSB0aGUgbWFpbiBzZXF1ZW5jZSBhcyBwb3NzaWJsZS4gPC9wPgotICAgIAotICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE0ZTQ1OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvanVuaXQtZnJhbWVzLXhhbGFuMS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKLSAgICB4bWxuczpzdHJpbmd1dGlscz0ieGFsYW46Ly9vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzIgotICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIvPgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPCEtLQotCi0gU2FtcGxlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCB3aXRoIEFudCBKVW5pdFJlcG9ydCBvdXRwdXQuCi0KLSBJdCBjcmVhdGVzIGEgc2V0IG9mIEhUTUwgZmlsZXMgYSBsYSBqYXZhZG9jIHdoZXJlIHlvdSBjYW4gYnJvd3NlIGVhc2lseQotIHRocm91Z2ggYWxsIHBhY2thZ2VzIGFuZCBjbGFzc2VzLgotCi0tLT4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIj4KLSAgICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLWNsYXNzZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIDwhLS1Qcm9jZXNzaW5nIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KLSAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIGEgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLSAgICA8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbQHBhY2thZ2UgPSAkbmFtZV0iPgotICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9Lmh0bWwiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+Ci0gICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KLSAgICAgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0tb3V0LnR4dCI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vc3lzdGVtLW91dCIgLz4KLSAgICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tZXJyKSE9MCI+Ci0gICAgICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9LWVyci50eHQiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuL3N5c3RlbS1lcnIiIC8+Ci0gICAgICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotICAgICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0cy48L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8ZnJhbWVzZXQgY29scz0iMjAlLDgwJSI+Ci0gICAgICAgIDxmcmFtZXNldCByb3dzPSIzMCUsNzAlIj4KLSAgICAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VMaXN0RnJhbWUiLz4KLSAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0iY2xhc3NMaXN0RnJhbWUiLz4KLSAgICAgICAgPC9mcmFtZXNldD4KLSAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJjbGFzc0ZyYW1lIi8+Ci0gICAgICAgIDxub2ZyYW1lcz4KLSAgICAgICAgICAgIDxoMj5GcmFtZSBBbGVydDwvaDI+Ci0gICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgPC9ub2ZyYW1lcz4KLSAgICA8L2ZyYW1lc2V0PgotPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gdGhpcyBpcyB0aGUgc3R5bGVzaGVldCBjc3MgdG8gdXNlIGZvciBuZWFybHkgZXZlcnl0aGluZyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiPgotYm9keSB7Ci0gICAgZm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOwotICAgIGNvbG9yOiMwMDAwMDA7Ci19Ci10YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggewotICAgIGZvbnQtc2l6ZTogNjglOwotfQotdGFibGUuZGV0YWlscyB0ciB0aHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICB0ZXh0LWFsaWduOmxlZnQ7Ci0gICAgYmFja2dyb3VuZDojYTZjYWYwOwotfQotdGFibGUuZGV0YWlscyB0ciB0ZHsKLSAgICBiYWNrZ3JvdW5kOiNlZWVlZTA7Ci19Ci0KLXAgewotICAgIGxpbmUtaGVpZ2h0OjEuNWVtOwotICAgIG1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07Ci19Ci1oMSB7Ci0gICAgbWFyZ2luOiAwcHggMHB4IDVweDsgZm9udDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotaDIgewotICAgIG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTI1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotaDMgewotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLWg0IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNSB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotaDYgewotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLS5FcnJvciB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotfQotLkZhaWx1cmUgewotICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnB1cnBsZTsKLX0KLS5Qcm9wZXJ0aWVzIHsKLSAgdGV4dC1hbGlnbjpyaWdodDsKLX0KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSB0ZXN0c3VpdGUgY2xhc3MuCi0gICAgSXQgcHJpbnRzIGEgc3VtbWFyeSBvZiB0aGUgdGVzdHN1aXRlIGFuZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dAotICAgIHRlc3RjYXNlIG1ldGhvZHMuCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImNsYXNzLmRldGFpbHMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzcy5uYW1lIj48eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotICAgICAgICB2YXIgVGVzdENhc2VzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHZhciBjdXI7Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgotICAgICAgIDwvc2NyaXB0PgotICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCi0gICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7Ci0gICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKLSAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50Lm9wZW4oKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKLSAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7Ci0gICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgICAgZG9jLmNsb3NlKCk7Ci0gICAgICAgICAgd2luLmZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICAgIF1dPgotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPkNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvaDM+Ci0KLQotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPgotICAgICAgICAgICAgPC90YWJsZT4KLQotICAgICAgICAgICAgPGgyPlRlc3RzPC9oMj4KLSAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKLSAgICAgICAgICAgICAgc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQotICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZXJyb3IiPgotICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkVycm9yIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgotICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OwotICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgotICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgotICAgICAgICAgICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LW91dC50eHQ8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0ICYjMTg3OwotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4KLSAgICAgICAgICAgICAgICAgICAgPGE+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1lcnIudHh0PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyciAmIzE4NzsKLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tCi0gICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgotICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCi0gICAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+Ci0gICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLgotICAgIEl0IHByaW50cyB0aGUgbmFtZSBvZiBhbGwgY2xhc3NlcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBwYWNrYWdlLgotICAgIEBwYXJhbSBuYW1lIHRoZSBwYWNrYWdlIG5hbWUgdG8gcHJpbnQgY2xhc3Nlcy4KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC90YWJsZT4KLQotICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLSAgICBvbiBlYWNoIGNsYXNzLgotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgQ2xhc3NlczwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgotICAgIGVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgotICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IFBhY2thZ2VzPC90aXRsZT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L2hlYWQ+Ci0gICAgICAgIDxib2R5PgotICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+Ci0gICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICAgICA8YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IFN1bW1hcnk8L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxsY2xhc3Nlcy1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KLSAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgotICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgPHRyPgotICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KLSAgICAgICAgTm90ZTogPGVtPmZhaWx1cmVzPC9lbT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGVtPmVycm9yczwvZW0+IGFyZSB1bmFudGljaXBhdGVkLgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxoMj5QYWNrYWdlczwvaDI+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KLSAgICAgICAgICAgICAgICA8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+Ci0gICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5IGEgZmFpbHVyZSBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZS9lcnJvciBpbiB0aGUgcGFja2FnZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0ZXN0cykiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGltZSkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AdGltZXN0YW1wIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AaG9zdG5hbWUiLz48L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KLQotICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLSAgICAgICAgICAgIDwvdGFibGUtLT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIi8+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlIiBtb2RlPSJwcmludC50ZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KLSAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKLS0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgotICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+Ci0gICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgotICAgIDwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L2xpbms+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLSAgICA8aDE+VW5pdCBUZXN0IFJlc3VsdHM8L2gxPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC90ZD4KLSAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGNsYXNzIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIj4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5UZXN0czwvdGg+Ci0gICAgICAgIDx0aD5FcnJvcnM8L3RoPgotICAgICAgICA8dGg+RmFpbHVyZXM8L3RoPgotICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgotICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUgU3RhbXA8L3RoPgotICAgICAgICA8dGg+SG9zdDwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIG1ldGhvZCBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5TdGF0dXM8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8dGQ+PGEgaHJlZj0ie0BuYW1lfS5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRlc3RzIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGVycm9ycyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB0aW1lc3RhbXAiLz48L3RkPgotICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAaG9zdG5hbWUiLz48L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+RXJyb3I8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj5GYWlsdXJlPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5UYWJsZVJvd0NvbG9yPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj4KLSAgICAgICAgICAgICAgICA8dGQ+RmFpbHVyZTwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmFpbHVyZSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj4KLSAgICAgICAgICAgICAgICA8dGQ+RXJyb3I8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9yIi8+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8dGQ+U3VjY2VzczwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjwvdGQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIE5vdGUgOiB0aGUgYmVsb3cgdGVtcGxhdGUgZXJyb3IgYW5kIGZhaWx1cmUgYXJlIHRoZSBzYW1lIHN0eWxlCi0gICAgICAgICAgICBzbyBqdXN0IGNhbGwgdGhlIHNhbWUgc3R5bGUgc3RvcmUgaW4gdGhlIHRvb2xraXQgdGVtcGxhdGUgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gU3R5bGUgZm9yIHRoZSBlcnJvciBhbmQgZmFpbHVyZSBpbiB0aGUgdGVzdGNhc2UgdGVtcGxhdGUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEBtZXNzYWdlKSI+Ti9BPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICA8IS0tIGRpc3BsYXkgdGhlIHN0YWNrdHJhY2UgLS0+Ci0gICAgPGJyLz48YnIvPgotICAgIDxjb2RlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id29yZCIgc2VsZWN0PSIuIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9jb2RlPgotICAgIDwhLS0gdGhlIGxhdHRlciBpcyBiZXR0ZXIgYnV0IG1pZ2h0IGJlIHByb2JsZW1hdGljIGZvciBub24tMjEiIG1vbml0b3JzLi4uIC0tPgotICAgIDwhLS1wcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3ByZS0tPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InN0cmluZyIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMSIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkc3RyaW5nKSwnXCcsJ1xcJykiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InRtcDIiIHNlbGVjdD0ic3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHRtcDEpLCZxdW90OycmcXVvdDssJnF1b3Q7XCZhcG9zOyZxdW90OykiLz4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRtcDIiLz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICB0ZW1wbGF0ZSB0aGF0IHdpbGwgY29udmVydCBhIGNhcnJpYWdlIHJldHVybiBpbnRvIGEgYnIgdGFnCi0gICAgQHBhcmFtIHdvcmQgdGhlIHRleHQgZnJvbSB3aGljaCB0byBjb252ZXJ0IENSIHRvIEJSIHRhZwotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0id29yZCIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iYnIiPjxici8+PC94c2w6cGFyYW0+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J3N0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR3b3JkKSwiJiN4QTsiLCRiciknLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMDAnKSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwJScpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvanVuaXQtZnJhbWVzLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qdW5pdC1mcmFtZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjllOGRkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qdW5pdC1mcmFtZXMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICB4bWxuczpyZWRpcmVjdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL3JlZGlyZWN0IgotICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCi0gICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgotPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Ci08IS0tCi0gICBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08IS0tCi0KLSBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KLQotIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5Ci0gdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCi0KLS0tPgotPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiPgotICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZSI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmZvci1lYWNoPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4uPC94c2w6aWY+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0gICAgPCEtLVByb2Nlc3NpbmcgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXQuZGlyIi8+IC0tPgotICAgIDwhLS0gY3JlYXRlIGEgY2xhc3Nlcy1saXN0Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgotICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVtAcGFja2FnZSA9ICRuYW1lXSI+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0uaHRtbCI+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KLSAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgotICAgICAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1vdXQudHh0Ij4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi9zeXN0ZW0tb3V0IiAvPgotICAgICAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KLSAgICAgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tZXJyLnR4dCI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vc3lzdGVtLWVyciIgLz4KLSAgICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOmZvci1lYWNoPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzLjwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxmcmFtZXNldCBjb2xzPSIyMCUsODAlIj4KLSAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgotICAgICAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgotICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgotICAgICAgICA8L2ZyYW1lc2V0PgotICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KLSAgICAgICAgPG5vZnJhbWVzPgotICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotICAgICAgICAgICAgPC9wPgotICAgICAgICA8L25vZnJhbWVzPgotICAgIDwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci1ib2R5IHsKLSAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgY29sb3I6IzAwMDAwMDsKLX0KLXRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7Ci0gICAgZm9udC1zaXplOiA2OCU7Ci19Ci10YWJsZS5kZXRhaWxzIHRyIHRoewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIHRleHQtYWxpZ246bGVmdDsKLSAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Ci19Ci10YWJsZS5kZXRhaWxzIHRyIHRkewotICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKLX0KLQotcCB7Ci0gICAgbGluZS1oZWlnaHQ6MS41ZW07Ci0gICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLX0KLWgxIHsKLSAgICBtYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oMiB7Ci0gICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oMyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotaDQgewotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLWg1IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNiB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotLkVycm9yIHsKLSAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Ci19Ci0uRmFpbHVyZSB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOwotfQotLlByb3BlcnRpZXMgewotICB0ZXh0LWFsaWduOnJpZ2h0OwotfQotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHRlc3RzdWl0ZSBjbGFzcy4KLSAgICBJdCBwcmludHMgYSBzdW1tYXJ5IG9mIHRoZSB0ZXN0c3VpdGUgYW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgdGVzdGNhc2UgbWV0aG9kcy4KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iY2xhc3MuZGV0YWlscyI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLm5hbWUiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0gICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgdmFyIGN1cjsKLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+Ci0gICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKLSAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKLSAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOwotICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQub3BlbigpOwotICAgICAgICAgIGRvYy53cml0ZSgiPGh0bWw+PGhlYWQ+PHRpdGxlPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC90aXRsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoImJvZHkge2ZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsgY29sb3I6IzAwMDAwMDsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsgZm9udC1zaXplOiA2OCU7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRoIHsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRkIHsgZm9udDpub3JtYWw7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZmY7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8L3N0eWxlPiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPC9oZWFkPjxib2R5PiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxkaXYgYWxpZ249XCJyaWdodFwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OndpbmRvdy5jbG9zZSgpO1wiPkNsb3NlPC9hPjwvZGl2PiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPHRhYmxlIGNsYXNzPSdwcm9wZXJ0aWVzJz4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOwotICAgICAgICAgIGZvciAocHJvcCBpbiBUZXN0Q2FzZXNbbmFtZV0pIHsKLSAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgVGVzdENhc2VzW25hbWVdW3Byb3BdICsgIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZG9jLndyaXRlKCI8L3RhYmxlPiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPC9ib2R5PjwvaHRtbD4iKTsKLSAgICAgICAgICBkb2MuY2xvc2UoKTsKLSAgICAgICAgICB3aW4uZm9jdXMoKTsKLSAgICAgICAgfQotICAgICAgXV0+Ci0gICAgICA8L3NjcmlwdD4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gICAgICAgICAgICA8aDM+Q2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC9oMz4KLQotCi0gICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0gICAgICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgICAgICA8aDI+VGVzdHM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQotICAgICAgICAgICAgICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5Ci0gICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgPGE+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgJiMxODc7Ci0gICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+Ci0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1vdXQudHh0PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dCAmIzE4NzsKLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tZXJyKSE9MCI+Ci0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1lcnIudHh0PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyciAmIzE4NzsKLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tCi0gICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgotICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCi0gICAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+Ci0gICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLgotICAgIEl0IHByaW50cyB0aGUgbmFtZSBvZiBhbGwgY2xhc3NlcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBwYWNrYWdlLgotICAgIEBwYXJhbSBuYW1lIHRoZSBwYWNrYWdlIG5hbWUgdG8gcHJpbnQgY2xhc3Nlcy4KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC90YWJsZT4KLQotICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAaWR9X3tAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLSAgICBvbiBlYWNoIGNsYXNzLgotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgQ2xhc3NlczwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgQ3JlYXRlcyBhbiBodG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sIGZpbGVzIG9uCi0gICAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCi0gICAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgUGFja2FnZXM8L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KLSAgICAgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+Ci0gICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgIDxhIGhyZWY9Ii4ve3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KLSAgICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogU3VtbWFyeTwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICA8aDI+U3VtbWFyeTwvaDI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BmYWlsdXJlcykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8dGg+VGVzdHM8L3RoPgotICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KLSAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgotICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+Ci0gICAgICAgICAgICA8dGg+VGltZTwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmYWlsdXJlQ291bnQgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHN1Y2Nlc3NSYXRlIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0gICAgICAgIE5vdGU6IDxlbT5mYWlsdXJlczwvZW0+IGFyZSBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zIHdoaWxlIDxlbT5lcnJvcnM8L2VtPiBhcmUgdW5hbnRpY2lwYXRlZC4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgotICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0gICAgICAgICAgICAgICAgPCEtLSBnZXQgdGhlIG5vZGUgc2V0IGNvbnRhaW5pbmcgYWxsIHRlc3RzdWl0ZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIvPgotICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheSBhIGZhaWx1cmUgaWYgdGhlcmUgaXMgYW55IGZhaWx1cmUvZXJyb3IgaW4gdGhlIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGVycm9ycykgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgIDwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGVzdHMpIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGVycm9ycykiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRpbWUpIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2gzPgotCi0gICAgICAgICAgICA8IS0tdGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5tZXRyaWNzLmhlYWRlciIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgotICAgICAgICAgICAgPC90YWJsZS0tPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iLz4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGluc2FtZXBhY2thZ2UpICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgotICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UiIG1vZGU9InByaW50LnRlc3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLwotICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgotICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+Ci0gICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLicpIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucygkcGF0aCwnLicpKSBhbmQgbm90KCRwYXRoID0gJycpIj4KLSAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+Ci0gICAgPC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gUGFnZSBIRUFERVIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgotICAgIDxoMT5Vbml0IFRlc3QgUmVzdWx0czwvaDE+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgotICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8aHIgc2l6ZT0iMSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gY2xhc3MgaGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLSAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIG1ldGhvZCBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5TdGF0dXM8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8dGQ+PGEgaHJlZj0ie0BpZH1fe0BuYW1lfS5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRlc3RzIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGVycm9ycyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+Ci0gICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlRhYmxlUm93Q29sb3I8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgotICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgotICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gTm90ZSA6IHRoZSBiZWxvdyB0ZW1wbGF0ZSBlcnJvciBhbmQgZmFpbHVyZSBhcmUgdGhlIHNhbWUgc3R5bGUKLSAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KLSAgICA8YnIvPjxici8+Ci0gICAgPGNvZGU+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L2NvZGU+Ci0gICAgPCEtLSB0aGUgbGF0dGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+Ci0gICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKLSAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJiciI+PGJyLz48L3hzbDpwYXJhbT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsJGJyKScvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2p1bml0LW5vZnJhbWVzLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9qdW5pdC1ub2ZyYW1lcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NDg3ZjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL2p1bml0LW5vZnJhbWVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLQl4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0JeG1sbnM6c3RyaW5ndXRpbHM9InhhbGFuOi8vb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlscyI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiCi0gIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgLz4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KLTwhLS0KLSAgIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0gCi08IS0tCi0gCi0gU2FtcGxlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCB3aXRoIEFudCBKVW5pdFJlcG9ydCBvdXRwdXQuCi0gCi0gSXQgY3JlYXRlcyBhIG5vbi1mcmFtZWQgcmVwb3J0IHRoYXQgY2FuIGJlIHVzZWZ1bCB0byBzZW5kIHZpYQotIGUtbWFpbCBvciBzdWNoLgotIAotIEBhdXRob3IgU3RlcGhhbmUgQmFpbGxpZXogPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIi8+Ci0gQGF1dGhvciBFcmlrIEhhdGNoZXIgPGEgaHJlZj0ibWFpbHRvOmVoYXRjaGVyQGFwYWNoZS5vcmciLz4KLSAKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzPC90aXRsZT4KLSAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgYm9keSB7Ci0gICAgICAgIGZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKLSAgICAgICAgY29sb3I6IzAwMDAwMDsKLSAgICAgIH0KLSAgICAgIHRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7Ci0gICAgICAgICAgZm9udC1zaXplOiA2OCU7Ci0gICAgICB9Ci0gICAgICB0YWJsZS5kZXRhaWxzIHRyIHRoewotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgdGV4dC1hbGlnbjpsZWZ0OwotICAgICAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Ci0gICAgICB9Ci0gICAgICB0YWJsZS5kZXRhaWxzIHRyIHRkewotICAgICAgICBiYWNrZ3JvdW5kOiNlZWVlZTA7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHAgewotICAgICAgICBsaW5lLWhlaWdodDoxLjVlbTsKLSAgICAgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLSAgICAgIH0KLSAgICAgIGgxIHsKLSAgICAgICAgbWFyZ2luOiAwcHggMHB4IDVweDsgZm9udDogMTY1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgaDIgewotICAgICAgICBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLSAgICAgIH0KLSAgICAgIGgzIHsKLSAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgaDQgewotICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi0gICAgICB9Ci0gICAgICBoNSB7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLSAgICAgIH0KLSAgICAgIGg2IHsKLSAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotICAgICAgfQotICAgICAgLkVycm9yIHsKLSAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOwotICAgICAgfQotICAgICAgLkZhaWx1cmUgewotICAgICAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpwdXJwbGU7Ci0gICAgICB9Ci0gICAgICAuUHJvcGVydGllcyB7Ci0gICAgICAgIHRleHQtYWxpZ246cmlnaHQ7Ci0gICAgICB9Ci0gICAgICA8L3N0eWxlPgotICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLSAgICAgICAgdmFyIFRlc3RDYXNlcyA9IG5ldyBBcnJheSgpOwotICAgICAgICB2YXIgY3VyOwotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi90ZXN0c3VpdGUiPiAgICAgIAotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKLSAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKLSAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOwotICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQub3BlbigpOwotICAgICAgICAgIGRvYy53cml0ZSgiPGh0bWw+PGhlYWQ+PHRpdGxlPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC90aXRsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZT4iKQotICAgICAgICAgIGRvYy53cml0ZSgiYm9keSB7Zm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOyBjb2xvcjojMDAwMDAwOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeyBmb250LXNpemU6IDY4JTsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB7IGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsgYm9yZGVyLWxlZnQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItdG9wOnNvbGlkIDEgI2NjY2NjYzsgcGFkZGluZzo1cHg7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgdGggeyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNlZWVlZWU7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgdGQgeyBmb250Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmZjsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgiaDMgeyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhIH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvc3R5bGU+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8L2hlYWQ+PGJvZHk+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8aDM+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L2gzPiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPGRpdiBhbGlnbj1cInJpZ2h0XCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6d2luZG93LmNsb3NlKCk7XCI+Q2xvc2U8L2E+PC9kaXY+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8dGFibGUgY2xhc3M9J3Byb3BlcnRpZXMnPiIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD5OYW1lPC90aD48dGg+VmFsdWU8L3RoPjwvdHI+Iik7Ci0gICAgICAgICAgZm9yIChwcm9wIGluIFRlc3RDYXNlc1tuYW1lXSkgewotICAgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPiIgKyBwcm9wICsgIjwvdGg+PHRkPiIgKyBUZXN0Q2FzZXNbbmFtZV1bcHJvcF0gKyAiPC90ZD48L3RyPiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBkb2Mud3JpdGUoIjwvdGFibGU+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOwotICAgICAgICAgIGRvYy5jbG9zZSgpOwotICAgICAgICAgIHdpbi5mb2N1cygpOwotICAgICAgICB9Ci0gICAgICBdXT4gIAotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8YSBuYW1lPSJ0b3AiPjwvYT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+ICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBTdW1tYXJ5IHBhcnQgLS0+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3VtbWFyeSIvPgotICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDwhLS0gUGFja2FnZSBMaXN0IHBhcnQgLS0+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZWxpc3QiLz4KLSAgICAgICAgICAgIDxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIEZvciBlYWNoIHBhY2thZ2UgY3JlYXRlIGl0cyBwYXJ0IC0tPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2VzIi8+Ci0gICAgICAgICAgICA8aHIgc2l6ZT0iMSIgd2lkdGg9Ijk1JSIgYWxpZ249ImxlZnQiLz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBGb3IgZWFjaCBjbGFzcyBjcmVhdGUgdGhlICBwYXJ0IC0tPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMiLz4KLSAgICAgICAgICAgIAotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgCi0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBXcml0ZSBhIGxpc3Qgb2YgYWxsIHBhY2thZ2VzIHdpdGggYW4gaHlwZXJsaW5rIHRvIHRoZSBhbmNob3Igb2YgICAgLS0+Ci0gICAgPCEtLSBvZiB0aGUgcGFja2FnZSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlbGlzdCI+ICAgCi0gICAgICAgIDxoMj5QYWNrYWdlczwvaDI+Ci0gICAgICAgIE5vdGU6IHBhY2thZ2Ugc3RhdGlzdGljcyBhcmUgbm90IGNvbXB1dGVkIHJlY3Vyc2l2ZWx5LCB0aGV5IG9ubHkgc3VtIHVwIGFsbCBvZiBpdHMgdGVzdHN1aXRlcyBudW1iZXJzLgotICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KLSAgICAgICAgICAgIDwhLS0gbGlzdCBhbGwgcGFja2FnZXMgcmVjdXJzaXZlbHkgLS0+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0c3VpdGVzLWluLXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQHRlc3RzKSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZXJyb3JDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AZXJyb3JzKSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmFpbHVyZUNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0BmYWlsdXJlcykiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AdGltZSkiLz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8IS0tIHdyaXRlIGEgc3VtbWFyeSBmb3IgdGhlIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBzZXQgYSBuaWNlIGNvbG9yIGRlcGVuZGluZyBpZiB0aGVyZSBpcyBhbiBlcnJvci9mYWlsdXJlIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI3tAcGFja2FnZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3RhYmxlPiAgICAgICAgCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBXcml0ZSBhIHBhY2thZ2UgbGV2ZWwgcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBJdCBjcmVhdGVzIGEgdGFibGUgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgZG9jdW1lbnQ6ICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBOYW1lIHwgVGVzdHMgfCBFcnJvcnMgfCBGYWlsdXJlcyB8IFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlcyI+Ci0gICAgICAgIDwhLS0gY3JlYXRlIGFuIGFuY2hvciB0byB0aGlzIHBhY2thZ2UgbmFtZSAtLT4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0gICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgICAgIDxhIG5hbWU9IntAcGFja2FnZX0iPjwvYT4KLSAgICAgICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L2gzPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPCEtLSBtYXRjaCB0aGUgdGVzdHN1aXRlcyBvZiB0aGlzIHBhY2thZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0gICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KLSAgICAgICAgICAgICAgICA8cC8+Ci0gICAgICAgICAgICAgICAgPHAvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMiPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlIj4KLSAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBjbGFzcyBuYW1lIC0tPgotICAgICAgICAgICAgPGEgbmFtZT0ie0BuYW1lfSI+PC9hPgotICAgICAgICAgICAgPGgzPlRlc3RDYXNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaDM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKLSAgICAgICAgICAgICAgc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQotICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZXJyb3IiPgotICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkVycm9yIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgotICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OwotICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPHAvPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5Ij4KLSAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KLSAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgotICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotCi0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgotICAgICAgICBOb3RlOiA8aT5mYWlsdXJlczwvaT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGk+ZXJyb3JzPC9pPiBhcmUgdW5hbnRpY2lwYXRlZC4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgPCEtLQotICAgV3JpdGUgcHJvcGVydGllcyBpbnRvIGEgSmF2YVNjcmlwdCBkYXRhIHN0cnVjdHVyZS4KLSAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGlkZWEgYnkgRXJpayBIYXRjaGVyIChlaGF0Y2hlckBhcGFjaGUub3JnKQotICAgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3BlcnRpZXMiPgotICAgIGN1ciA9IFRlc3RDYXNlc1snPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPiddID0gbmV3IEFycmF5KCk7Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOwotICAgIDwveHNsOmZvci1lYWNoPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLTwhLS0gUGFnZSBIRUFERVIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgotICAgIDxoMT5Vbml0IFRlc3QgUmVzdWx0czwvaDE+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly93d3cuanVuaXQub3JnJz5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50Jz5BbnQ8L2E+LjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxociBzaXplPSIxIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJoZWFkZXIiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLSAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGNsYXNzIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIj4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5UZXN0czwvdGg+Ci0gICAgICAgIDx0aD5FcnJvcnM8L3RoPgotICAgICAgICA8dGg+RmFpbHVyZXM8L3RoPgotICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBtZXRob2QgaGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciI+Ci0gICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHRoPk5hbWU8L3RoPgotICAgICAgICA8dGg+U3RhdHVzPC90aD4KLSAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPgotICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJwcmludC50ZXN0Ij4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8IS0tIHNldCBhIG5pY2UgY29sb3IgZGVwZW5kaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgLS0+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZmFpbHVyZXNbLiZndDsgMF0iPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAKLSAgICAgICAgPCEtLSBwcmludCB0ZXN0c3VpdGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIje0BuYW1lfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRlc3RzIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZXJyb3JzIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmFpbHVyZXMiLz48L3RkPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+Ci0gICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUgfCBlcnJvciI+RXJyb3I8L3hzbDp3aGVuPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj4KLSAgICAgICAgICAgICAgICA8dGQ+RmFpbHVyZTwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmFpbHVyZSIvPjwvdGQ+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj4KLSAgICAgICAgICAgICAgICA8dGQ+RXJyb3I8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9yIi8+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8dGQ+U3VjY2VzczwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjwvdGQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPHRkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gU3R5bGUgZm9yIHRoZSBlcnJvciBhbmQgZmFpbHVyZSBpbiB0aGUgdGVzY2FzZSB0ZW1wbGF0ZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KLSAgICA8Y29kZT4KLSAgICAgICAgPGJyLz48YnIvPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id29yZCIgc2VsZWN0PSIuIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9jb2RlPgotICAgIDwhLS0gdGhlIGxhdGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+Ci0gICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKLSAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJiciI+PGJyLz48L3hzbDpwYXJhbT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsJGJyKScvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvbG9nLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9sb2cueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjcyNzkwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9sb2cueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgotPCEtLQotICAgIENvcHlyaWdodCAgMjAwMC0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgCi0gICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgCi0tLT4KLSAKLTwhLS0KLQotICBUaGUgcHVycG9zZSBoYXZlIHRoaXMgWFNMIGlzIHRvIHByb3ZpZGUgYSBuaWNlIHdheSB0byBsb29rIGF0IHRoZSBvdXRwdXQKLSAgZnJvbSB0aGUgQW50IFhtbExvZ2dlciAoaWU6IGFudCAtbGlzdGVuZXIgb3JnLmFwYWNoZS50b29scy5hbnQuWG1sTG9nZ2VyICkKLSAgCi0gIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIj5TdGVwaGFuZSBCYWlsbGllejwvYT4KLSAgCi0tLT4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAuYmFubmVyY2VsbCB7Ci0gICAgICBib3JkZXI6IDBweDsKLSAgICAgIHBhZGRpbmc6IDBweDsKLSAgICB9Ci0gICAgYm9keSB7Ci0gICAgICBtYXJnaW46IDA7Ci0gICAgICBmb250Om5vcm1hbCAxMDAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKLSAgICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgfQotICAgIHRhYmxlLnN0YXR1cyB7Ci0gICAgICBmb250OmJvbGQgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IzUyNUQ3NjsKLSAgICAgIGNvbG9yOiNmZmZmZmY7Ci0gICAgfQotICAgIHRhYmxlLmxvZyB0ciB0ZCwgdHIgdGggewotICAgICAgZm9udC1zaXplOiA4MCU7Ci0gICAgfQotICAgIC5lcnJvciB7Ci0gICAgICBjb2xvcjpyZWQ7Ci0gICAgfQotICAgIC53YXJuIHsKLSAgICAgIGNvbG9yOmJyb3duOwotICAgIH0KLSAgICAuaW5mbyB7Ci0gICAgICBjb2xvcjpncmF5OwotICAgIH0KLSAgICAuZGVidWd7Ci0gICAgICBjb2xvcjpncmF5OwotICAgIH0KLSAgICAuZmFpbGVkIHsKLSAgICAgIGZvbnQtc2l6ZTo4MCU7Ci0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7Ci0gICAgICBjb2xvcjojRkZGRkZGOwotICAgICAgZm9udC13ZWlnaHQ6IGJvbGQKLSAgICB9Ci0gICAgLmNvbXBsZXRlIHsKLSAgICAgIGZvbnQtc2l6ZTo4MCU7Ci0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTI1RDc2OwotICAgICAgY29sb3I6I0ZGRkZGRjsKLSAgICAgIGZvbnQtd2VpZ2h0OiBib2xkCi0gICAgfQotICAgIC5hIHRkIHsgCi0gICAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmOwotICAgIH0KLSAgICAuYiB0ZCB7IAotICAgICAgYmFja2dyb3VuZDogI2ZmZjsKLSAgICB9Ci0gICAgdGgsIHRkIHsKLSAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIH0KLSAgICB0aCB7Ci0gICAgICBiYWNrZ3JvdW5kOiAjY2NjOwotICAgICAgY29sb3I6IGJsYWNrOwotICAgIH0KLSAgICB0YWJsZSwgdGgsIHRkIHsKLSAgICAgIGJvcmRlcjogbm9uZQotICAgIH0KLSAgICBoMyB7Ci0gICAgICBmb250OmJvbGQgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKLSAgICAgIGJhY2tncm91bmQ6ICM1MjVENzY7Ci0gICAgICBjb2xvcjogd2hpdGU7Ci0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgICBwYWRkaW5nOiA1cHg7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKLSAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Ci0gICAgICBtYXJnaW4tYm90dG9tOiAwOwotICAgIH0KLSAgICA8L3N0eWxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDwhLS0gamFrYXJ0YSBsb2dvIC0tPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImJhbm5lcmNlbGwiPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+Ci0gICAgICAgIDxpbWcgc3JjPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmIiBhbHQ9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciIGFsaWduPSJsZWZ0IiBib3JkZXI9IjAiLz4KLSAgICAgICAgPC9hPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDt2ZXJ0aWNhbC1hbGlnbjpib3R0b20iPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudCI+QXBhY2hlIEFudDwvYT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgICAgCi0gICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgotICAgIDx0cj48dGQ+PGhyIG5vc2hhZGU9InllcyIgc2l6ZT0iMSIvPjwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotCi0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJidWlsZCIvPgotCi0gICAgPCEtLSBGT09URVIgLS0+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+PGhyIG5vc2hhZGU9InllcyIgc2l6ZT0iMSIvPjwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+Ci0gICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjNTI1RDc2IiBzaXplPSItMSI+PGVtPgotICAgICAgQ29weXJpZ2h0ICYjMTY5OyAyMDAwLTIwMDIsIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAgICA8L2VtPjwvZm9udD48L2Rpdj4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotICA8L2JvZHk+Ci08L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYnVpbGQiPgotICA8IS0tIGJ1aWxkIHN0YXR1cyAtLT4KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+ZmFpbGVkPC94c2w6aWY+Ci0gICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAZXJyb3IpIj5jb21wbGV0ZTwveHNsOmlmPgotICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICA8dHI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+Ci0gICAgICAgIDx0ZCBub3dyYXA9InllcyI+QnVpbGQgRmFpbGVkPC90ZD4gCi0gICAgICA8L3hzbDppZj4KLSAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBlcnJvcikiPgotICAgICAgICA8dGQgbm93cmFwPSJ5ZXMiPkJ1aWxkIENvbXBsZXRlPC90ZD4KLSAgICAgIDwveHNsOmlmPgotICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiIG5vd3JhcD0ieWVzIj5Ub3RhbCBUaW1lOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpbWUiLz48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNvbHNwYW49IjIiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+Ci0gICAgICAgICAgPHR0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZXJyb3IiLz48L3R0Pjxici8+Ci0gICAgICAgICAgPGkgc3R5bGU9ImZvbnQtc2l6ZTo4MCUiPlNlZSB0aGUgPGEgaHJlZj0iI3N0YWNrdHJhY2UiIGFsdD0iQ2xpY2sgZm9yIGRldGFpbHMiPnN0YWNrdHJhY2U8L2E+LjwvaT4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMyIgd2lkdGg9IjEwMCUiIHN0eWxlPSJmb250LXNpemU6ODAlIj4KLSAgICA8dHIgY2xhc3M9ImEiPjx0ZCB3aWR0aD0iMSI+YW50LmZpbGU8L3RkPjx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKC8vbWVzc2FnZVtjb250YWlucyh0ZXh0KCksJ2FudC5maWxlJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KLSAgICA8dHIgY2xhc3M9ImIiPjx0ZCB3aWR0aD0iMSI+YW50LnZlcnNpb248L3RkPjx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKC8vbWVzc2FnZVtjb250YWlucyh0ZXh0KCksJ2FudC52ZXJzaW9uJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KLSAgICA8dHIgY2xhc3M9ImEiPjx0ZCB3aWR0aD0iMSI+amF2YS52ZXJzaW9uPC90ZD48dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigvL21lc3NhZ2VbY29udGFpbnModGV4dCgpLCdqYXZhLnZtLnZlcnNpb24nKV0sICctPicpIi8+PC90ZD48L3RyPgotICAgIDx0ciBjbGFzcz0iYiI+PHRkIHdpZHRoPSIxIj5vcy5uYW1lPC90ZD48dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigvL21lc3NhZ2VbY29udGFpbnModGV4dCgpLCdvcy5uYW1lJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KLSAgPC90YWJsZT4KLSAgPCEtLSBidWlsZCBpbmZvcm1hdGlvbiAtLT4KLSAgPGgzPkJ1aWxkIGV2ZW50czwvaDM+Ci0gIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMyIgd2lkdGg9IjEwMCUiPgotICA8dHI+Ci0gICAgPHRoIG5vd3JhcD0ieWVzIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjElIj50YXJnZXQ8L3RoPgotICAgIDx0aCBub3dyYXA9InllcyIgYWxpZ249ImxlZnQiIHdpZHRoPSIxJSI+dGFzazwvdGg+Ci0gICAgPHRoIG5vd3JhcD0ieWVzIiBhbGlnbj0ibGVmdCI+bWVzc2FnZTwvdGg+Ci0gIDwvdHI+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vbWVzc2FnZVtAcHJpb3JpdHkgIT0gJ2RlYnVnJ10iLz4KLSAgPC90YWJsZT4KLSAgPHA+Ci0gIDwhLS0gc3RhY2t0cmFjZSAtLT4KLSAgPHhzbDppZiB0ZXN0PSJzdGFja3RyYWNlIj4KLSAgPGEgbmFtZT0ic3RhY2t0cmFjZSIvPgotICA8aDM+RXJyb3IgZGV0YWlsczwvaDM+Ci0gIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPjx0ZD4KLSAgICAgIDxwcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN0YWNrdHJhY2UiLz48L3ByZT4KLSAgICA8L3RkPjwvdHI+Ci0gIDwvdGFibGU+Ci0gIDwveHNsOmlmPgotICA8L3A+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSByZXBvcnQgZXZlcnkgbWVzc2FnZSBidXQgdGhvc2Ugd2l0aCBkZWJ1ZyBwcmlvcml0eSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lc3NhZ2VbQHByaW9yaXR5IT0nZGVidWcnXSI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPCEtLSBhbHRlcm5hdGVkIHJvdyBzdHlsZSAtLT4KLSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5hPC94c2w6aWY+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5iPC94c2w6aWY+Ci0gICAgPC94c2w6YXR0cmlidXRlPgotICAgIDx0ZCBub3dyYXA9InllcyIgd2lkdGg9IjElIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vLi4vQG5hbWUiLz48L3RkPgotICAgIDx0ZCBub3dyYXA9InllcyIgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiIHdpZHRoPSIxJSI+WyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4gXTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ7QHByaW9yaXR5fSIgbm93cmFwPSJ5ZXMiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9tYXVkaXQtZnJhbWVzLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9tYXVkaXQtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFhZjE4MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvbWF1ZGl0LWZyYW1lcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKLSAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVTLUFTQ0lJIi8+Ci08eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Ci08IS0tCi0gICAgQ29weXJpZ2h0ICAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAKLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAKLS0tPgotPCEtLQotCi0gICAgU3R5bGVzaGVldCB0byB0cmFuc2Zvcm0gYW4gWE1MIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBBbnQgTUF1ZGl0IHRhc2sgaW50bwotICAgIGEgc2V0IG9mIEphdmFEb2MtbGlrZSBIVE1MIHBhZ2UgdG8gbWFrZSBwYWdlcyBtb3JlIGNvbnZlbmllbnQgdG8gYmUgYnJvd3NlZC4KLQotICAgIEl0IHVzZSB0aGUgWGFsYW4gcmVkaXJlY3QgZXh0ZW5zaW9uIHRvIHdyaXRlIHRvIG11bHRpcGxlIG91dHB1dCBmaWxlcy4KLQotICAgIEBhdXRob3IgU3RlcGhhbmUgQmFpbGxpZXogPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIi8+Ci0tLT4KLQotPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzZXMiPgotICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9jbGFzc1tub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjpjbGFzcy9AcGFja2FnZSldIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIDwhLS1Qcm9jZXNzaW5nIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KLSAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIGEgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLSAgICA8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvY2xhc3Nlcy9jbGFzc1tAcGFja2FnZSA9ICRuYW1lXSI+Ci0gICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KLSAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPEhUTUw+Ci0gICAgPEhFQUQ+PFRJVExFPkF1ZGl0IFJlc3VsdHMuPC9USVRMRT48L0hFQUQ+Ci0gICAgPEZSQU1FU0VUIGNvbHM9IjIwJSw4MCUiPgotICAgICAgICA8RlJBTUVTRVQgcm93cz0iMzAlLDcwJSI+Ci0gICAgICAgICAgICA8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0gICAgICAgICAgICA8RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0gICAgICAgIDwvRlJBTUVTRVQ+Ci0gICAgICAgIDxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgotICAgIDwvRlJBTUVTRVQ+Ci0gICAgPG5vZnJhbWVzPgotICAgICAgICA8SDI+RnJhbWUgQWxlcnQ8L0gyPgotICAgICAgICA8UD4KLSAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0gICAgICAgIDwvUD4KLSAgICA8L25vZnJhbWVzPgotPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci0gICAgLmJhbm5lcmNlbGwgewotICAgICAgYm9yZGVyOiAwcHg7Ci0gICAgICBwYWRkaW5nOiAwcHg7Ci0gICAgfQotICAgIGJvZHkgewotICAgICAgbWFyZ2luLWxlZnQ6IDEwOwotICAgICAgbWFyZ2luLXJpZ2h0OiAxMDsKLSAgICAgIGZvbnQ6bm9ybWFsIDgwJSBhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWY7Ci0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7Ci0gICAgICBjb2xvcjojMDAwMDAwOwotICAgIH0KLSAgICAuYSB0ZCB7Ci0gICAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmOwotICAgIH0KLSAgICAuYiB0ZCB7Ci0gICAgICBiYWNrZ3JvdW5kOiAjZmZmOwotICAgIH0KLSAgICB0aCwgdGQgewotICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gICAgfQotICAgIHRoIHsKLSAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gICAgICBiYWNrZ3JvdW5kOiAjY2NjOwotICAgICAgY29sb3I6IGJsYWNrOwotICAgIH0KLSAgICB0YWJsZSwgdGgsIHRkIHsKLSAgICAgIGZvbnQtc2l6ZToxMDAlOwotICAgICAgYm9yZGVyOiBub25lCi0gICAgfQotICAgIHRhYmxlLmxvZyB0ciB0ZCwgdHIgdGggewotCi0gICAgfQotICAgIGgyIHsKLSAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gICAgICBmb250LXNpemU6MTQwJTsKLSAgICAgIG1hcmdpbi1ib3R0b206IDU7Ci0gICAgfQotICAgIGgzIHsKLSAgICAgIGZvbnQtc2l6ZToxMDAlOwotICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgIGJhY2tncm91bmQ6ICM1MjVENzY7Ci0gICAgICBjb2xvcjogd2hpdGU7Ci0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgICBwYWRkaW5nOiA1cHg7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKLSAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Ci0gICAgICBtYXJnaW4tYm90dG9tOiAwOwotICAgIH0KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gcHJpbnQgdGhlIHZpb2xhdGlvbnMgb2YgdGhlIGNsYXNzIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImNsYXNzLmRldGFpbHMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPEhUTUw+Ci0gICAgICAgIDxIRUFEPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9IRUFEPgotICAgICAgICA8Qk9EWT4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gICAgICAgICAgICA8SDM+Q2xhc3MgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4uPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9IMz4KLQotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQuYXVkaXQiLz4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgICAgIDxIMz5WaW9sYXRpb25zPC9IMz4KLSAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ2aW9sYXRpb24uYXVkaXQuaGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Zpb2xhdGlvbiIgbW9kZT0icHJpbnQuYXVkaXQiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgZGF0YS10eXBlPSJudW1iZXIiIHNlbGVjdD0iQGxpbmUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KLSAgICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KLSAgICA8SFRNTD4KLSAgICAgICAgPEhFQUQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9IRUFEPgotICAgICAgICA8Qk9EWT4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPEgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvYT48L0gyPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+Ci0gICAgICAgICAgICA8VEFCTEUgV0lEVEg9IjEwMCUiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL2NsYXNzZXMvY2xhc3NbLi9AcGFja2FnZSA9ICRuYW1lXSIgbW9kZT0iY2xhc3Nlcy5saXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICA8L1RBQkxFPgotICAgICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci08IS0tIHRoZSBjbGFzcyB0byBsaXN0IC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImNsYXNzZXMubGlzdCI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgPCEtLSBAYnVnIG5hbWluZyB0byBmaXggZm9yIGlubmVyIGNsYXNzZXMgLS0+Ci0gICAgICAgICAgICA8YSBocmVmPSJ7QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sCi0gICAgb24gZWFjaCBjbGFzcy4KLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3NlcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L2hlYWQ+Ci0gICAgICAgIDxib2R5PgotICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL2NsYXNzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDwhLS0gKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldIGlzIGJ1Z2d5IGluIE1TWE1MMyA/IC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgotICAgIGVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgotICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzc2VzIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICA8L2hlYWQ+Ci0gICAgICAgIDxib2R5PgotICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+Ci0gICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgotICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY2xhc3Nbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6Y2xhc3MvQHBhY2thZ2UpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgIDxhIGhyZWY9Int0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzc2VzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHkgb25sb2FkPSJvcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgICAgPGgzPlN1bW1hcnk8L2gzPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPkF1ZGl0ZWQgY2xhc3NlczwvdGg+Ci0gICAgICAgICAgICA8dGg+UmVwb3J0ZWQgY2xhc3NlczwvdGg+Ci0gICAgICAgICAgICA8dGg+VmlvbGF0aW9uczwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0ciBjbGFzcz0iYSI+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhdWRpdGVkIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlcG9ydGVkIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZpb2xhdGlvbnMiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0gICAgICAgIE5vdGU6IFJ1bGVzIGNoZWNrZWQgaGF2ZSBvcmlnaW5hdGVkIGZyb20gc3R5bGUgZ3VpZGVsaW5lcyBzdWdnZXN0ZWQgYnkgdGhlIGxhbmd1YWdlIGRlc2lnbmVycywKLSAgICAgICAgZXhwZXJpZW5jZSBmcm9tIHRoZSBKYXZhIGRldmVsb3BtZW50IGNvbW11bml0eSBhbmQgaW5zaXRlIGV4cGVyaWVuY2UuIFZpb2xhdGlvbnMgYXJlIGdlbmVyYWxseQotICAgICAgICByZXBvcnRlZCB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvalRPQy5kb2MuaHRtbCI+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uczwvYT4gKEpMUyB4LngueCkKLSAgICAgICAgYW5kIE1ldGFtYXRhIEF1ZGl0IHJ1bGVzICh4LngpLgotICAgICAgICBQbGVhc2UgY29uc3VsdCB0aGVzZSBkb2N1bWVudHMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdmlvbGF0aW9ucy4KLSAgICAgICAgPHAvPgotICAgICAgICBSdWxlcyBjaGVja2VkIGFsc28gZW5mb3JjZSBhZGhlcmVuY2UgdG8gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2h0bWwvQ29kZUNvbnZUT0MuZG9jLmh0bWwiPlN1biBKYXZhIGNvZGluZyBndWlkZWxpbmVzPC9hPiBpbiB1c2UgYXQgSmFrYXJ0YS4KLSAgICAgICAgPHAvPgotICAgICAgICBPbmUgc2hvdWxkIG5vdGUgdGhhdCB0aGVzZSB2aW9sYXRpb25zIGRvIG5vdCBuZWNlc3NhcnkgdW5kZXJsaW5lIGVycm9ycyBidXQgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgYXMgYW4gaW5kaWNhdGlvbiBmb3IgPGk+cG9zc2libGU8L2k+IGVycm9ycy4gQXMgYWx3YXlzLCB1c2UgeW91ciBiZXN0IGp1ZGdtZW50IGFuZCByZXZpZXcKLSAgICAgICAgdGhlbSBjYXJlZnVsbHksIGl0IG1pZ2h0IHNhdmUgeW91IGhvdXJzIG9mIGRlYnVnZ2luZy4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8aDM+UGFja2FnZXM8L2gzPgotICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5hdWRpdC5oZWFkZXIiLz4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjbGFzc1tub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjpjbGFzcy9AcGFja2FnZSldIj4KLSAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ie3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXS9AdmlvbGF0aW9ucykiLz48L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KLSAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0gICAgPEhUTUw+Ci0gICAgICAgIDxIRUFEPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvSEVBRD4KLSAgICAgICAgPEJPRFk+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KLQotICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLm1ldHJpY3MuaGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+Ci0gICAgICAgICAgICA8L3RhYmxlLS0+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoL2NsYXNzZXMvY2xhc3NbLi9AcGFja2FnZSA9ICRuYW1lXSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICA8SDM+Q2xhc3NlczwvSDM+Ci0gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5hdWRpdC5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gJG5hbWVdIiBtb2RlPSJwcmludC5hdWRpdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KLSAgICAgICAgPC9CT0RZPgotICAgIDwvSFRNTD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS5iLmMgdG8gLi4vLi4vLi4vCi0gICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+Ci0gICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KLSAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgotICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICA8L3hzbDppZj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gICAgPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIFRJVExFPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvTElOSz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLQotICA8IS0tIGpha2FydGEgbG9nbyAtLT4KLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImJhbm5lcmNlbGwiIHJvd3NwYW49IjIiPgotICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPgotICAgICAgPGltZyBzcmM9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYiIGFsdD0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyIgYWxpZ249ImxlZnQiIGJvcmRlcj0iMCIvPgotICAgICAgPC9hPgotICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGgyPlNvdXJjZSBDb2RlIEF1ZGl0PC9oMj48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly93d3cud2ViZ2Fpbi5jb20vcHJvZHVjdHMvcXVhbGl0eV9hbmFseXplci8nPldlYmdhaW4gUUEvTWV0YW1hdGEgQXVkaXQ8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gICAgPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIj4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD48aHIgbm9zaGFkZT0ieWVzIiBzaXplPSIxIi8+PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZD4KLSAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgY29sb3I9IiM1MjVENzYiIHNpemU9Ii0xIj48ZW0+Ci0gICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwMSwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgICAgIDwvZW0+PC9mb250PjwvZGl2PgotICAgICAgPC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNsYXNzIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3MuYXVkaXQuaGVhZGVyIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLSAgICAgICAgPHRoPlZpb2xhdGlvbnM8L3RoPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBtZXRob2QgaGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ2aW9sYXRpb24uYXVkaXQuaGVhZGVyIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0aD5MaW5lPC90aD4KLSAgICAgICAgPHRoPk1lc3NhZ2U8L3RoPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9InByaW50LmF1ZGl0Ij4KLSAgICA8dHI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciLz4KLSAgICAgICAgPHRkPjxhIGhyZWY9IntAbmFtZX0uaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB2aW9sYXRpb25zIi8+PC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InZpb2xhdGlvbiIgbW9kZT0icHJpbnQuYXVkaXQiPgotICAgIDx0cj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgotICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG1lc3NhZ2UiLz48L3RkPgotICAgIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBhbHRlcm5hdGVkIHJvdyBzdHlsZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyI+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPmE8L3hzbDppZj4KLSAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMCI+YjwveHNsOmlmPgotPC94c2w6YXR0cmlidXRlPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy9tbWV0cmljcy1mcmFtZXMueHNsIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMDVlYTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMzICswLDAgQEAKLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgotICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0gIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKLSAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIgotICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVTLUFTQ0lJIi8+Ci08eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Ci08IS0tCi0gICAgQ29weXJpZ2h0ICAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAKLSAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAKLS0tPgotPCEtLQotICBAYXV0aG9yIFN0ZXBoYW5lIEJhaWxsaWV6IDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAYXBhY2hlLm9yZyIvPgotICAtLT4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KLQotPCEtLSBkZWZhdWx0IG1heCB2YWx1ZSBmb3IgdGhlIG1ldHJpY3MgLS0+Ci08eHNsOnBhcmFtIG5hbWU9InZnLm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsb2MubWF4IiBzZWxlY3Q9IjEwMDAiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGl0Lm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJub2EubWF4IiBzZWxlY3Q9IjI1MCIvPgotPHhzbDpwYXJhbSBuYW1lPSJucm0ubWF4IiBzZWxlY3Q9IjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9Im5sbS5tYXgiIHNlbGVjdD0iMjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9IndtYy5tYXgiIHNlbGVjdD0iMjUwIi8+Ci08eHNsOnBhcmFtIG5hbWU9InJmYy5tYXgiIHNlbGVjdD0iNTAiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGFjLm1heCIgc2VsZWN0PSIxMCIvPgotPHhzbDpwYXJhbSBuYW1lPSJmYW5vdXQubWF4IiBzZWxlY3Q9IjEwIi8+Ci08eHNsOnBhcmFtIG5hbWU9ImNiby5tYXgiIHNlbGVjdD0iMTUiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGNvbS5tYXgiIHNlbGVjdD0iMTAiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibm9jbC5tYXgiIHNlbGVjdD0iMTAiLz4KLQotCi08IS0tIGNyZWF0ZSBhIHRyZWUgZnJhZ21lbnQgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZyAtLT4KLTx4c2w6dmFyaWFibGUgbmFtZT0iZG9jdHJlZS52YXIiPgotICA8eHNsOmVsZW1lbnQgbmFtZT0iY2xhc3NlcyI+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vL2NsYXNzIj4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLz4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAKiIvPgotICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLm5hbWUiLz4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJtZXRob2QiLz4KLSAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gIDwveHNsOmVsZW1lbnQ+Ci08L3hzbDp2YXJpYWJsZT4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJkb2N0cmVlIiBzZWxlY3Q9InhhbGFuOm5vZGVzZXQoJGRvY3RyZWUudmFyKSIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRyaWNzIj4KLQotICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KLSAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KLSAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+Ci0gIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KLSAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9tZXRyaWNzLXJlZmVyZW5jZS5odG1sIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgotICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KLSAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+Ci0gIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gIDwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+Ci0gIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vcGFja2FnZSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZSI+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5kaXIiPgotICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnIj4uPC94c2w6aWY+Ci0gIDwveHNsOnZhcmlhYmxlPgotICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1mcmFtZS5odG1sIj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzZXMubGlzdCIvPgotICA8L3JlZGlyZWN0OndyaXRlPgotCi0gIDwhLS0gY3JlYXRlIGEgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgotICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwYWNrYWdlLnN1bW1hcnkiLz4KLSAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICA8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KLSAgPCEtLSBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIHdpdGggaW5uZXIgY2xhc3NlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiAtLT4KLSAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkb2N0cmVlL2NsYXNzZXMvY2xhc3NbQHBhY2thZ2UgPSBjdXJyZW50KCkvQG5hbWVdIj4KLSAgICAgIDwhLS1Qcm9jZXNzaW5nIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+IC0tPgotICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotICA8L3hzbDpmb3ItZWFjaD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGxpdHRsZSB0cmljayB0byBjb21wdXRlIHRoZSBjbGFzc25hbWUgZm9yIGlubmVyIGFuZCBub24gaW5uZXIgY2xhc3NlcyAtLT4KLTwhLS0gdGhpcyBpcyBhbGwgaW4gb25lIGxpbmUgdG8gYXZvaWQgQ1JMRiBpbiB0aGUgbmFtZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJjbGFzcy5uYW1lIj4KLSAgICA8eHNsOmlmIHRlc3Q9InBhcmVudDo6Y2xhc3MiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFyZW50OjpjbGFzcyIgbW9kZT0iY2xhc3MubmFtZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDppZj48eHNsOmlmIHRlc3Q9Im5vdChwYXJlbnQ6OmNsYXNzKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgotPEhUTUw+Ci0gIDxIRUFEPjxUSVRMRT5NZXRyaWNzIFJlc3VsdHMuPC9USVRMRT48L0hFQUQ+Ci0gIDxGUkFNRVNFVCBjb2xzPSIyMCUsODAlIj4KLSAgICA8RlJBTUVTRVQgcm93cz0iMzAlLDcwJSI+Ci0gICAgICA8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+Ci0gICAgICA8RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+Ci0gICAgPC9GUkFNRVNFVD4KLSAgICA8RlJBTUUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KLSAgPC9GUkFNRVNFVD4KLSAgPG5vZnJhbWVzPgotICAgIDxIMj5GcmFtZSBBbGVydDwvSDI+Ci0gICAgPFA+Ci0gICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi0gICAgPC9QPgotICA8L25vZnJhbWVzPgotPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gdGhpcyBpcyB0aGUgc3R5bGVzaGVldCBjc3MgdG8gdXNlIGZvciBuZWFybHkgZXZlcnl0aGluZyAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCI+Ci08aHRtbD4KLTxoZWFkPgotPGxpbmsgdGl0bGU9IlN0eWxlIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgotPC9oZWFkPgotPGJvZHkgc3R5bGU9InRleHQtYWxpZ246anVzdGlmeTsiPgotPGgyPk1ldHJpY3MgUmVmZXJlbmNlPC9oMj4KLTxhIGhyZWY9IiNWKEcpIj5WKEcpPC9hPiB8Ci08YSBocmVmPSIjTE9DIj5MT0M8L2E+IHwKLTxhIGhyZWY9IiNESVQiPkRJVDwvYT4gfAotPGEgaHJlZj0iI05PQSI+Tk9BPC9hPiB8Ci08YSBocmVmPSIjTlJNIj5OUk08L2E+IHwKLTxhIGhyZWY9IiNOTE0iPk5MTTwvYT4gfAotPGEgaHJlZj0iI1dNQyI+V01DPC9hPiB8Ci08YSBocmVmPSIjUkZDIj5SRkM8L2E+IHwKLTxhIGhyZWY9IiNEQUMiPkRBQzwvYT4gfAotPGEgaHJlZj0iI0ZBTk9VVCI+RkFOT1VUPC9hPiB8Ci08YSBocmVmPSIjQ0JPIj5DQk88L2E+IHwKLTxhIGhyZWY9IiNMQ09NIj5MQ09NPC9hPiB8Ci08YSBocmVmPSIjTk9DIj5OT0M8L2E+Ci0KLTxhIG5hbWU9IlYoRykiLz4KLTxoMz5DeWNsb21hdGljIENvbXBsZXhpdHkgLSBWKEcpPC9oMz4KLVRoaXMgbWV0cmljIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSAxOTcwcyB0byBtZWFzdXJlIHRoZSBhbW91bnQgb2YgY29udHJvbAotZmxvdyBjb21wbGV4aXR5IG9yIGJyYW5jaGluZyBjb21wbGV4aXR5IGluIGEgbW9kdWxlIHN1Y2ggYXMgYQotc3Vicm91dGluZS4gSXQgZ2l2ZXMgdGhlIG51bWJlciBvZiBwYXRocyB0aGF0IG1heSBiZSB0YWtlbiB0aHJvdWdoIHRoZQotY29kZSwgYW5kIHdhcyBpbml0aWFsbHkgZGV2ZWxvcGVkIHRvIGdpdmUgc29tZSBtZWFzdXJlIG9mIHRoZSBjb3N0IG9mCi1wcm9kdWNpbmcgYSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2R1bGUgYnkgZXhlY3V0aW5nIGVhY2ggcGF0aC4KLTxwLz4KLU1ldGhvZHMgd2l0aCBhIGhpZ2ggY3ljbG9tYXRpYyBjb21wbGV4aXR5IHRlbmQgdG8gYmUgbW9yZSBkaWZmaWN1bHQgdG8KLXVuZGVyc3RhbmQgYW5kIG1haW50YWluLiBJbiBnZW5lcmFsIHRoZSBtb3JlIGNvbXBsZXggdGhlIG1ldGhvZHMgb2YgYW4KLWFwcGxpY2F0aW9uLCB0aGUgbW9yZSBkaWZmaWN1bHQgaXQgd2lsbCBiZSB0byB0ZXN0IGl0LCBhbmQgdGhpcyB3aWxsIGFkdmVyc2VseQotYWZmZWN0IGl0cyByZWxpYWJpbGl0eS4KLTxwLz4KLVYoRykgaXMgYSBtZWFzdXJlIG9mIHRoZSBjb250cm9sIGZsb3cgY29tcGxleGl0eSBvZiBhIG1ldGhvZCBvcgotY29uc3RydWN0b3IuICBJdCBjb3VudHMgdGhlIG51bWJlciBvZiBicmFuY2hlcyBpbiB0aGUgYm9keSBvZiB0aGUgbWV0aG9kLAotZGVmaW5lZCBhczoKLTx1bD4KLTxsaT53aGlsZSBzdGF0ZW1lbnRzOzwvbGk+Ci08bGk+aWYgc3RhdGVtZW50czs8L2xpPgotPGxpPmZvciBzdGF0ZW1lbnRzLjwvbGk+Ci08L3VsPgotCi1UaGUgbWV0cmljIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gY291bnQgZWFjaCBjYXNlIG9mIGEgc3dpdGNoCi1zdGF0ZW1lbnQgYXMgd2VsbC4KLQotPGEgbmFtZT0iTE9DIi8+Ci08aDM+TGluZXMgb2YgQ29kZSAtIExPQzwvaDM+Ci0KLVRoaXMgaXMgcGVyaGFwcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIHRoZSBtZXRyaWNzIHRvIGRlZmluZSBhbmQgY29tcHV0ZS4KLUNvdW50aW5nIGxpbmVzIGhhcyBhIGxvbmcgaGlzdG9yeSBhcyBhIHNvZnR3YXJlIG1ldHJpYyBkYXRpbmcgZnJvbSBiZWZvcmUKLXRoZSByaXNlIG9mIHN0cnVjdHVyZWQgcHJvZ3JhbW1pbmcsIGFuZCBpdCBpcyBzdGlsbCBpbiB3aWRlc3ByZWFkIHVzZSB0b2RheS4KLVRoZSBzaXplIG9mIGEgbWV0aG9kIGFmZmVjdHMgdGhlIGVhc2Ugd2l0aCB3aGljaCBpdCBjYW4gYmUgdW5kZXJzdG9vZCwgaXRzCi1yZXVzYWJpbGl0eSBhbmQgaXRzIG1haW50YWluYWJpbGl0eS4gVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiB3YXlzIHRoYXQgdGhlIHNpemUKLWNhbiBiZSBjYWxjdWxhdGVkLiBUaGVzZSBpbmNsdWRlIGNvdW50aW5nIGFsbCB0aGUgbGluZXMgb2YgY29kZSwgdGhlIG51bWJlcgotb2Ygc3RhdGVtZW50cywgdGhlIGJsYW5rIGxpbmVzIG9mIGNvZGUsIHRoZSBsaW5lcyBvZiBjb21tZW50YXJ5LCBhbmQgdGhlCi1saW5lcyBjb25zaXN0aW5nIG9ubHkgb2Ygc3ludGF4IHN1Y2ggYXMgYmxvY2sgZGVsaW1pdGVycy4KLTxwLz4KLVRoaXMgbWV0cmljIGNhbiBhbHNvIGJlIHVzZWQgZm9yIHNpemluZyBvdGhlciBjb25zdHJ1Y3RzIGFzIHdlbGwsIGZvcgotZXhhbXBsZSwgdGhlIG92ZXJhbGwgc2l6ZSBvZiBhIEphdmEgY2xhc3Mgb3IgcGFja2FnZSBjYW4gYmUgbWVhc3VyZWQgYnkKLWNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc291cmNlIGxpbmVzIGl0IGNvbnNpc3RzIG9mLgotPHAvPgotTE9DIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgKHNvdXJjZSBmaWxlKSwKLWNsYXNzIG9yIGludGVyZmFjZSwgbWV0aG9kLCBjb25zdHJ1Y3Rvciwgb3IgZmllbGQuICBJdCBjYW4gYmUgY29uZmlndXJlZCB0bwotaWdub3JlOgotPHVsPgotPGxpPmJsYW5rIGxpbmVzOzwvbGk+Ci08bGk+bGluZXMgY29uc2lzdGluZyBvbmx5IG9mIGNvbW1lbnRzOzwvbGk+Ci08bGk+bGluZXMgY29uc2lzdGluZyBvbmx5IG9mIG9wZW5pbmcgYW5kIGNsb3NpbmcgYnJhY2VzLjwvbGk+Ci08L3VsPgotCi08YSBuYW1lPSJESVQiLz4KLTxoMz5EZXB0aCBvZiBJbmhlcml0YW5jZSBIaWVyYXJjaHkgLSBESVQ8L2gzPgotCi1UaGlzIG1ldHJpYyBjYWxjdWxhdGVzIGhvdyBmYXIgZG93biB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGEgY2xhc3MgaXMKLWRlY2xhcmVkLiBJbiBKYXZhIGFsbCBjbGFzc2VzIGhhdmUgamF2YS5sYW5nLk9iamVjdCBhcyB0aGVpciB1bHRpbWF0ZQotc3VwZXJjbGFzcywgd2hpY2ggaXMgZGVmaW5lZCB0byBoYXZlIGEgZGVwdGggb2YgMS4gU28gYSBjbGFzcyB0aGF0Ci1pbW1lZGlhdGVseSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaGFzIGEgbWV0cmljIHZhbHVlIG9mIDI7IGFueSBvZiBpdHMKLXN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgdmFsdWUgb2YgMywgYW5kIHNvIG9uLgotPHAvPgotQSBjbGFzcyB0aGF0IGlzIGRlZXAgd2l0aGluIHRoZSB0cmVlIGluaGVyaXRzIG1vcmUgbWV0aG9kcyBhbmQgc3RhdGUKLXZhcmlhYmxlcywgdGhlcmVieSBpbmNyZWFzaW5nIGl0cyBjb21wbGV4aXR5IGFuZCBtYWtpbmcgaXQgZGlmZmljdWx0IHRvCi1wcmVkaWN0IGl0cyBiZWhhdmlvci4gSXQgY2FuIGJlIGhhcmRlciB0byB1bmRlcnN0YW5kIGEgc3lzdGVtIHdpdGggbWFueQotaW5oZXJpdGFuY2UgbGF5ZXJzLgotPHAvPgotRElUIGlzIGRlZmluZWQgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXM6Ci08dWw+Ci08bGk+YWxsIGludGVyZmFjZSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgMTs8L2xpPgotPGxpPnRoZSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0IGhhcyBhIGRlcHRoIG9mIDE7PC9saT4KLTxsaT5hbGwgb3RoZXIgY2xhc3NlcyBoYXZlIGEgZGVwdGggb2YgMSArIHRoZSBkZXB0aCBvZiB0aGVpciBzdXBlciBjbGFzcy48L2xpPgotPC91bD4KLQotPGEgbmFtZT0iTk9BIi8+Ci08aDM+TnVtYmVyIG9mIEF0dHJpYnV0ZXMgLSBOT0E8L2gzPgotCi1UaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHN0YXRlIHZhcmlhYmxlcyBpbiBhIGNsYXNzIHNlcnZlcyBhcyBvbmUgbWVhc3VyZSBvZgotaXRzIGNvbXBsZXhpdHkuIFRoZSBtb3JlIHN0YXRlIGEgY2xhc3MgcmVwcmVzZW50cyB0aGUgbW9yZSBkaWZmaWN1bHQgaXQgaXMgdG8KLW1haW50YWluIGludmFyaWFudHMgZm9yIGl0LiBJdCBhbHNvIGhpbmRlcnMgY29tcHJlaGVuc2liaWxpdHkgYW5kIHJldXNlLgotPHAvPgotSW4gSmF2YSwgc3RhdGUgY2FuIGJlIGV4cG9zZWQgdG8gc3ViY2xhc3NlcyB0aHJvdWdoIHByb3RlY3RlZCBmaWVsZHMsIHdoaWNoCi1lbnRhaWxzIHRoYXQgdGhlIHN1YmNsYXNzIGFsc28gYmUgYXdhcmUgb2YgYW5kIG1haW50YWluIGFueSBpbnZhcmlhbnRzLiBUaGlzCi1pbnRlcmZlcmVuY2Ugd2l0aCB0aGUgY2xhc3MncyBkYXRhIGVuY2Fwc3VsYXRpb24gY2FuIGJlIGEgc291cmNlIG9mIGRlZmVjdHMKLWFuZCBoaWRkZW4gZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIHN0YXRlIHZhcmlhYmxlcy4KLTxwLz4KLU5PQSBpcyBkZWZpbmVkIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgSXQgY291bnRzIHRoZSBudW1iZXIgb2YgZmllbGRzCi1kZWNsYXJlZCBpbiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi08YSBuYW1lPSJOUk0iLz4KLTxoMz5OdW1iZXIgb2YgUmVtb3RlIE1ldGhvZHMgLSBOUk08L2gzPgotCi1OUk0gaXMgZGVmaW5lZCBmb3IgY2xhc3Nlcy4gIEEgcmVtb3RlIG1ldGhvZCBjYWxsIGlzIGRlZmluZWQgYXMgYW4KLWludm9jYXRpb24gb2YgYSBtZXRob2QgdGhhdCBpcyBub3QgZGVjbGFyZWQgaW4gYW55IG9mOgotPHVsPgotPGxpPnRoZSBjbGFzcyBpdHNlbGY7PC9saT4KLTxsaT5hIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IHRoZSBjbGFzcyBleHRlbmRzIG9yIGltcGxlbWVudHM7PC9saT4KLTxsaT5hIGNsYXNzIG9yIG1ldGhvZCB0aGF0IGV4dGVuZHMgdGhlIGNsYXNzLjwvbGk+Ci08L3VsPgotCi1UaGUgdmFsdWUgaXMgdGhlIGNvdW50IG9mIGFsbCB0aGUgcmVtb3RlIG1ldGhvZCBjYWxscyBpbiBhbGwgb2YgdGhlIG1ldGhvZHMKLWFuZCBjb25zdHJ1Y3RvcnMgb2YgdGhlIGNsYXNzLgotCi08YSBuYW1lPSJOTE0iLz4KLTxoMz5OdW1iZXIgb2YgTG9jYWwgTWV0aG9kcyAtIE5MTTwvaDM+Ci0KLU5MTSBpcyBkZWZpbmVkIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgQSBsb2NhbCBtZXRob2QgaXMgZGVmaW5lZCBhcyBhCi1tZXRob2QgdGhhdCBpcyBkZWNsYXJlZCBpbiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlLiBOTE0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8KLWluY2x1ZGUgdGhlIGxvY2FsIG1ldGhvZHMgb2YgYWxsIG9mIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4gIE1ldGhvZHMgd2l0aAotcHVibGljLCBwcm90ZWN0ZWQsIHBhY2thZ2UgYW5kIHByaXZhdGUgdmlzaWJpbGl0eSBjYW4gYmUgaW5kZXBlbmRlbnRseQotY291bnRlZCBieSBzZXR0aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KLQotPGEgbmFtZT0iV01DIi8+Ci08aDM+V2VpZ2h0ZWQgTWV0aG9kcyBwZXIgQ2xhc3MgLSBXTUM8L2gzPgotCi1JZiB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgaW4gYSBjbGFzcyBjYW4gYmUgZGV0ZXJtaW5lZCBkdXJpbmcgdGhlIGRlc2lnbgotYW5kIG1vZGVsaW5nIHBoYXNlIG9mIGEgcHJvamVjdCwgaXQgY2FuIGJlIHVzZWQgYXMgYSBwcmVkaWN0b3Igb2YgaG93Ci1tdWNoIHRpbWUgYW5kIGVmZm9ydCBpcyBuZWVkZWQgdG8gZGV2ZWxvcCwgZGVidWcgYW5kIG1haW50YWluIGl0LiBUaGlzCi1tZXRyaWMgY2FuIGJlIGZ1cnRoZXIgcmVmaW5lZCBieSBpbmNvcnBvcmF0aW5nIGEgd2VpZ2h0aW5nIGZvciB0aGUKLWNvbXBsZXhpdHkgb2YgZWFjaCBtZXRob2QuIFRoZSB1c3VhbCB3ZWlnaHRpbmcgaXMgZ2l2ZW4gYnkgdGhlIGN5Y2xvbWF0aWMKLWNvbXBsZXhpdHkgb2YgdGhlIG1ldGhvZC4KLTxwLz4KLVRoZSBzdWJjbGFzc2VzIG9mIGEgY2xhc3MgaW5oZXJpdCBhbGwgb2YgaXRzIHB1YmxpYyBhbmQgcHJvdGVjdGVkIG1ldGhvZHMsCi1hbmQgcG9zc2libHkgaXRzIHBhY2thZ2UgbWV0aG9kcyBhcyB3ZWxsLCBzbyB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgYQotY2xhc3MgaGFzIGRpcmVjdGx5IGltcGFjdHMgdGhlIGNvbXBsZXhpdHkgb2YgaXRzIHN1YmNsYXNzZXMuIENsYXNzZXMgd2l0aAotbGFyZ2UgbnVtYmVycyBvZiBtZXRob2RzIGFyZSBvZnRlbiBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24sCi1yZWR1Y2luZyB0aGUgYWJpbGl0eSB0byByZXVzZSB0aGVtLgotPHAvPgotVGhlIGRlZmluaXRpb24gb2YgV01DIGlzIGJhc2VkIHVwb24gTkxNLCBhbmQgaXQgcHJvdmlkZXMgdGhlIHNhbWUKLWNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgY291bnRpbmcgaW5oZXJpdGVkIG1ldGhvZHMgYW5kIG9mIHZhcnlpbmcKLXZpc2liaWxpdHkuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBOTE0gYWx3YXlzIGNvdW50cyBlYWNoIG1ldGhvZCBhcyAxLAotd2hlcmVhcyBXTUMgd2lsbCB3ZWlnaHQgZWFjaCBtZXRob2QuIFRoZXJlIGFyZSB0d28gd2VpZ2h0aW5nIHNjaGVtZXM6Ci08dWw+Ci08bGk+VihHKSB0aGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG9mIHRoZSBtZXRob2QgaXMgdXNlZCBhcyBpdHMgd2VpZ2h0LgotICAgTWV0aG9kcyBmcm9tIGNsYXNzIGZpbGVzIGFyZSBnaXZlbiBhIFYoRykgb2YgMS48L2xpPgotPGxpPnRoZSBhcml0eSwgb3IgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIHRoZSBtZXRob2QgYXJlIHVzZWQgdG8KLSAgIGRldGVybWluZSB0aGUgd2VpZ2h0LjwvbGk+Ci08L3VsPgotCi08YSBuYW1lPSJSRkMiLz4KLTxoMz5SZXNwb25zZSBGb3IgQ2xhc3MgLSBSRkM8L2gzPgotCi1UaGUgcmVzcG9uc2Ugc2V0IG9mIGEgY2xhc3MgaXMgdGhlIHNldCBvZiBhbGwgbWV0aG9kcyB0aGF0IGNhbiBiZSBpbnZva2VkIGFzCi1hIHJlc3VsdCBvZiBhIG1lc3NhZ2Ugc2VudCB0byBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzLiBUaGlzIGluY2x1ZGVzIG1ldGhvZHMKLWluIHRoZSBjbGFzcydzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBhbmQgbWV0aG9kcyB0aGF0IGNhbiBiZSBpbnZva2VkIG9uCi1vdGhlciBvYmplY3RzLiBUaGUgUmVzcG9uc2UgRm9yIENsYXNzIG1ldHJpYyBpcyBkZWZpbmVkIHRvIGJlIHNpemUgb2YgdGhlCi1yZXNwb25zZSBzZXQgZm9yIHRoZSBjbGFzcy4gQSBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGxhcmdlciByZXNwb25zZSBzZXQgaXMKLWNvbnNpZGVyZWQgdG8gYmUgbW9yZSBjb21wbGV4IHRoYW4gb25lIHdpdGggYSBzbWFsbGVyIHJlc3BvbnNlIHNldC4KLTxwLz4KLU9uZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBpZiBhIG1ldGhvZCBjYWxsIG9uIGEgY2xhc3MgY2FuIHJlc3VsdCBpbiBhIGxhcmdlCi1udW1iZXIgb2YgZGlmZmVyZW50IG1ldGhvZCBjYWxscyBvbiB0aGUgdGFyZ2V0IGFuZCBvdGhlciBjbGFzc2VzLCB0aGVuIGl0Ci1jYW4gYmUgaGFyZGVyIHRvIHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBjbGFzcyBhbmQgZGVidWcgcHJvYmxlbXMuIEl0IHdpbGwKLXR5cGljYWxseSByZXF1aXJlIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgdGhhdAotb2JqZWN0cyBvZiB0aGUgY2xhc3MgY2FuIGhhdmUgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLgotPHAvPgotUkZDIGlzIGRlZmluZWQgYXMgdGhlIHN1bSBvZiBOTE0gYW5kIE5STSBmb3IgdGhlIGNsYXNzLiAgVGhlIGxvY2FsIG1ldGhvZHMKLWluY2x1ZGUgYWxsIG9mIHRoZSBwdWJsaWMsIHByb3RlY3RlZCwgcGFja2FnZSBhbmQgcHJpdmF0ZSBtZXRob2RzLCBidXQgbm90Ci1tZXRob2RzIGRlY2xhcmVkIG9ubHkgaW4gYSBzdXBlcmNsYXNzLgotCi08YSBuYW1lPSJEQUMiLz4KLTxoMz5EYXRhIEFic3RyYWN0aW9uIENvdXBsaW5nIC0gREFDPC9oMz4KLQotREFDIGlzIGRlZmluZWQgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuICBJdCBjb3VudHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UKLXR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlCi1jb21wb25lbnQgdHlwZXMgb2YgYXJyYXlzIGFyZSBhbHNvIGNvdW50ZWQuICBBbnkgZmllbGQgd2l0aCBhIHR5cGUgdGhhdCBpcwotZWl0aGVyIGEgc3VwZXJ0eXBlIG9yIGEgc3VidHlwZSBvZiB0aGUgY2xhc3MgaXMgbm90IGNvdW50ZWQuCi0KLTxhIG5hbWU9IkZBTk9VVCIvPgotPGgzPkZhbiBPdXQgLSBGQU5PVVQ8L2gzPgotCi1GQU5PVVQgaXMgZGVmaW5lZCBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLiBJdAotY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW46Ci08dWw+Ci08bGk+ZmllbGQgZGVjbGFyYXRpb25zOzwvbGk+Ci08bGk+Zm9ybWFsIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlczs8L2xpPgotPGxpPnRocm93cyBkZWNsYXJhdGlvbnM7PC9saT4KLTxsaT5sb2NhbCB2YXJpYWJsZXMuPC9saT4KLTwvdWw+Ci0KLVRoZSBjb21wb25lbnQgdHlwZXMgb2YgYXJyYXlzIGFyZSBhbHNvIGNvdW50ZWQuIEFueSB0eXBlIHRoYXQgaXMgZWl0aGVyIGEKLXN1cGVydHlwZSBvciBhIHN1YnR5cGUgb2YgdGhlIGNsYXNzIGlzIG5vdCBjb3VudGVkLgotCi08YSBuYW1lPSJDQk8iLz4KLTxoMz5Db3VwbGluZyBCZXR3ZWVuIE9iamVjdHMgLSBDQk88L2gzPgotCi1XaGVuIG9uZSBvYmplY3Qgb3IgY2xhc3MgdXNlcyBhbm90aGVyIG9iamVjdCBvciBjbGFzcyB0aGV5IGFyZSBzYWlkIHRvIGJlCi1jb3VwbGVkLiBPbmUgbWFqb3Igc291cmNlIG9mIGNvdXBsaW5nIGlzIHRoYXQgYmV0d2VlbiBhIHN1cGVyY2xhc3MgYW5kIGEKLXN1YmNsYXNzLiBBIGNvdXBsaW5nIGlzIGFsc28gaW50cm9kdWNlZCB3aGVuIGEgbWV0aG9kIG9yIGZpZWxkIGluIGFub3RoZXIKLWNsYXNzIGlzIGFjY2Vzc2VkLCBvciB3aGVuIGFuIG9iamVjdCBvZiBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZCBpbnRvIG9yIG91dAotb2YgYSBtZXRob2QgaW52b2NhdGlvbi4gQ291cGxpbmcgQmV0d2VlbiBPYmplY3RzIGlzIGEgbWVhc3VyZSBvZiB0aGUKLW5vbi1pbmhlcml0YW5jZSBjb3VwbGluZyBiZXR3ZWVuIHR3byBvYmplY3RzLgotPHAvPgotQSBoaWdoIHZhbHVlIG9mIGNvdXBsaW5nIHJlZHVjZXMgdGhlIG1vZHVsYXJpdHkgb2YgdGhlIGNsYXNzIGFuZCBtYWtlcwotcmV1c2UgbW9yZSBkaWZmaWN1bHQuIFRoZSBtb3JlIGluZGVwZW5kZW50IGEgY2xhc3MgaXMgdGhlIG1vcmUgbGlrZWx5IGl0IGlzCi10aGF0IGl0IHdpbGwgYmUgcG9zc2libGUgdG8gcmV1c2UgaXQgaW4gYW5vdGhlciBwYXJ0IG9mIHRoZSBzeXN0ZW0uIFdoZW4gYQotY2xhc3MgaXMgY291cGxlZCB0byBhbm90aGVyIGNsYXNzIGl0IGJlY29tZXMgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gdGhhdAotY2xhc3MsIHRoZXJlYnkgbWFraW5nIG1haW50ZW5hbmNlIGZvciBkaWZmaWN1bHQuIEluIGFkZGl0aW9uLCBhIGNsYXNzIHRoYXQgaXMKLW92ZXJseSBkZXBlbmRlbnQgb24gb3RoZXIgY2xhc3NlcyBjYW4gYmUgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQgYW5kIHRlc3QgaW4KLWlzb2xhdGlvbi4KLTxwLz4KLUNCTyBpcyBkZWZpbmVkIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuIEl0Ci1jb3VudHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbjoKLTx1bD4KLTxsaT5maWVsZCBkZWNsYXJhdGlvbnM8L2xpPgotPGxpPmZvcm1hbCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXM8L2xpPgotPGxpPnRocm93cyBkZWNsYXJhdGlvbnM8L2xpPgotPGxpPmxvY2FsIHZhcmlhYmxlczwvbGk+Ci08L3VsPgotCi1JdCBhbHNvIGNvdW50czoKLTx1bD4KLTxsaT50eXBlcyBmcm9tIHdoaWNoIGZpZWxkIGFuZCBtZXRob2Qgc2VsZWN0aW9ucyBhcmUgbWFkZTwvbGk+Ci08L3VsPgotCi1UaGUgY29tcG9uZW50IHR5cGVzIG9mIGFycmF5cyBhcmUgYWxzbyBjb3VudGVkLiBBbnkgdHlwZSB0aGF0IGlzIGVpdGhlciBhCi1zdXBlcnR5cGUgb3IgYSBzdWJ0eXBlIG9mIHRoZSBjbGFzcyBpcyBub3QgY291bnRlZC4KLQotPGEgbmFtZT0iTENPTSIvPgotPGgzPkxhY2sgb2YgQ29oZXNpb24gT2YgTWV0aG9kcyAtIExDT008L2gzPgotCi1UaGUgY29oZXNpb24gb2YgYSBjbGFzcyBpcyB0aGUgZGVncmVlIHRvIHdoaWNoIGl0cyBtZXRob2RzIGFyZSByZWxhdGVkIHRvCi1lYWNoIG90aGVyLiBJdCBpcyBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZyB0aGUgcGF0dGVybiBvZiBzdGF0ZSB2YXJpYWJsZQotYWNjZXNzZXMgd2l0aGluIHRoZSBzZXQgb2YgbWV0aG9kcy4gSWYgYWxsIHRoZSBtZXRob2RzIGFjY2VzcyB0aGUgc2FtZSBzdGF0ZQotdmFyaWFibGVzIHRoZW4gdGhleSBoYXZlIGhpZ2ggY29oZXNpb247IGlmIHRoZXkgYWNjZXNzIGRpc2pvaW50IHNldHMgb2YKLXZhcmlhYmxlcyB0aGVuIHRoZSBjb2hlc2lvbiBpcyBsb3cuIEFuIGV4dHJlbWUgZXhhbXBsZSBvZiBsb3cgY29oZXNpb24KLXdvdWxkIGJlIGlmIG5vbmUgb2YgdGhlIG1ldGhvZHMgYWNjZXNzZWQgYW55IG9mIHRoZSBzdGF0ZSB2YXJpYWJsZXMuCi0KLUlmIGEgY2xhc3MgZXhoaWJpdHMgbG93IG1ldGhvZCBjb2hlc2lvbiBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzaWduIG9mIHRoZQotY2xhc3MgaGFzIHByb2JhYmx5IGJlZW4gcGFydGl0aW9uZWQgaW5jb3JyZWN0bHksIGFuZCBjb3VsZCBiZW5lZml0IGJ5IGJlaW5nCi1zcGxpdCBpbnRvIG1vcmUgY2xhc3NlcyB3aXRoIGluZGl2aWR1YWxseSBoaWdoZXIgY29oZXNpb24uIE9uIHRoZSBvdGhlcgotaGFuZCwgYSBoaWdoIHZhbHVlIG9mIGNvaGVzaW9uIChhIGxvdyBsYWNrIG9mIGNvaGVzaW9uKSBpbXBsaWVzIHRoYXQgdGhlCi1jbGFzcyBpcyB3ZWxsIGRlc2lnbmVkLiBBIGNvaGVzaXZlIGNsYXNzIHdpbGwgdGVuZCB0byBwcm92aWRlIGEgaGlnaCBkZWdyZWUKLW9mIGVuY2Fwc3VsYXRpb24sIHdoZXJlYXMgYSBsYWNrIG9mIGNvaGVzaW9uIGRlY3JlYXNlcyBlbmNhcHN1bGF0aW9uIGFuZAotaW5jcmVhc2VzIGNvbXBsZXhpdHkuCi08cC8+Ci1Bbm90aGVyIGZvcm0gb2YgY29oZXNpb24gdGhhdCBpcyB1c2VmdWwgZm9yIEphdmEgcHJvZ3JhbXMgaXMgY29oZXNpb24KLWJldHdlZW4gbmVzdGVkIGFuZCBlbmNsb3NpbmcgY2xhc3Nlcy4gQSBuZXN0ZWQgY2xhc3MgdGhhdCBoYXMgdmVyeSBsb3cKLWNvaGVzaW9uIHdpdGggaXRzIGVuY2xvc2luZyBjbGFzcyB3b3VsZCBwcm9iYWJseSBiZXR0ZXIgZGVzaWduZWQgYXMgYSBwZWVyCi1jbGFzcyByYXRoZXIgdGhhbiBhIG5lc3RlZCBjbGFzcy4KLTxwLz4KLUxDT00gaXMgZGVmaW5lZCBmb3IgY2xhc3Nlcy4gT3BlcmF0aW9uYWxseSwgTENPTSB0YWtlcyBlYWNoIHBhaXIgb2YKLW1ldGhvZHMgaW4gdGhlIGNsYXNzIGFuZCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgZmllbGRzIHRoZXkgZWFjaCBhY2Nlc3MuIElmCi10aGV5IGhhdmUgZGlzam9pbnQgc2V0cyBvZiBmaWVsZCBhY2Nlc3NlcyBpbmNyZWFzZSB0aGUgY291bnQgUCBieSBvbmUuIElmIHRoZXkKLXNoYXJlIGF0IGxlYXN0IG9uZSBmaWVsZCBhY2Nlc3MgdGhlbiBpbmNyZWFzZSBRIGJ5IG9uZS4gQWZ0ZXIgY29uc2lkZXJpbmcKLWVhY2ggcGFpciBvZiBtZXRob2RzLAotTENPTSA9IChQID4gUSkgPyAoUCAtIFEpIDogMAotPHAvPgotSW5kaXJlY3QgYWNjZXNzIHRvIGZpZWxkcyB2aWEgbG9jYWwgbWV0aG9kcyBjYW4gYmUgY29uc2lkZXJlZCBieSBzZXR0aW5nIGEKLW1ldHJpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KLQotPGEgbmFtZT0iTk9DIi8+Ci08aDM+TnVtYmVyIE9mIENsYXNzZXMgLSBOT0M8L2gzPgotCi1UaGUgb3ZlcmFsbCBzaXplIG9mIHRoZSBzeXN0ZW0gY2FuIGJlIGVzdGltYXRlZCBieSBjYWxjdWxhdGluZyB0aGUgbnVtYmVyCi1vZiBjbGFzc2VzIGl0IGNvbnRhaW5zLiBBIGxhcmdlIHN5c3RlbSB3aXRoIG1vcmUgY2xhc3NlcyBpcyBtb3JlIGNvbXBsZXgKLXRoYW4gYSBzbWFsbGVyIG9uZSBiZWNhdXNlIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIGludGVyYWN0aW9ucyBiZXR3ZWVuCi1vYmplY3RzIGlzIGhpZ2hlci4gVGhpcyByZWR1Y2VzIHRoZSBjb21wcmVoZW5zaWJpbGl0eSBvZiB0aGUgc3lzdGVtIHdoaWNoCi1pbiB0dXJuIG1ha2VzIGl0IGhhcmRlciB0byB0ZXN0LCBkZWJ1ZyBhbmQgbWFpbnRhaW4uCi08cC8+Ci1JZiB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgaW4gdGhlIHN5c3RlbSBjYW4gYmUgcHJvamVjdGVkIGR1cmluZyB0aGUgaW5pdGlhbAotZGVzaWduIHBoYXNlIG9mIHRoZSBwcm9qZWN0IGl0IGNhbiBzZXJ2ZSBhcyBhIGJhc2UgZm9yIGVzdGltYXRpbmcgdGhlIHRvdGFsCi1lZmZvcnQgYW5kIGNvc3Qgb2YgZGV2ZWxvcGluZywgZGVidWdnaW5nIGFuZCBtYWludGFpbmluZyB0aGUgc3lzdGVtLgotPHAvPgotVGhlIE5PQyBtZXRyaWMgY2FuIGFsc28gdXNlZnVsbHkgYmUgYXBwbGllZCBhdCB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbGV2ZWwKLWFzIHdlbGwgYXMgdGhlIHRvdGFsIHN5c3RlbS4KLTxwLz4KLU5PQ0wgaXMgZGVmaW5lZCBmb3IgY2xhc3MgYW5kIGludGVyZmFjZXMuIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb3IKLWludGVyZmFjZXMgdGhhdCBhcmUgZGVjbGFyZWQuIFRoaXMgaXMgdXN1YWxseSAxLCBidXQgbmVzdGVkIGNsYXNzIGRlY2xhcmF0aW9ucwotd2lsbCBpbmNyZWFzZSB0aGlzIG51bWJlci4KLTwvYm9keT4KLTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KLSAgICAuYmFubmVyY2VsbCB7Ci0gICAgICBib3JkZXI6IDBweDsKLSAgICAgIHBhZGRpbmc6IDBweDsKLSAgICB9Ci0gICAgYm9keSB7Ci0gICAgICBtYXJnaW4tbGVmdDogMTA7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDEwOwotICAgICAgZm9udDpub3JtYWwgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKLSAgICAgIGNvbG9yOiMwMDAwMDA7Ci0gICAgfQotICAgIC5hIHRkIHsKLSAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7Ci0gICAgfQotICAgIC5iIHRkIHsKLSAgICAgIGJhY2tncm91bmQ6ICNmZmY7Ci0gICAgfQotICAgIHRoLCB0ZCB7Ci0gICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKLSAgICB9Ci0gICAgdGggewotICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgIGJhY2tncm91bmQ6ICNjY2M7Ci0gICAgICBjb2xvcjogYmxhY2s7Ci0gICAgfQotICAgIHRhYmxlLCB0aCwgdGQgewotICAgICAgZm9udC1zaXplOjEwMCU7Ci0gICAgICBib3JkZXI6IG5vbmUKLSAgICB9Ci0gICAgdGFibGUubG9nIHRyIHRkLCB0ciB0aCB7Ci0KLSAgICB9Ci0gICAgaDIgewotICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICAgIGZvbnQtc2l6ZToxNDAlOwotICAgICAgbWFyZ2luLWJvdHRvbTogNTsKLSAgICB9Ci0gICAgaDMgewotICAgICAgZm9udC1zaXplOjEwMCU7Ci0gICAgICBmb250LXdlaWdodDpib2xkOwotICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKLSAgICAgIGNvbG9yOiB3aGl0ZTsKLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICAgIHBhZGRpbmc6IDVweDsKLSAgICAgIG1hcmdpbi1yaWdodDogMnB4OwotICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKLSAgICAgIG1hcmdpbi1ib3R0b206IDA7Ci0gICAgfQotICAgIC5FcnJvciB7Ci0gICAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Ci0gICAgfQotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBwcmludCB0aGUgbWV0cmljcyBvZiB0aGUgY2xhc3MgLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MuZGV0YWlscyI+Ci0gIDwhLS14c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IihhbmNlc3Rvcjo6cGFja2FnZSlbbGFzdCgpXS9AbmFtZSIvLS0+Ci0gIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gIDxIVE1MPgotICAgIDxIRUFEPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9IRUFEPgotICAgIDxCT0RZPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLQotICAgICAgPEgzPkNsYXNzIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvSDM+Ci0gICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDxIMz5NZXRob2RzPC9IMz4KLSAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWV0aG9kLm1ldHJpY3MuaGVhZGVyIi8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWV0aG9kIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+Ci0gICAgICA8L3RhYmxlPgotCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgotICAgIDwvQk9EWT4KLSAgPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBsaXN0IG9mIGNsYXNzZXMgaW4gYSBwYWNrYWdlIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZSIgbW9kZT0iY2xhc3Nlcy5saXN0Ij4KLSAgPEhUTUw+Ci0gICAgPEhFQUQ+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC9IRUFEPgotICAgIDxCT0RZPgotICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0gICAgICAgICAgICA8SDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvSDI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDxIMj5DbGFzc2VzPC9IMj4KLSAgICAgIDxUQUJMRSBXSURUSD0iMTAwJSI+Ci0gICAgICAgIDwhLS0geGFsYW4tbm9kZXNldDpub2Rlc2V0IGZvciBYYWxhbiAxLjIuMiAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICA8YSBocmVmPSJ7QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8L1RBQkxFPgotICAgIDwvQk9EWT4KLSAgPC9IVE1MPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLSAgb24gZWFjaCBjbGFzcy4KLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSInJyIvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDI+Q2xhc3NlczwvaDI+Ci0gICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzIj4KLSAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgPC90YWJsZT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzcy5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gIDx0cj4KLSAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0ndW5uYW1lZCBwYWNrYWdlJykiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+Ci0gICAgICA8L2E+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tCi0gIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgotICBlYWNoIHBhY2thZ2UgZXhpc3Rpbmcgb24gdGVzdHN1aXRlcy4KLSAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCi0tLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldHJpY3MiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9Ii4vcGFja2FnZS9AbmFtZSIvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KLSAgICAgIDxoMj5QYWNrYWdlczwvaDI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy9wYWNrYWdlW25vdCguL0BuYW1lID0gJ3VubmFtZWQgcGFja2FnZScpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICA8L3RhYmxlPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9ImFsbC5wYWNrYWdlcyI+Ci0gIDx0cj4KLSAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgPGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgPC9hPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRyaWNzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IicnIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+Ci0gICAgPGgzPlN1bW1hcnk8L2gzPgotICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgIDx0cj4KLSAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI1YoRykiPlYoRyk8L2E+PC90aD4KLSAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI0xPQyI+TE9DPC9hPjwvdGg+Ci0gICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNESVQiPkRJVDwvYT48L3RoPgotICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjTk9BIj5OT0E8L2E+PC90aD4KLSAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI05STSI+TlJNPC9hPjwvdGg+Ci0gICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNOTE0iPk5MTTwvYT48L3RoPgotICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjV01DIj5XTUM8L2E+PC90aD4KLSAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI1JGQyI+UkZDPC9hPjwvdGg+Ci0gICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNEQUMiPkRBQzwvYT48L3RoPgotICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjRkFOT1VUIj5GQU5PVVQ8L2E+PC90aD4KLSAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI0NCTyI+Q0JPPC9hPjwvdGg+Ci0gICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNMQ09NIj5MQ09NPC9hPjwvdGg+Ci0gICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNOT0NMIj5OT0NMPC9hPjwvdGg+Ci0gICAgPC90cj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KLSAgICA8dHI+Ci0gICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0gICAgTm90ZTogTWV0cmljcyBldmFsdWF0ZSB0aGUgcXVhbGl0eSBvZiBzb2Z0d2FyZSBieSBhbmFseXppbmcgdGhlIHByb2dyYW0gc291cmNlIGFuZCBxdWFudGlmeWluZwotICAgIHZhcmlvdXMga2luZCBvZiBjb21wbGV4aXR5LiBDb21wbGV4aXR5IGlzIGEgY29tbW9uIHNvdXJjZSBvZiBwcm9ibGVtcyBhbmQgZGVmZWN0cyBpbiBzb2Z0d2FyZS4KLSAgICBIaWdoIGNvbXBsZXhpdHkgbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8gZGV2ZWxvcCwgdW5kZXJzdGFuZCwgbWFpbnRhaW4sIGV4dGVuZCwgdGVzdCBhbmQgZGVidWcKLSAgICBhIHByb2dyYW0uCi0gICAgPHAvPgotICAgIFRoZSBwcmltYXJ5IHVzZSBvZiBtZXRyaWNzIGlzIHRvIGZvY3VzIHlvdXIgYXR0ZW50aW9uIG9uIHRob3NlIHBhcnRzIG9mIGNvZGUgdGhhdCBwb3RlbnRpYWxseSBhcmUKLSAgICBjb21wbGV4aXR5IGhvdCBzcG90cy4gT25jZSB0aGUgY29tcGxleCBhcmVhcyB5b3VyIHByb2dyYW0gaGF2ZSBiZWVuIHVuY292ZXJlZCwgeW91IGNhbiB0YWtlIHJlbWVkaWFsCi0gICAgYWN0aW9ucy4KLSAgICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBtZXRyaWNzIGFuZCB0aGVpciBtZWFuaW5nLCBwbGVhc2UgY29uc3VsdAotICAgIE1ldGFtYXRhIE1ldHJpY3MgbWFudWFsLgotICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8L3RhYmxlPgotCi0gICAgPGgzPlBhY2thZ2VzPC9oMz4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbGwubWV0cmljcy5oZWFkZXIiLz4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLy9wYWNrYWdlW25vdChAbmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKV0iPgotICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBAYnVnIHRoZXJlIGNvdWxkIHNvbWUgY2xhc3NlcyBhdCB0aGlzIGxldmVsIChjbGFzc2VzIGluIHVubmFtZWQgcGFja2FnZSkgLS0+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KLSAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gIDxIVE1MPgotICAgIDxIRUFEPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvSEVBRD4KLSAgICA8Ym9keSBvbmxvYWQ9Im9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgIDwhLS0gY3JlYXRlIGFuIGFuY2hvciB0byB0aGlzIHBhY2thZ2UgbmFtZSAtLT4KLSAgICAgIDxoMz5QYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaDM+Ci0KLSAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWxsLm1ldHJpY3MuaGVhZGVyIi8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgotICAgICAgPC90YWJsZT4KLQotICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPgotICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+Ci0gICAgICBOb3RlOiBNZXRyaWNzIGV2YWx1YXRlIHRoZSBxdWFsaXR5IG9mIHNvZnR3YXJlIGJ5IGFuYWx5emluZyB0aGUgcHJvZ3JhbSBzb3VyY2UgYW5kIHF1YW50aWZ5aW5nCi0gICAgICB2YXJpb3VzIGtpbmQgb2YgY29tcGxleGl0eS4gQ29tcGxleGl0eSBpcyBhIGNvbW1vbiBzb3VyY2Ugb2YgcHJvYmxlbXMgYW5kIGRlZmVjdHMgaW4gc29mdHdhcmUuCi0gICAgICBIaWdoIGNvbXBsZXhpdHkgbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8gZGV2ZWxvcCwgdW5kZXJzdGFuZCwgbWFpbnRhaW4sIGV4dGVuZCwgdGVzdCBhbmQgZGVidWcKLSAgICAgIGEgcHJvZ3JhbS4KLSAgICAgIDxwLz4KLSAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiBtZXRyaWNzIGlzIHRvIGZvY3VzIHlvdXIgYXR0ZW50aW9uIG9uIHRob3NlIHBhcnRzIG9mIGNvZGUgdGhhdCBwb3RlbnRpYWxseSBhcmUKLSAgICAgIGNvbXBsZXhpdHkgaG90IHNwb3RzLiBPbmNlIHRoZSBjb21wbGV4IGFyZWFzIHlvdXIgcHJvZ3JhbSBoYXZlIGJlZW4gdW5jb3ZlcmVkLCB5b3UgY2FuIHRha2UgcmVtZWRpYWwKLSAgICAgIGFjdGlvbnMuCi0gICAgICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBtZXRyaWNzIGFuZCB0aGVpciBtZWFuaW5nLCBwbGVhc2UgY29uc3VsdAotICAgICAgTWV0YW1hdGEgTWV0cmljcyBtYW51YWwuCi0gICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3Nlcy1pbi1wYWNrYWdlIiBzZWxlY3Q9IiRkb2N0cmVlL2NsYXNzZXMvY2xhc3NbQHBhY2thZ2UgPSBjdXJyZW50KCkvQG5hbWVdIi8+Ci0gICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRjbGFzc2VzLWluLXBhY2thZ2UpICZndDsgMCI+Ci0gICAgICAgIDxIMz5DbGFzc2VzPC9IMz4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciIvPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2xhc3Nlcy1pbi1wYWNrYWdlIj4KLSAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC94c2w6aWY+Ci0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIi8+Ci0gICAgPC9ib2R5PgotICA8L0hUTUw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tCi0gICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLwotICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAotLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgotICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KLSAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KLSAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLicpIi8+PC94c2w6d2l0aC1wYXJhbT4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDppZj4KLSAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+Ci0gICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+Ci0gIDwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+Ci0gIDxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBUSVRMRT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L0xJTks+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIFBhZ2UgSGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLQotICA8IS0tIGpha2FydGEgbG9nbyAtLT4KLSAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImJhbm5lcmNlbGwiIHJvd3NwYW49IjIiPgotICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPgotICAgICAgPGltZyBzcmM9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYiIGFsdD0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyIgYWxpZ249ImxlZnQiIGJvcmRlcj0iMCIvPgotICAgICAgPC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgTWV0cmljczwvaDI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwOi8vd3d3LndlYmdhaW4uY29tL3Byb2R1Y3RzL3F1YWxpdHlfYW5hbHl6ZXIvJz5XZWJnYWluIFFBL01ldGFtYXRhIE1ldHJpY3M8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGhyIHNpemU9IjEiLz4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIFBhZ2UgRm9vdGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIj4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD48aHIgbm9zaGFkZT0ieWVzIiBzaXplPSIxIi8+PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZD4KLSAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgY29sb3I9IiM1MjVENzYiIHNpemU9Ii0xIj48ZW0+Ci0gICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwMSwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgICAgIDwvZW0+PC9mb250PjwvZGl2PgotICAgICAgPC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBjbGFzcyBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciI+Ci0gIDx0cj4KLSAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+Ci0gICAgPHRoIG5vd3JhcD0ibm93cmFwIj5WKEcpPC90aD4KLSAgICA8dGg+TE9DPC90aD4KLSAgICA8dGg+RElUPC90aD4KLSAgICA8dGg+Tk9BPC90aD4KLSAgICA8dGg+TlJNPC90aD4KLSAgICA8dGg+TkxNPC90aD4KLSAgICA8dGg+V01DPC90aD4KLSAgICA8dGg+UkZDPC90aD4KLSAgICA8dGg+REFDPC90aD4KLSAgICA8dGg+RkFOT1VUPC90aD4KLSAgICA8dGg+Q0JPPC90aD4KLSAgICA8dGg+TENPTTwvdGg+Ci0gICAgPHRoPk5PQ0w8L3RoPgotICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGhlYWRlciAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0ibWV0aG9kLm1ldHJpY3MuaGVhZGVyIj4KLSAgPHRyPgotICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLSAgICA8dGggbm93cmFwPSJub3dyYXAiPlYoRyk8L3RoPgotICAgIDx0aD5MT0M8L3RoPgotICAgIDx0aD5GQU5PVVQ8L3RoPgotICAgIDx0aD5DQk88L3RoPgotICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gbWV0aG9kIGluZm9ybWF0aW9uIC0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJwcmludC5tZXRyaWNzIj4KLSAgPHRyPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5hbWUiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB2ZyIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGxvYyIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZhbm91dCIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGNibyIvPjwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJwcmludC5tZXRyaWNzIj4KLSAgPHRyPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+Ci0gICAgPHRkPjxhIGhyZWY9IntAbmFtZX0uaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHZnIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbG9jIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZGl0Ii8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9hIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbnJtIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbmxtIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAd21jIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAcmZjIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZGFjIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmFub3V0Ii8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAY2JvIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbGNvbSIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5vY2wiLz48L3RkPgotICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGV8cGFja2FnZSIgbW9kZT0icHJpbnQubWV0cmljcyI+Ci0gIDx0cj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgotICAgIDx0ZD4KLSAgICA8YSBocmVmPSJ7dHJhbnNsYXRlKEBuYW1lLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICA8L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdmciLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBsb2MiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkaXQiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBub2EiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBucm0iLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBubG0iLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB3bWMiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkByZmMiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkYWMiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYW5vdXQiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBjYm8iLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBsY29tIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9jbCIvPjwvdGQ+Ci0gIDwvdHI+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0icHJpbnQubWV0cmljcyI+Ci0gIDx0cj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgotICAgICAgPCEtLSB0aGUgZ2xvYmFsIG1ldHJpY3MgaXMgdGhlIHRvcCBwYWNrYWdlIG1ldHJpY3MgLS0+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0B2ZyIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bsb2MiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AZGl0Ii8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQG5vYSIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bucm0iLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbmxtIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQHdtYyIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0ByZmMiLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AZGFjIi8+PC90ZD4KLSAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQGZhbm91dCIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BjYm8iLz48L3RkPgotICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbGNvbSIvPjwvdGQ+Ci0gICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bub2NsIi8+PC90ZD4KLSAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIGFsdGVybmF0ZWQgcm93IHN0eWxlIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ij4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+YTwveHNsOmlmPgotICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5iPC94c2w6aWY+Ci08L3hzbDphdHRyaWJ1dGU+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIGhvdyB0byBkaXNwbGF5IHRoZSBtZXRyaWNzIHdpdGggdGhlaXIgbWF4IHZhbHVlIC0tPgotPCEtLSBAdG9kbyB0aGUgbWF4IHZhbHVlcyBtdXN0IGJlIGV4dGVybmFsIHRvIHRoZSB4c2wgLS0+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHZnIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiR2Zy5tYXgiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbG9jIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRsb2MubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGRpdCI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkZGl0Lm1heCIvPgotICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBub2EiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJG5vYS5tYXgiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbnJtIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRucm0ubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQG5sbSI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkbmxtLm1heCIvPgotICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkB3bWMiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJHdtYy5tYXgiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAcmZjIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRyZmMubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGRhYyI+Ci0gICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgotICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkZGFjLm1heCIvPgotICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBmYW5vdXQiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJGZhbm91dC5tYXgiLz4KLSAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAY2JvIj4KLSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+Ci0gICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRjYm8ubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGxjb20iPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJGxjb20ubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQG5vY2wiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KLSAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJG5vY2wubWF4Ii8+Ci0gICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJtYXgiLz4KLSAgICA8eHNsOmlmIHRlc3Q9IiR2YWx1ZSA+ICRtYXgiPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPkVycm9yPC94c2w6YXR0cmlidXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFsdWUiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy90YWdkaWZmLnhzbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2V0Yy90YWdkaWZmLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJhMWU2Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9ldGMvdGFnZGlmZi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotPCEtLQotICAgIENvcHlyaWdodCAgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIAotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgIAotICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgIAotLS0+Ci08IS0tIGEgc3R5bGVzaGVldCB0byBkaXNwbGF5IGNoYW5nZWxvZ3MgYWxhIG5ldGJlYW5zIC0tPgotPHhzbDpzdHlsZXNoZWV0Ci0gICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9Im1vZHVsZSIvPgotICA8eHNsOnBhcmFtIG5hbWU9ImN2c3dlYiIvPgotCi0gIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KLQotICA8IS0tIENvcHkgc3RhbmRhcmQgZG9jdW1lbnQgZWxlbWVudHMuICBFbGVtZW50cyB0aGF0Ci0gICAgICAgc2hvdWxkIGJlIGlnbm9yZWQgbXVzdCBiZSBmaWx0ZXJlZCBieSBhcHBseS10ZW1wbGF0ZXMKLSAgICAgICB0YWdzLiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iYXR0cmlidXRlOjoqWy4gIT0gJyddIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6Y29weT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFnZGlmZiI+Ci0gICAgPEhUTUw+Ci0gICAgICA8SEVBRD4KLSAgICAgICAgPFRJVExFPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L1RJVExFPgotICAgICAgPC9IRUFEPgotICAgICAgPEJPRFkgbGluaz0iIzAwMDAwMCIgYWxpbms9IiMwMDAwMDAiIHZsaW5rPSIjMDAwMDAwIiB0ZXh0PSIjMDAwMDAwIj4KLSAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICBib2R5LCBwIHsKLSAgICAgICAgICBmb250LWZhbWlseTogdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgICAgICAgZm9udC1zaXplOiA4MCU7Ci0gICAgICAgICAgY29sb3I6IzAwMDAwMDsKLSAgICAgICAgICB9Ci0JICAuZGF0ZUFuZEF1dGhvciB7Ci0gICAgICAgICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOwotICAgICAgICAgIGZvbnQtc2l6ZTogODAlOwotICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICAgIHRleHQtYWxpZ246bGVmdDsKLSAgICAgICAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Ci0JICB9Ci0gICAgICAgICAgdHIsIHRkewotICAgICAgICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKLSAgICAgICAgICBmb250LXNpemU6IDgwJTsKLSAgICAgICAgICBiYWNrZ3JvdW5kOiNlZWVlZTA7Ci0gICAgICAgICAgfQkgIAotCSAgPC9zdHlsZT4gICAgICAgIAotICAgICAgICAgIDxoMT4KLSAgICAgICAgICAgIDxhIG5hbWU9InRvcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvYT4KLSAgICAgICAgICA8L2gxPgotICAgICAgICAgIFRhZ2RpZmYgYmV0d2VlbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YXJ0VGFnIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3RhcnREYXRlIi8+IGFuZAotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbmRUYWciLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbmREYXRlIi8+Ci0gICAgICAgICAgPHAgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3A+Ci0gICAgICAgICAgPGhyIHNpemU9IjIiLz4KLQk8YSBuYW1lPSJUT1AiLz4KLQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQk8dHI+Ci0JCQk8dGQgYWxpZ249InJpZ2h0Ij4KLQkJCQk8YSBocmVmPSIjTmV3Ij5OZXcgRmlsZXM8L2E+IHwKLQkJCQk8YSBocmVmPSIjTW9kaWZpZWQiPk1vZGlmaWVkIEZpbGVzPC9hPiB8Ci0JCQkJPGEgaHJlZj0iI1JlbW92ZWQiPlJlbW92ZWQgRmlsZXM8L2E+Ci0JCQk8L3RkPgotCQk8L3RyPgotCTwvdGFibGU+Ci0gICAgICAgIDxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjEiPgotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvdy1lbnRyaWVzIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0aXRsZSI+TmV3IEZpbGVzPC94c2w6d2l0aC1wYXJhbT4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhbmNob3IiPk5ldzwveHNsOndpdGgtcGFyYW0+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZW50cmllcyIgc2VsZWN0PSIuLy9lbnRyeVtmaWxlL3JldmlzaW9uXVtub3QoZmlsZS9wcmV2cmV2aXNpb24pXSIvPgotCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93LWVudHJpZXMiPgotCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRpdGxlIj5Nb2RpZmllZCBGaWxlczwveHNsOndpdGgtcGFyYW0+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYW5jaG9yIj5Nb2RpZmllZDwveHNsOndpdGgtcGFyYW0+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZW50cmllcyIgc2VsZWN0PSIuLy9lbnRyeVtmaWxlL3JldmlzaW9uXVtmaWxlL3ByZXZyZXZpc2lvbl0iLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvdy1lbnRyaWVzIj4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0aXRsZSI+UmVtb3ZlZCBGaWxlczwveHNsOndpdGgtcGFyYW0+Ci0JCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYW5jaG9yIj5SZW1vdmVkPC94c2w6d2l0aC1wYXJhbT4KLQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbnRyaWVzIiBzZWxlY3Q9Ii4vL2VudHJ5W25vdChmaWxlL3JldmlzaW9uKV1bbm90KGZpbGUvcHJldnJldmlzaW9uKV0iLz4KLQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9UQUJMRT4KLSAgICAgICAgCi0gICAgICA8L0JPRFk+Ci0gICAgPC9IVE1MPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3ctZW50cmllcyI+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYW5jaG9yIi8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbnRyaWVzIi8+Ci0JPFRSPgotCQk8VEQgY29sc3Bhbj0iMiIgY2xhc3M9ImRhdGVBbmRBdXRob3IiPgotCQkJPGE+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhbmNob3IiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkZW50cmllcykiLz4gZW50cmllcwotCQkJPC9hPgotCQkJPGEgaHJlZj0iI1RPUCI+KGJhY2sgdG8gdG9wKTwvYT4KLQkJPC9URD4KLQk8L1RSPgotCTxUUj4KLQkJPFREIHdpZHRoPSIyMCI+Ci0JCQk8eHNsOnRleHQ+ICAgIDwveHNsOnRleHQ+Ci0JCTwvVEQ+Ci0JCTxURD4KLQkJICAgICAgICA8dWw+Ci0JCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkZW50cmllcyIvPgotCQkJPC91bD4KLQkJPC9URD4KLQk8L1RSPgotICA8L3hzbDp0ZW1wbGF0ZT4gIAotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVudHJ5Ij4KLQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZpbGUiLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0ZSI+Ci0gICAgPGk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2k+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRpbWUiPgotICAgIDxpPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9pPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhdXRob3IiPgotICAgIDxpPgotICAgICAgPGE+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPm1haWx0bzo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KLSAgICAgIDwvYT4KLSAgICA8L2k+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgotICAgIDxsaT4KLSAgICAgIDxhIHRhcmdldD0iX25ldyI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3Zzd2ViIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2R1bGUiIC8+Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIiAvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+Ci0gICAgICA8L2E+Ci0gICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgocHJldnJldmlzaW9uKSA+IDAgb3Igc3RyaW5nLWxlbmd0aChyZXZpc2lvbikgPiAwIj4KLSAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgIDxhIHRhcmdldD0iX25ldyI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKHByZXZyZXZpc2lvbikgPSAwICI+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGN2c3dlYiIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kdWxlIiAvPi88eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSIgLz4/cmV2PTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3gtY3Zzd2ViLW1hcmt1cDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdnN3ZWIiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZHVsZSIgLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+P3IxPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO3IyPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcmV2cmV2aXNpb24iLz4mYW1wO2RpZmZfZm9ybWF0PWg8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0icmV2aXNpb24iLz4pCi0gICAgICA8L2E+Ci0gICAgICA8L3hzbDppZj4KLSAgICA8L2xpPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIEFueSBlbGVtZW50cyB3aXRoaW4gYSBtc2cgYXJlIHByb2Nlc3NlZCwKLSAgICAgICBzbyB0aGF0IHdlIGNhbiBwcmVzZXJ2ZSBIVE1MIHRhZ3MuIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtc2ciPgotICAgIDxiPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2I+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFudGxyLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYW50bHIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjEyN2Y5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYW50bHIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hbnRscnNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFudGxyc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg3MzZlOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFudGxyc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJjZWwuamFyIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtYmNlbC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkYzUyMDIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtYmNlbC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1iY2Vsc3JjLnppcCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJjZWxzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWRiMzY0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJjZWxzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtYnNmLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZTY4YWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtYnNmLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJzZnNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1ic2ZzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzZiYWRhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWJzZnNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1sb2c0ai5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1sb2c0ai5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjOTQyN2UuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtbG9nNGouamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtbG9nNGpzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtbG9nNGpzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGI0YTMzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLWxvZzRqc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLW9yby5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1vcm8uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDAxM2JhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLW9yby5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1vcm9zcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtb3Jvc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI4ZTc5My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1vcm9zcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLXJlZ2V4cC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzOTNhM2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLXJlZ2V4cHNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1yZWdleHBzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODliOTM3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLXJlZ2V4cHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1yZXNvbHZlci5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWFwYWNoZS1yZXNvbHZlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExOWE0MWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXJzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXJzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmQzZTlhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtYXBhY2hlLXJlc29sdmVyc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtY29tbW9ucy1sb2dnaW5nLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtY29tbW9ucy1sb2dnaW5nLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmNiYTIxNy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWNvbW1vbnMtbG9nZ2luZ3NyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWNvbW1vbnMtbG9nZ2luZ3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ODU0ZjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1jb21tb25zLWxvZ2dpbmdzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1jb21tb25zLW5ldC5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWNvbW1vbnMtbmV0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQ5MGM5Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWNvbW1vbnMtbmV0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtY29tbW9ucy1uZXRzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1jb21tb25zLW5ldHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NTg4MWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1jb21tb25zLW5ldHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWphaS5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWphaS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2OTAxZjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qYWkuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qYWlzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qYWlzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjY4OTdhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamFpc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamF2YW1haWwuamFyIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qYXZhbWFpbC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3NzhlOTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qYXZhbWFpbC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWphdmFtYWlsc3JjLnppcCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamF2YW1haWxzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjExYTBkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamF2YW1haWxzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qZGVwZW5kLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamRlcGVuZC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3Y2Q4NmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qZGVwZW5kLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamRlcGVuZHNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWpkZXBlbmRzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzI5YzhkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtamRlcGVuZHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWptZi5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWptZi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzNjM4NWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qbWYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qbWZzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qbWZzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDVjMjJjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtam1mc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtanNjaC5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWpzY2guamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDY2MjY5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtanNjaC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWpzY2hzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qc2Noc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVkYTNlNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWpzY2hzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qdW5pdC5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWp1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmE0M2ZiMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWp1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtanVuaXRzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qdW5pdHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmMjc0MzEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1qdW5pdHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWxhdW5jaGVyLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbGF1bmNoZXIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmExZTc4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbGF1bmNoZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1sYXVuY2hlcnNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWxhdW5jaGVyc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NhMWJmNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LWxhdW5jaGVyc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbmV0cmV4eC5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LW5ldHJleHguamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjQ2ZmQ3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbmV0cmV4eC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LW5ldHJleHhzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1uZXRyZXh4c3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZlYjc0Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LW5ldHJleHhzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1ub2RlcHMuamFyIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1ub2RlcHMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDIwOWZhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbm9kZXBzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbm9kZXBzc3JjLnppcCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbm9kZXBzc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ5NzI2OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LW5vZGVwc3NyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0YXJ0ZWFtLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtc3RhcnRlYW0uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjhiMTkwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtc3RhcnRlYW0uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1zdGFydGVhbXNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0YXJ0ZWFtc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZmZDE4MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0YXJ0ZWFtc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtc3R5bGVib29rLmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtc3R5bGVib29rLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ2YWIyMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0eWxlYm9vay5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0eWxlYm9va3NyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN0eWxlYm9va3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MTFjY2YuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1zdHlsZWJvb2tzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1zd2luZy5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN3aW5nLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjBjMzk4MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXN3aW5nLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtc3dpbmdzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1zd2luZ3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzYTU3NGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC1zd2luZ3NyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXRyYXguamFyIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC10cmF4LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY4MzhlYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXRyYXguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC10cmF4c3JjLnppcCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtdHJheHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MmI0ZGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC10cmF4c3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtd2VibG9naWMuamFyIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC13ZWJsb2dpYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmMGRlMTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC13ZWJsb2dpYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LXdlYmxvZ2ljc3JjLnppcCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtd2VibG9naWNzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzRiOGJhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtd2VibG9naWNzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudC5qYXIgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGE1NmE1OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9saWIvYW50LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L2xpYi9hbnRzcmMuemlwIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMjg5MGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnQvbGliL2FudHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmFudC9wbHVnaW4ucHJvcGVydGllcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjVmOGEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuYW50L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gQXBhY2hlIEFudAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy8uY2xhc3NwYXRoIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyMTZjODUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSIiIHNvdXJjZXBhdGg9InNvdXJjZS1idW5kbGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS4zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iamF2YUJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvLmN2c2lnbm9yZSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzU2OGIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWphdmFCaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLy5wcm9qZWN0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTgyOTQyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxNTU4Y2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucwotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iaWRpbWFwO3ZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyO3ZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbjt2ZXJzaW9uPSIzLjIuMCIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzO3ZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZTt2ZXJzaW9uPSIzLjIuMCIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7dmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7dmVyc2lvbj0iMy4yLjAiCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXQuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTYxNzUwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgOCwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQkJCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5Db21tb25zIENvbGxlY3Rpb25zIDMuMjwvaDQ+Ci08cD5UaGUgcGx1Zy1pbiBpbmNsdWRlcyBDb21tb25zIENvbGxlY3Rpb25zIDMuMiAoJnF1b3Q7Q29tbW9ucyBDb2xsZWN0aW9ucyZxdW90OykgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhcyBwYXJ0IG9mIHRoZSBBcGFjaGUgQ29tbW9ucyBwcm9qZWN0LiAgVGhlcmVmb3JlOjwvcD4KLQotPGJsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvYT4pLgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGUgQ29tbW9ucyBDb2xsZWN0aW9ucyBiaW5hcnkgY29kZSBpcyBpbmNsdWRlZCB3aXRoIG5vIG1vZGlmaWNhdGlvbnMgZXhjZXB0IHBvc3Rwcm9jZXNzaW5nCi0ocGFjazIwMCBjb25kaXRpb25pbmcgYW5kIHNpZ25pbmcpLiBUaGUgY29ycmVzcG9uZGluZyBDb21tb25zIENvbGxlY3Rpb25zIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gc3JjLnppcC48L3A+Ci0KLTxwPkNvbW1vbnMgTmV0IGlzOjwvcD4KLQotPGJsb2NrcXVvdGU+Q29weXJpZ2h0IChjKSAxOTk3LTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvYmxvY2txdW90ZT4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIENvbW1vbnMgQ29sbGVjdGlvbnMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAotaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvTElDRU5TRS50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4KLQotPHA+VGhlIEFwYWNoZSBhdHRyaWJ1dGlvbiA8YSBocmVmPSJhYm91dF9maWxlcy9OT1RJQ0UudHh0Ij5OT1RJQ0UudHh0PC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgotCi08cD5FeGFtcGxlcyBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIHVwZGF0ZWQgc291cmNlIGNvZGUgZm9yIENvbW1vbnMgQ29sbGVjdGlvbnMgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvY29sbGVjdGlvbnMvIj5odHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL2NvbGxlY3Rpb25zLzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXRfZmlsZXMvTk9USUNFLnR4dCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9hYm91dF9maWxlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjU5ODA1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9hYm91dF9maWxlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL2Fib3V0X2ZpbGVzL1JFQURNRS50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXRfZmlsZXMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q3YzQ1My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYWJvdXRfZmlsZXMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLUpha2FydGEgQ29tbW9ucyBDb2xsZWN0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdlbGNvbWUgdG8gdGhlIENvbGxlY3Rpb25zIGNvbXBvbmVudCBvZiB0aGUgSmFrYXJ0YSBDb21tb25zIHByb2plY3QuCi1UaGlzIGNvbXBvbmVudCBjb250YWlucyBtYW55IG5ldyBjb2xsZWN0aW9ucyBhbmQgY29sbGVjdGlvbiB1dGlsaXRpZXMuCi0KLVR3byBqYXIgZmlsZXMgYXJlIHByb2R1Y2VkIGJ5IHRoaXMgY29tcG9uZW50LgotVGhlIGZpcnN0LCBjb21tb25zLWNvbGxlY3Rpb25zLmphciBpcyB0aGUgbWFpbiBqYXIgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi1UaGUgc2Vjb25kLCBjb21tb25zLWNvbGxlY3Rpb25zLXRlc3RmcmFtZXdvcmsuamFyIGlzIGFuIGV4dGVuc2lvbiB0byBqdW5pdAotZm9yIHRlc3RpbmcgbmV3IGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIGFuZCBpcyBub3Qgbm9ybWFsbHkgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi0KLQotQnVpbGRpbmcgZnJvbSBzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGNvbXBvbmVudCByZXF1aXJlcyB0aGUgZXhjZWxsZW50IEFudCB1dGlsaXR5LgotSXQgY2FuIGJlIGZvdW5kIGhlcmUgOgotCi0gIGh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KLQotRm9yIHRlc3RpbmcgdGhlIHByb2plY3QsIHlvdSB3aWxsIGFsc28gbmVlZCBKVW5pdCA6Ci0KLSAgaHR0cDovL3d3dy5qdW5pdC5vcmcvCi0KLVRvIGxldCB0aGUgdGVzdCBwcm9jZXNzIGZpbmQgSlVuaXQsIHlvdSBtYXkgbWFrZSBhIAotY29weSBvZiB0aGUgYnVpbGQucHJvcGVydGllcy5zYW1wbGUgZmlsZSwgcmVuYW1lIHRvCi1idWlsZC5wcm9wZXJ0aWVzLCAgYW5kIG1vZGlmeSB0byByZWZsZWN0Ci10aGUgbG9jYXRpb24gb2YgdGhlIGp1bml0LmphciBvbiB5b3VyIGNvbXB1dGVyLgotCi0KLU9uY2UgeW91IGhhdmUgQW50IHByb3Blcmx5IGluc3RhbGxlZCwgYW5kIHRoZQotYnVpbGQucHJvcGVydGllcyBmaWxlIGNvcnJlY3RseSByZWZsZWN0cyB0aGUgbG9jYXRpb24KLW9mIHlvdXIganVuaXQuamFyLCB5b3UgYXJlIHJlYWR5IHRvIGJ1aWxkIGFuZCB0ZXN0LgotVGhlIG1ham9yIHRhcmdldHMgYXJlOgotCi1hbnQgY29tcGlsZSAgICAgIC0gY29tcGlsZSB0aGUgY29kZQotYW50IHRlc3QgICAgICAgICAtIHRlc3QgdXNpbmcganVuaXQKLWFudCBqYXIgICAgICAgICAgLSBjcmVhdGUgYSBqYXIgZmlsZQotYW50IGphdmFkb2MgICAgICAtIGJ1aWxkIHRoZSBqYXZhZG9jCi1hbnQgZGlzdCAgICAgICAgIC0gY3JlYXRlIGZvbGRlcnMgYXMgcGVyIGEgZGlzdHJpYnV0aW9uCi1hbnQgdGYuamFyICAgICAgIC0gY3JlYXRlIHRoZSB0ZXN0ZnJhbWV3b3JrIGphciBmaWxlCi1hbnQgdGYuamF2YWRvYyAgIC0gYnVpbGQgdGhlIHRlc3RmcmFtZXdvcmsgamF2YWRvYwotCi0KLU1hdmVuCi0tLS0tLQotVGhlIGNvbXBvbmVudCBjYW4gYWxzbyBiZSBidWlsdCB1c2luZyBNYXZlbi4gKEFudCBpcyB0aGUgcHJpbWFyeSBidWlsZCB0b29sLikKLUl0IGNhbiBiZSBmb3VuZCBoZXJlIDoKLQotICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8KLQotT25jZSBpbnN0YWxsZWQsIHRoZSBqYXJzIG1heSBiZSBidWlsdCB3aXRoICdtYXZlbiBqYXInLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL2J1aWxkLnByb3BlcnRpZXMgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM4MWIzYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIG9yZy8KLW91dHB1dC4uPS4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQXJyYXlTdGFjay5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQXJyYXlTdGFjay5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWYzM2VmOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0FycmF5U3RhY2suY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JhZy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmFnLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjc5Y2Y3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CYWdVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmFnVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0Y2EzZDYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CYWdVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyNGJkNzMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkMTAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkMTAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiZjViN2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDEwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDExLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDExLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNWQ4YmYzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQxMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NzhmMWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkMy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4N2RkOTRlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkNC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ3MTFkOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkNC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ1LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxNTY3MTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkNi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ2LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmI1MDkwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ2LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkNy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2UyMDI4ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkNy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ4LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDguY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmZWI4MTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJDguY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkOS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Nzc4NzcyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcCQ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwJE15TWFwRW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkTXlNYXBFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwZDE5ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAkTXlNYXBFbnRyeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmVhbk1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY3NTg4My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpZGlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpZGlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NmVlZjEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CaWRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CaW5hcnlIZWFwJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpbmFyeUhlYXAkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY1MzFlZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpbmFyeUhlYXAkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmluYXJ5SGVhcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmluYXJ5SGVhcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjMWViMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpbmFyeUhlYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRDb2xsZWN0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkQ29sbGVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDM5YTZkYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRDb2xsZWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjc2Y2Q3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQm91bmRlZEZpZm9CdWZmZXIkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQm91bmRlZEZpZm9CdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRGaWZvQnVmZmVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMWE0MGI0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQm91bmRlZEZpZm9CdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmYWEwZGEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRkNGJlNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODI1Y2I5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTdhMzNiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NzZmYTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ2xvc3VyZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ2xvc3VyZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRmOTIxMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Nsb3N1cmUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Nsb3N1cmVVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ2xvc3VyZVV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzJhOTdlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ2xvc3VyZVV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db2xsZWN0aW9uVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0NvbGxlY3Rpb25VdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBkNGFjMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0NvbGxlY3Rpb25VdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ29tcGFyYXRvclV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db21wYXJhdG9yVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjNDFiNmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db21wYXJhdG9yVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0N1cnNvcmFibGVMaW5rZWRMaXN0JEN1cnNvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QkQ3Vyc29yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzRjZWFiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QkQ3Vyc29yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DdXJzb3JhYmxlTGlua2VkTGlzdCRMaXN0SXRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QkTGlzdEl0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkODBmYmUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DdXJzb3JhYmxlTGlua2VkTGlzdCRMaXN0SXRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QkTGlzdGFibGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0N1cnNvcmFibGVMaW5rZWRMaXN0JExpc3RhYmxlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzdkYjY4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QkTGlzdGFibGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0N1cnNvcmFibGVMaW5rZWRMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DdXJzb3JhYmxlTGlua2VkTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTUzODY5YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0N1cnNvcmFibGVMaW5rZWRMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DdXJzb3JhYmxlU3ViTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZVN1Ykxpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ZTUzMTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DdXJzb3JhYmxlU3ViTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRGVmYXVsdE1hcEJhZyRCYWdJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRGVmYXVsdE1hcEJhZyRCYWdJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjUxNzEwMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBCYWckQmFnSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlYTA0YmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9EZWZhdWx0TWFwQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9EZWZhdWx0TWFwRW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMwNDM2My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBFbnRyeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmMmZhYjIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMTAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMTAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkOWYyNzUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDEwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDExLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDExLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2Q1N2JmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQxMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQxMi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQxMi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmNhYWVlMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMTIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODQ2NzY3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA0NTBmZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkMy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZGViNmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkNS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ1LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzI2ZGFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ1LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDYuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkNi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM3Y2NkOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkNi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ3LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkOWQ2OTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkOC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ4LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Nzk3ZWFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCQ4LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwJDkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkOS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNhYTAzZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkOS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCREb3VibGVPcmRlcmVkTWFwSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkRG91YmxlT3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCREb3VibGVPcmRlcmVkTWFwSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RvdWJsZU9yZGVyZWRNYXAkTm9kZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCROb2RlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmMxYzRkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcCROb2RlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDgzYzhmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRW51bWVyYXRpb25VdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRW51bWVyYXRpb25VdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MwYTY5Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0VudW1lcmF0aW9uVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0V4dGVuZGVkUHJvcGVydGllcyRQcm9wZXJ0aWVzUmVhZGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMkUHJvcGVydGllc1JlYWRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRkM2Q5ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0V4dGVuZGVkUHJvcGVydGllcyRQcm9wZXJ0aWVzUmVhZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMkUHJvcGVydGllc1Rva2VuaXplci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRXh0ZW5kZWRQcm9wZXJ0aWVzJFByb3BlcnRpZXNUb2tlbml6ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmN2Y2ZjEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMkUHJvcGVydGllc1Rva2VuaXplci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRXh0ZW5kZWRQcm9wZXJ0aWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlODY5ODQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NjNmYmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYWN0b3J5VXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnlVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRjMWY5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnlVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdCRMaXN0SXRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdCRMaXN0SXRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ1NjhjMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QkTGlzdEl0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QkU3ViTGlzdCRTdWJMaXN0SXRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdCRTdWJMaXN0JFN1Ykxpc3RJdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTQ2OWQxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdCRTdWJMaXN0JFN1Ykxpc3RJdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0QXJyYXlMaXN0JFN1Ykxpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QkU3ViTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcxNjJhYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QkU3ViTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEFycmF5TGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJiZTMxZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzYmVjNTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRDb2xsZWN0aW9uVmlldyRDb2xsZWN0aW9uVmlld0l0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRDb2xsZWN0aW9uVmlldyRDb2xsZWN0aW9uVmlld0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTVhM2FmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAkQ29sbGVjdGlvblZpZXckQ29sbGVjdGlvblZpZXdJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAkQ29sbGVjdGlvblZpZXcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJENvbGxlY3Rpb25WaWV3LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmY2UwZmZjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAkQ29sbGVjdGlvblZpZXcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJEVudHJ5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRFbnRyeVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBmMGQ5Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJEVudHJ5U2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRLZXlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJEtleVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4MDVkZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwJEtleVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAkVmFsdWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRWYWx1ZXMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjMzY0MzIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcCRWYWx1ZXMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0SGFzaE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM0MjUzZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWI2ZDNlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkQ29sbGVjdGlvblZpZXckQ29sbGVjdGlvblZpZXdJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkQ29sbGVjdGlvblZpZXckQ29sbGVjdGlvblZpZXdJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg5OTBlZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwJENvbGxlY3Rpb25WaWV3JENvbGxlY3Rpb25WaWV3SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwJENvbGxlY3Rpb25WaWV3LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCRDb2xsZWN0aW9uVmlldy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I4ODE2Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwJENvbGxlY3Rpb25WaWV3LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCRFbnRyeVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkRW50cnlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwZjRlYmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCRFbnRyeVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkS2V5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCRLZXlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2ZTA2NGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcCRLZXlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwJFZhbHVlcy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGIzM2Y2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAkVmFsdWVzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdFRyZWVNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MWM2NmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRnVuY3RvckV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRnVuY3RvckV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTljMTNiYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Z1bmN0b3JFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0hhc2hCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0hhc2hCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1YzgxYmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9IYXNoQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9JdGVyYWJsZU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSXRlcmFibGVNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMDdmMTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9JdGVyYWJsZU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSXRlcmF0b3JVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSXRlcmF0b3JVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjJmMWQwOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0l0ZXJhdG9yVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0tleVZhbHVlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9LZXlWYWx1ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE1ZDlmYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0tleVZhbHVlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9MUlVNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0xSVU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzk5ODZiYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0xSVU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTGlzdFV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9MaXN0VXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjYjBlODYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9MaXN0VXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL01hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE5ZmY5OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL01hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NYXBVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTWFwVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MTkxYmQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NYXBVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlIYXNoTWFwJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpSGFzaE1hcCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmRhNmM3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlIYXNoTWFwJDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpSGFzaE1hcCRWYWx1ZUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAkVmFsdWVJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzlmMmJjNy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpSGFzaE1hcCRWYWx1ZUl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAkVmFsdWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAkVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDA4NzEyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlIYXNoTWFwJFZhbHVlcy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlIYXNoTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkMDA2ZmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRjYmE5NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkQmlkaU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZEJpZGlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZjAyY2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkQmlkaU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkYTk4MzAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMGIxNGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkTWFwSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGIzZTQyYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1YTM0NWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByZWRpY2F0ZVV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGVVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFhNGFlYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByZWRpY2F0ZVV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Qcmlvcml0eVF1ZXVlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Qcmlvcml0eVF1ZXVlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMmMxNTljLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUHJpb3JpdHlRdWV1ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUHJveHlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Byb3h5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkY2NmOTJlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUHJveHlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhiZjc4OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkMi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJDIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwYjFmMGIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkMi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJDMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCQzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzljZjE2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJDMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCRFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJEVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzVmNDhkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkRW50cnlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJEVudHJ5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0MjFmYjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkRW50cnlJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJEtleUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkS2V5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NTEwYzMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkS2V5SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCRTb2Z0UmVmLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkU29mdFJlZi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ1MTM5NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCRTb2Z0UmVmLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkVmFsdWVJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJFZhbHVlSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5NTg4YTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAkVmFsdWVJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJFdlYWtSZWYuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcCRXZWFrUmVmLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTk2ZjY2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwJFdlYWtSZWYuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjRhOWJjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVmZXJlbmNlTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZXNldHRhYmxlSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWE3NDBiZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVzZXR0YWJsZUxpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVzZXR0YWJsZUxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUxNzVlYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAkMS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWJhZWVlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJDIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAkMi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTBlN2IzNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAkMi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcCQzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJDMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MzA5YzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJDMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAkRW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAkRW50cnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1ODA3N2IuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJE9yZGVyZWRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcCRPcmRlcmVkSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhM2NlMWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwJE9yZGVyZWRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDgwNTAzOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NlcXVlbmNlZEhhc2hNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NldFV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXRVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTcyZjIzMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NldFV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Tb3J0ZWRCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcxZWM0My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU29ydGVkQmlkaU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU29ydGVkQmlkaU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjkyYmI5OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJpZGlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVlMmJkMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkRW50cnlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJEVudHJ5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5OTU3YmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkRW50cnlJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJEVudHJ5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkRW50cnlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhM2MzOGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkRW50cnlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCRLZXlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJEtleUl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzk5ZWQ4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJEtleUl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkS2V5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkS2V5U2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGI4ZjkwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJEtleVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJExvY2suY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCRMb2NrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MGMzZTk4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJExvY2suY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCROb2RlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkTm9kZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNkYjFlYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCROb2RlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkVmFsdWVJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJFZhbHVlSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYzU4ZTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAkVmFsdWVJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJFZhbHVlcy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwJFZhbHVlcy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNiNjE0Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcCRWYWx1ZXMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWJmMjJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3RhdGljQnVja2V0TWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTIzMGJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3luY2hyb25pemVkUHJpb3JpdHlRdWV1ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjdiYTJmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiY2FmNmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lclV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmVlQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmVlQmFnLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTIxMDk5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJlZUJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVW5ib3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9VbmJvdW5kZWRGaWZvQnVmZmVyJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiZTk4MjkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9VbmJvdW5kZWRGaWZvQnVmZmVyJDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VuYm91bmRlZEZpZm9CdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VuYm91bmRlZEZpZm9CdWZmZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NmE1N2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9VbmJvdW5kZWRGaWZvQnVmZmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Vbm1vZGlmaWFibGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VubW9kaWZpYWJsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTAyOTg4YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VubW9kaWZpYWJsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0QmFnRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RCYWdEZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxYTAyN2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RCYWdEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdE1hcEJhZyRCYWdJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0TWFwQmFnJEJhZ0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMmVkMDQ5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0TWFwQmFnJEJhZ0l0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RNYXBCYWckTXV0YWJsZUludGVnZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdE1hcEJhZyRNdXRhYmxlSW50ZWdlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRjYjQ0Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdE1hcEJhZyRNdXRhYmxlSW50ZWdlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0TWFwQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RNYXBCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxOTVmY2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RNYXBCYWcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdFNvcnRlZEJhZ0RlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmFlOGIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvSGFzaEJhZy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0hhc2hCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MGI5MzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvSGFzaEJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1ByZWRpY2F0ZWRCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkQmFnLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDk0MDAzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1ByZWRpY2F0ZWRCYWcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkU29ydGVkQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvUHJlZGljYXRlZFNvcnRlZEJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODdiMDcxMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkU29ydGVkQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvU3luY2hyb25pemVkQmFnJFN5bmNocm9uaXplZEJhZ1NldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1N5bmNocm9uaXplZEJhZyRTeW5jaHJvbml6ZWRCYWdTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyMmVhMDUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvU3luY2hyb25pemVkQmFnJFN5bmNocm9uaXplZEJhZ1NldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1N5bmNocm9uaXplZEJhZy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1N5bmNocm9uaXplZEJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjk1ZTc1MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRCYWcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRTb3J0ZWRCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRTb3J0ZWRCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NTY5MTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvU3luY2hyb25pemVkU29ydGVkQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmFuc2Zvcm1lZEJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDVmMTk5ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmFuc2Zvcm1lZEJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1RyYW5zZm9ybWVkU29ydGVkQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRTb3J0ZWRCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiYjlhMjcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRTb3J0ZWRCYWcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmVlQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJlZUJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQyOTZlMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmVlQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHlwZWRCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UeXBlZEJhZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAwMzA2Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UeXBlZEJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1R5cGVkU29ydGVkQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHlwZWRTb3J0ZWRCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1ZjJkN2EuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHlwZWRTb3J0ZWRCYWcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9Vbm1vZGlmaWFibGVCYWcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9Vbm1vZGlmaWFibGVCYWcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiNTMzMGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVW5tb2RpZmlhYmxlQmFnLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVW5tb2RpZmlhYmxlU29ydGVkQmFnLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVW5tb2RpZmlhYmxlU29ydGVkQmFnLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjMzZjMyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1VubW9kaWZpYWJsZVNvcnRlZEJhZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RCaWRpTWFwRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2U0N2RjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRCaWRpTWFwSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRCaWRpTWFwSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNjhlODcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkQmlkaU1hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkRW50cnlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRFbnRyeVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRkMDQ2Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRFbnRyeVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRFbnRyeVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTM0MWZmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRLZXlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRLZXlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhOWNlOTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkS2V5U2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkS2V5U2V0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRLZXlTZXRJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI5MTFhMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRLZXlTZXRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwJE1hcEVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkTWFwRW50cnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3MGE5MDEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkTWFwRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRWYWx1ZXMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRWYWx1ZXMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZTQ3ZWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkVmFsdWVzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI0NGFlOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwJFZpZXcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcCRWaWV3LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjJkOWU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwJFZpZXcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTcyNDQxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdER1YWxCaWRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0T3JkZXJlZEJpZGlNYXBEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RPcmRlcmVkQmlkaU1hcERlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQxZTQzNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RPcmRlcmVkQmlkaU1hcERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdFNvcnRlZEJpZGlNYXBEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RTb3J0ZWRCaWRpTWFwRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhN2Q0OTgxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdFNvcnRlZEJpZGlNYXBEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbEhhc2hCaWRpTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0R1YWxIYXNoQmlkaU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGYyYTljNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbEhhc2hCaWRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0R1YWxUcmVlQmlkaU1hcCRCaWRpT3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0R1YWxUcmVlQmlkaU1hcCRCaWRpT3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTE3YWEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsVHJlZUJpZGlNYXAkQmlkaU9yZGVyZWRNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsVHJlZUJpZGlNYXAkVmlld01hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsVHJlZUJpZGlNYXAkVmlld01hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGVmZmU3YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbFRyZWVCaWRpTWFwJFZpZXdNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbFRyZWVCaWRpTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0R1YWxUcmVlQmlkaU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY0N2E1Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbFRyZWVCaWRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJEVudHJ5Vmlldy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCRFbnRyeVZpZXcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzOTQ4NTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJEVudHJ5Vmlldy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCRJbnZlcnNlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJEludmVyc2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyMGZjNDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJEludmVyc2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkTm9kZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCROb2RlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDZkNDVmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCROb2RlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJFZpZXcuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkVmlldy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmZhMWRmNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkVmlldy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCRWaWV3SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkVmlld0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmU0MGMxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcCRWaWV3SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkVmlld01hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwJFZpZXdNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRiNGUyZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAkVmlld01hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1RyZWVCaWRpTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzdjOWJhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9Vbm1vZGlmaWFibGVCaWRpTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZUJpZGlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5MDZlNDcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZUJpZGlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZTM4ZDguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZU9yZGVyZWRCaWRpTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZVNvcnRlZEJpZGlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDMyNWY5MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0Fic3RyYWN0QnVmZmVyRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQWJzdHJhY3RCdWZmZXJEZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZGVlYmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQWJzdHJhY3RCdWZmZXJEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9CbG9ja2luZ0J1ZmZlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0Jsb2NraW5nQnVmZmVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjEyOWYyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0Jsb2NraW5nQnVmZmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEJ1ZmZlciROb3RpZnlpbmdJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRCdWZmZXIkTm90aWZ5aW5nSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjZWMxNzEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEJ1ZmZlciROb3RpZnlpbmdJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRCdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkQnVmZmVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmQ4NzNjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRCdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEZpZm9CdWZmZXIkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M5NTVhZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEZpZm9CdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkRmlmb0J1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQzZjZmMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkRmlmb0J1ZmZlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0NpcmN1bGFyRmlmb0J1ZmZlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0NpcmN1bGFyRmlmb0J1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTZiZGFhMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9DaXJjdWxhckZpZm9CdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9QcmVkaWNhdGVkQnVmZmVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJlZGljYXRlZEJ1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFmNjI0YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9QcmVkaWNhdGVkQnVmZmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIkMS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1ByaW9yaXR5QnVmZmVyJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OWNlOGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1ByaW9yaXR5QnVmZmVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkY2M0MjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9TeW5jaHJvbml6ZWRCdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9TeW5jaHJvbml6ZWRCdWZmZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlMTEyNjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvU3luY2hyb25pemVkQnVmZmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVHJhbnNmb3JtZWRCdWZmZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9UcmFuc2Zvcm1lZEJ1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRmNDU5MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9UcmFuc2Zvcm1lZEJ1ZmZlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1R5cGVkQnVmZmVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVHlwZWRCdWZmZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1Y2NkZWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVHlwZWRCdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9VbmJvdW5kZWRGaWZvQnVmZmVyJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9VbmJvdW5kZWRGaWZvQnVmZmVyJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3Yjk1MGEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5ib3VuZGVkRmlmb0J1ZmZlciQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5ib3VuZGVkRmlmb0J1ZmZlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1VuYm91bmRlZEZpZm9CdWZmZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwMTNkNWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5ib3VuZGVkRmlmb0J1ZmZlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1VubW9kaWZpYWJsZUJ1ZmZlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1VubW9kaWZpYWJsZUJ1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjMxZDA5MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Vbm1vZGlmaWFibGVCdWZmZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0Fic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjMyZDY1MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0Fic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9BYnN0cmFjdFNlcmlhbGl6YWJsZUNvbGxlY3Rpb25EZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczZTUyZDAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0Fic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Db21wb3NpdGVDb2xsZWN0aW9uJENvbGxlY3Rpb25NdXRhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0NvbXBvc2l0ZUNvbGxlY3Rpb24kQ29sbGVjdGlvbk11dGF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NWVmNjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0NvbXBvc2l0ZUNvbGxlY3Rpb24kQ29sbGVjdGlvbk11dGF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vQ29tcG9zaXRlQ29sbGVjdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Db21wb3NpdGVDb2xsZWN0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzJlOWQ0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Db21wb3NpdGVDb2xsZWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1ByZWRpY2F0ZWRDb2xsZWN0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1ByZWRpY2F0ZWRDb2xsZWN0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzA5MjY0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9QcmVkaWNhdGVkQ29sbGVjdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9TeW5jaHJvbml6ZWRDb2xsZWN0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1N5bmNocm9uaXplZENvbGxlY3Rpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzYmM4ZmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1N5bmNocm9uaXplZENvbGxlY3Rpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVHJhbnNmb3JtZWRDb2xsZWN0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1RyYW5zZm9ybWVkQ29sbGVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjliM2VkZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVHJhbnNmb3JtZWRDb2xsZWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1R5cGVkQ29sbGVjdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9UeXBlZENvbGxlY3Rpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3MTU5MDYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1R5cGVkQ29sbGVjdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVCb3VuZGVkQ29sbGVjdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVCb3VuZGVkQ29sbGVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FjY2I0Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVW5tb2RpZmlhYmxlQ29sbGVjdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTQyZmIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Cb29sZWFuQ29tcGFyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQm9vbGVhbkNvbXBhcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YTRlMDkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Cb29sZWFuQ29tcGFyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQ29tcGFyYWJsZUNvbXBhcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0NvbXBhcmFibGVDb21wYXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzEzMDBiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQ29tcGFyYWJsZUNvbXBhcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JDaGFpbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQ29tcGFyYXRvckNoYWluLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Mjc4NTUxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQ29tcGFyYXRvckNoYWluLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9GaXhlZE9yZGVyQ29tcGFyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvRml4ZWRPcmRlckNvbXBhcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0Mzk5NGIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9GaXhlZE9yZGVyQ29tcGFyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvTnVsbENvbXBhcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL051bGxDb21wYXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmUzN2E4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvTnVsbENvbXBhcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL1JldmVyc2VDb21wYXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9SZXZlcnNlQ29tcGFyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg4YzJlMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL1JldmVyc2VDb21wYXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9UcmFuc2Zvcm1pbmdDb21wYXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9UcmFuc2Zvcm1pbmdDb21wYXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmUyOWVmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvVHJhbnNmb3JtaW5nQ29tcGFyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQWxsUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbGxQcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYmQ3NWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbGxQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0FuZFByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQW5kUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmNiMTFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQW5kUHJlZGljYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbnlQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0FueVByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU1NDQ4ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0FueVByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZENsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NoYWluZWRDbG9zdXJlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTIzMDZlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZENsb3N1cmUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NoYWluZWRUcmFuc2Zvcm1lci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZFRyYW5zZm9ybWVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzdmNTQwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZFRyYW5zZm9ybWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9uZVRyYW5zZm9ybWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9uZVRyYW5zZm9ybWVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjE0MDA5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2xvbmVUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2xvc3VyZVRyYW5zZm9ybWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9zdXJlVHJhbnNmb3JtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NTc3MTAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9zdXJlVHJhbnNmb3JtZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NvbnN0YW50RmFjdG9yeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ29uc3RhbnRGYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzhhMWVkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ29uc3RhbnRGYWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Db25zdGFudFRyYW5zZm9ybWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Db25zdGFudFRyYW5zZm9ybWVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDkyMDZkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ29uc3RhbnRUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXF1YWxQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0VxdWFsUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmI1OWU0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXF1YWxQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvbkNsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvbkNsb3N1cmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2MDJiMDQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25DbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25GYWN0b3J5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25GYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGVkNmU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXhjZXB0aW9uRmFjdG9yeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXhjZXB0aW9uUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25QcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmYTY5MmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25QcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblRyYW5zZm9ybWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25UcmFuc2Zvcm1lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJiZmFmYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblRyYW5zZm9ybWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9GYWN0b3J5VHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhY3RvcnlUcmFuc2Zvcm1lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4MDEzOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhY3RvcnlUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRmFsc2VQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhbHNlUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzVhMTU5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRmFsc2VQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZvckNsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZvckNsb3N1cmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4OWZkNzEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Gb3JDbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9GdW5jdG9yVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0Z1bmN0b3JVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdlZGE1ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0Z1bmN0b3JVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWRlbnRpdHlQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0lkZW50aXR5UHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2YwOWM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWRlbnRpdHlQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0lmQ2xvc3VyZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWZDbG9zdXJlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzVjMjU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWZDbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW5jZW9mUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW5jZW9mUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2FiYWI1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSW5zdGFuY2VvZlByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSW5zdGFudGlhdGVGYWN0b3J5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW50aWF0ZUZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxMGQ3MDguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW50aWF0ZUZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlVHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlVHJhbnNmb3JtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjOTRhOWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW50aWF0ZVRyYW5zZm9ybWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnZva2VyVHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ludm9rZXJUcmFuc2Zvcm1lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ5NzFkNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ludm9rZXJUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTWFwVHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL01hcFRyYW5zZm9ybWVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZGQ4YjEzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTWFwVHJhbnNmb3JtZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05PUENsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05PUENsb3N1cmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyN2Y5MDQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BDbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BUcmFuc2Zvcm1lci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTk9QVHJhbnNmb3JtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5MmMxMGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTm9uZVByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTm9uZVByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVmZDlkMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vbmVQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vdE51bGxQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vdE51bGxQcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyMmJjOTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Ob3ROdWxsUHJlZGljYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Ob3RQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vdFByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZhZWIxNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vdFByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTnVsbElzRXhjZXB0aW9uUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNFeGNlcHRpb25QcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhOGNlZWEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNFeGNlcHRpb25QcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0ZhbHNlUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNGYWxzZVByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdjYWVjMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0ZhbHNlUHJlZGljYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNUcnVlUHJlZGljYXRlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNUcnVlUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGFiYWFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTnVsbElzVHJ1ZVByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTnVsbFByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTnVsbFByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQzODRiNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL09uZVByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT25lUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGIyN2QzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT25lUHJlZGljYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9PclByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT3JQcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1N2VlYWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9PclByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJlZGljYXRlRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9QcmVkaWNhdGVEZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4Nzk1ZDkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9QcmVkaWNhdGVEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1ByZWRpY2F0ZVRyYW5zZm9ybWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9QcmVkaWNhdGVUcmFuc2Zvcm1lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAzZTgzMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1ByZWRpY2F0ZVRyYW5zZm9ybWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Qcm90b3R5cGVGYWN0b3J5JDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjg5ZGE4My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJvdG90eXBlRmFjdG9yeSRQcm90b3R5cGVDbG9uZUZhY3RvcnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkkUHJvdG90eXBlQ2xvbmVGYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTQxNTg5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJvdG90eXBlRmFjdG9yeSRQcm90b3R5cGVDbG9uZUZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkkUHJvdG90eXBlU2VyaWFsaXphdGlvbkZhY3RvcnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkkUHJvdG90eXBlU2VyaWFsaXphdGlvbkZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4M2JhNzcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Qcm90b3R5cGVGYWN0b3J5JFByb3RvdHlwZVNlcmlhbGl6YXRpb25GYWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Qcm90b3R5cGVGYWN0b3J5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Qcm90b3R5cGVGYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNmNTM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJvdG90eXBlRmFjdG9yeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3RyaW5nVmFsdWVUcmFuc2Zvcm1lci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3RyaW5nVmFsdWVUcmFuc2Zvcm1lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzM3ODg3ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N0cmluZ1ZhbHVlVHJhbnNmb3JtZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N3aXRjaENsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N3aXRjaENsb3N1cmUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNWQ5N2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Td2l0Y2hDbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Td2l0Y2hUcmFuc2Zvcm1lci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3dpdGNoVHJhbnNmb3JtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiYTM1MGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Td2l0Y2hUcmFuc2Zvcm1lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZWRQcmVkaWNhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVkUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzI3NzBjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZWRQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVyQ2xvc3VyZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZXJDbG9zdXJlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjFiMjgwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZXJDbG9zdXJlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9UcmFuc2Zvcm1lclByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZXJQcmVkaWNhdGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNWNiNTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9UcmFuc2Zvcm1lclByZWRpY2F0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJ1ZVByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJ1ZVByZWRpY2F0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIyMDg4ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RydWVQcmVkaWNhdGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1VuaXF1ZVByZWRpY2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVW5pcXVlUHJlZGljYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTBhNmFiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVW5pcXVlUHJlZGljYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9XaGlsZUNsb3N1cmUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1doaWxlQ2xvc3VyZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg1MmRjMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1doaWxlQ2xvc3VyZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0RW1wdHlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0RW1wdHlJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxMzIyOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdEVtcHR5SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQxYmRmYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RMaXN0SXRlcmF0b3JEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBkNTA3OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdE1hcEl0ZXJhdG9yRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWFmNDkyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdE9yZGVyZWRNYXBJdGVyYXRvckRlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0T3JkZXJlZE1hcEl0ZXJhdG9yRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmNhMzcyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0T3JkZXJlZE1hcEl0ZXJhdG9yRGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYWI0ZmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiZTc2YzIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Db2xsYXRpbmdJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0NvbGxhdGluZ0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NmM0NzkyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0NvbGxhdGluZ0l0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViNWNhM2EuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxZjQ0MzAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjg1MzVhNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU1hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlPcmRlcmVkSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU9yZGVyZWRJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE5MmRjZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU9yZGVyZWRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlPcmRlcmVkTWFwSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMGEwNmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlPcmRlcmVkTWFwSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbnRyeVNldE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW50cnlTZXRNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmE0MTEyYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbnRyeVNldE1hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzNGY3YzQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0ZpbHRlckl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRmlsdGVySXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdlYTI1ZjkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRmlsdGVySXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9GaWx0ZXJMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9GaWx0ZXJMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhNGQ3YTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRmlsdGVyTGlzdEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvSXRlcmF0b3JDaGFpbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yQ2hhaW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkNmU1NTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvSXRlcmF0b3JDaGFpbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGFmMzNlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9MaXN0SXRlcmF0b3JXcmFwcGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTGlzdEl0ZXJhdG9yV3JhcHBlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJjNWFlZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9MaXN0SXRlcmF0b3JXcmFwcGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTG9vcGluZ0l0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTG9vcGluZ0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODNjNDIzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Mb29waW5nTGlzdEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTdhZDc1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0QXJyYXlJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQ2ZTMyOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyMmZiZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUxpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL09iamVjdEdyYXBoSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RHcmFwaEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjVkNGI2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL09iamVjdEdyYXBoSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Qcm94eUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUHJveHlJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY2NjI3ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Qcm94eUl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUHJveHlMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Qcm94eUxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjJjNzg1Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Qcm94eUxpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1JldmVyc2VMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9SZXZlcnNlTGlzdEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODUwZWIyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1JldmVyc2VMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9TaW5nbGV0b25JdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1NpbmdsZXRvbkl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTViZGU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1NpbmdsZXRvbkl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvU2luZ2xldG9uTGlzdEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvU2luZ2xldG9uTGlzdEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWY5MzU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1NpbmdsZXRvbkxpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1RyYW5zZm9ybUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVHJhbnNmb3JtSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMTkzZGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVHJhbnNmb3JtSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9VbmlxdWVGaWx0ZXJJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VuaXF1ZUZpbHRlckl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDQ0MDAyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VuaXF1ZUZpbHRlckl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Vbm1vZGlmaWFibGVJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDM3NmNlMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Vbm1vZGlmaWFibGVJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZUxpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZUxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ3NjdiMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Vbm1vZGlmaWFibGVMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Vbm1vZGlmaWFibGVNYXBJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjY0ZmI0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU1hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTg3M2E2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU9yZGVyZWRNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RLZXlWYWx1ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RLZXlWYWx1ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M2MDgxNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0S2V5VmFsdWUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0TWFwRW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0TWFwRW50cnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjMzQ3MTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdE1hcEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdE1hcEVudHJ5RGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdE1hcEVudHJ5RGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTgzMTc2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvRGVmYXVsdEtleVZhbHVlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9EZWZhdWx0S2V5VmFsdWUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjNjE3ZTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9EZWZhdWx0S2V5VmFsdWUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0RlZmF1bHRNYXBFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvRGVmYXVsdE1hcEVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTIzNGJlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvRGVmYXVsdE1hcEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9NdWx0aUtleS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvTXVsdGlLZXkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmNGM2NWEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9NdWx0aUtleS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvVGllZE1hcEVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9UaWVkTWFwRW50cnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5ZDcyYjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9UaWVkTWFwRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL1VubW9kaWZpYWJsZU1hcEVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9Vbm1vZGlmaWFibGVNYXBFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzUxM2I1YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL1VubW9kaWZpYWJsZU1hcEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlua2VkTGlzdCRMaW5rZWRMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaW5rZWRMaXN0JExpbmtlZExpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNkMTMyOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaW5rZWRMaXN0JExpbmtlZExpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QkTGlua2VkU3ViTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QkTGlua2VkU3ViTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTdiOWFlOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaW5rZWRMaXN0JExpbmtlZFN1Ykxpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaW5rZWRMaXN0JExpbmtlZFN1Ykxpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QkTGlua2VkU3ViTGlzdEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGE3MmJlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QkTGlua2VkU3ViTGlzdEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlua2VkTGlzdCROb2RlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlua2VkTGlzdCROb2RlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTRhMmQ4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QkTm9kZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaW5rZWRMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDJkNzM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaXN0RGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlzdERlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RmMzFjZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaXN0RGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdFNlcmlhbGl6YWJsZUxpc3REZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5MDhkNGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9DdXJzb3JhYmxlTGlua2VkTGlzdCRDdXJzb3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQ3Vyc29yYWJsZUxpbmtlZExpc3QkQ3Vyc29yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTYwYmQ1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9DdXJzb3JhYmxlTGlua2VkTGlzdCRDdXJzb3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQ3Vyc29yYWJsZUxpbmtlZExpc3QkU3ViQ3Vyc29yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0N1cnNvcmFibGVMaW5rZWRMaXN0JFN1YkN1cnNvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJhYTEwMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQ3Vyc29yYWJsZUxpbmtlZExpc3QkU3ViQ3Vyc29yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0N1cnNvcmFibGVMaW5rZWRMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0N1cnNvcmFibGVMaW5rZWRMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjlmYWMzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9DdXJzb3JhYmxlTGlua2VkTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9GaXhlZFNpemVMaXN0JEZpeGVkU2l6ZUxpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9GaXhlZFNpemVMaXN0JEZpeGVkU2l6ZUxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEyYWZiMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvRml4ZWRTaXplTGlzdCRGaXhlZFNpemVMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvRml4ZWRTaXplTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9GaXhlZFNpemVMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWUyZDU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9GaXhlZFNpemVMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0dyb3d0aExpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvR3Jvd3RoTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiZGY1ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvR3Jvd3RoTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9MYXp5TGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9MYXp5TGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkxYWU5MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvTGF6eUxpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvTm9kZUNhY2hpbmdMaW5rZWRMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L05vZGVDYWNoaW5nTGlua2VkTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzY1YWU1OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvTm9kZUNhY2hpbmdMaW5rZWRMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1ByZWRpY2F0ZWRMaXN0JFByZWRpY2F0ZWRMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvUHJlZGljYXRlZExpc3QkUHJlZGljYXRlZExpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU1YjJiMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvUHJlZGljYXRlZExpc3QkUHJlZGljYXRlZExpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9QcmVkaWNhdGVkTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9QcmVkaWNhdGVkTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjMwMTkyZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvUHJlZGljYXRlZExpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU2V0VW5pcXVlTGlzdCRTZXRMaXN0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU2V0VW5pcXVlTGlzdCRTZXRMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmYjVmNmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QkU2V0TGlzdEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QkU2V0TGlzdExpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9TZXRVbmlxdWVMaXN0JFNldExpc3RMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMTk2ZTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QkU2V0TGlzdExpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9TZXRVbmlxdWVMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMDNhZmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU3luY2hyb25pemVkTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9TeW5jaHJvbml6ZWRMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNWJjMzIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9TeW5jaHJvbml6ZWRMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyYW5zZm9ybWVkTGlzdCRUcmFuc2Zvcm1lZExpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmFuc2Zvcm1lZExpc3QkVHJhbnNmb3JtZWRMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1NmQwYjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyYW5zZm9ybWVkTGlzdCRUcmFuc2Zvcm1lZExpc3RJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmFuc2Zvcm1lZExpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJhbnNmb3JtZWRMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTExNDkyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmFuc2Zvcm1lZExpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QkMS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmVlTGlzdCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTQ1M2JmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmVlTGlzdCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyZWVMaXN0JEFWTE5vZGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QkQVZMTm9kZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVkY2M2Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QkQVZMTm9kZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmVlTGlzdCRUcmVlTGlzdEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyZWVMaXN0JFRyZWVMaXN0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwY2YwNzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyZWVMaXN0JFRyZWVMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0NTYxMzYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyZWVMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1R5cGVkTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UeXBlZExpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwNTAwNDAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1R5cGVkTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9Vbm1vZGlmaWFibGVMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1VubW9kaWZpYWJsZUxpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmYjgwMDQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1VubW9kaWZpYWJsZUxpc3QuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRFbnRyeVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEVudHJ5U2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzJhYTIyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEVudHJ5U2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkRW50cnlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2MmUwMDkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkRW50cnlTZXRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEhhc2hFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEhhc2hFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY3M2FmMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRIYXNoRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRIYXNoSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRIYXNoSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxOWJjODEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkSGFzaEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkSGFzaE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkSGFzaE1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWI1ZDIzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEhhc2hNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEtleVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEtleVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ3NmQzMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRLZXlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcCRLZXlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzFkYmI5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkVmFsdWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjUzY2YyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJFZhbHVlcy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwJFZhbHVlc0l0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4YzZkYTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RIYXNoZWRNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjE0MGYxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IkRW50cnlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciRFbnRyeVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGExZGUxNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciRFbnRyeVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciRFbnRyeVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjY2Q0YTYzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciRNYXBFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yJE1hcEVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzU3ZDBjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yJE1hcEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFkZjM4NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRFbnRyeVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWNiZDU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJEVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRLZXlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTBkNTNlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAkTGlua0VudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAkTGlua0VudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzkxZmQwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJExpbmtFbnRyeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJExpbmtJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwJExpbmtJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJjOTI0NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRMaW5rSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRMaW5rTWFwSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRMaW5rTWFwSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjZmVkNDguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAkTGlua01hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiMDQ2Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TGlua2VkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NjhiYWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdE1hcERlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TWFwRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzRmOTM4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TWFwRGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RPcmRlcmVkTWFwRGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RPcmRlcmVkTWFwRGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWMxOTA3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0T3JkZXJlZE1hcERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkUmVmZXJlbmNlRW50cnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiOTExYWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkUmVmZXJlbmNlRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VFbnRyeVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUVudHJ5U2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmUwYjE5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUVudHJ5U2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkUmVmZXJlbmNlRW50cnlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYjRhYzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkUmVmZXJlbmNlRW50cnlTZXRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUtleVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUtleVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODU3MTJmZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VLZXlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VLZXlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUtleVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzgxMTJiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZUtleVNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkUmVmZXJlbmNlTWFwSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFiOGY1YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZVZhbHVlcy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZVZhbHVlcy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBhMjE1ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VWYWx1ZXMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRSZWZlcmVuY2VWYWx1ZXNJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZVZhbHVlc0l0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGMwN2JjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFJlZmVyZW5jZVZhbHVlc0l0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkU29mdFJlZi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFNvZnRSZWYuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YWQwYTAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAkU29mdFJlZi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFdlYWtSZWYuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcCRXZWFrUmVmLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjJjNjVmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwJFdlYWtSZWYuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFJlZmVyZW5jZU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzBmYjc4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RTb3J0ZWRNYXBEZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFNvcnRlZE1hcERlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWU5OWZlYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFNvcnRlZE1hcERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Nhc2VJbnNlbnNpdGl2ZU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Nhc2VJbnNlbnNpdGl2ZU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgyZjNkNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9DYXNlSW5zZW5zaXRpdmVNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Db21wb3NpdGVNYXAkTWFwTXV0YXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0NvbXBvc2l0ZU1hcCRNYXBNdXRhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTdlYjUxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0NvbXBvc2l0ZU1hcCRNYXBNdXRhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQ29tcG9zaXRlTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQ29tcG9zaXRlTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTM4YTE2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0NvbXBvc2l0ZU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0RlZmF1bHRlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0RlZmF1bHRlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJjYTE3MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9EZWZhdWx0ZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GaXhlZFNpemVNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GaXhlZFNpemVNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0OTQ4MGQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplU29ydGVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplU29ydGVkTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTI0NzYxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZpeGVkU2l6ZVNvcnRlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEVudHJ5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkRW50cnlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzMDViODIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkRW50cnlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcCRFbnRyeVNldEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkRW50cnlTZXRJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA0NjZkNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcCRFbnRyeVNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkRmxhdE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkRmxhdE1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTgxOTE4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEZsYXRNYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEtleVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEtleVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODBjMzBiNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcCRLZXlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcCRLZXlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjE1NTY0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJEtleVNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkVmFsdWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWEyMGIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJFZhbHVlcy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwJFZhbHVlc0l0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyZDcxZTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRmxhdDNNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTU0NmQ1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvSGFzaGVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvSGFzaGVkTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMmNkMjM2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0hhc2hlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0lkZW50aXR5TWFwJElkZW50aXR5RW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9JZGVudGl0eU1hcCRJZGVudGl0eUVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWM4NDliLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0lkZW50aXR5TWFwJElkZW50aXR5RW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9JZGVudGl0eU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0lkZW50aXR5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzAyNjFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0lkZW50aXR5TWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTFJVTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTFJVTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGExMjZlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xSVU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xhenlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MYXp5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTRjMTMyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xhenlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MYXp5U29ydGVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGF6eVNvcnRlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZiZjM1YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MYXp5U29ydGVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlua2VkTWFwJExpbmtlZE1hcExpc3QuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaW5rZWRNYXAkTGlua2VkTWFwTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODYzODVlMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaW5rZWRNYXAkTGlua2VkTWFwTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpbmtlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpbmtlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZhMmFhYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaW5rZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcxY2U5YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCQxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkMi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJDIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwMDZjYWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkMi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJEVudHJ5U2V0Vmlldy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJEVudHJ5U2V0Vmlldy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2QxZjcwZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRFbnRyeVNldFZpZXcuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRLZXlTZXRWaWV3LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkS2V5U2V0Vmlldy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWFkNmZhNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRLZXlTZXRWaWV3LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkTGlzdE9yZGVyZWRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJExpc3RPcmRlcmVkSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlYTNkNDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkTGlzdE9yZGVyZWRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJExpc3RPcmRlcmVkTWFwRW50cnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRMaXN0T3JkZXJlZE1hcEVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzFjMGJiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJExpc3RPcmRlcmVkTWFwRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRMaXN0T3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkTGlzdE9yZGVyZWRNYXBJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWFiYjMyMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcCRMaXN0T3JkZXJlZE1hcEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkVmFsdWVzVmlldy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwJFZhbHVlc1ZpZXcuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2OTE4NjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAkVmFsdWVzVmlldy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNjA2NjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGlzdE9yZGVyZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9NdWx0aUtleU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpS2V5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2ViNDBiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpS2V5TWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcCQxLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmJjMGQ1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkUmVmbGVjdGlvbkZhY3RvcnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9NdWx0aVZhbHVlTWFwJFJlZmxlY3Rpb25GYWN0b3J5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzQ3OGUyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkUmVmbGVjdGlvbkZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9NdWx0aVZhbHVlTWFwJFZhbHVlcy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODQwODlkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkVmFsdWVzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAkVmFsdWVzSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxMWZhOWEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcCRWYWx1ZXNJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9NdWx0aVZhbHVlTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzA4ZTM2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9QcmVkaWNhdGVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBjMGM1YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9QcmVkaWNhdGVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZFNvcnRlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1ByZWRpY2F0ZWRTb3J0ZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljM2VjMTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZFNvcnRlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1JlZmVyZW5jZUlkZW50aXR5TWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlSWRlbnRpdHlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1NDM0YzAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlSWRlbnRpdHlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9SZWZlcmVuY2VNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9SZWZlcmVuY2VNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllMzNiNzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU2luZ2xldG9uTWFwJFNpbmdsZXRvbk1hcEl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU2luZ2xldG9uTWFwJFNpbmdsZXRvbk1hcEl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzM4ODFmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1NpbmdsZXRvbk1hcCRTaW5nbGV0b25NYXBJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1NpbmdsZXRvbk1hcCRTaW5nbGV0b25WYWx1ZXMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TaW5nbGV0b25NYXAkU2luZ2xldG9uVmFsdWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDNhYWNhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1NpbmdsZXRvbk1hcCRTaW5nbGV0b25WYWx1ZXMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TaW5nbGV0b25NYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TaW5nbGV0b25NYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUxZmQ2YTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU2luZ2xldG9uTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQ3MzQ1ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRFbnRyeUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJEVudHJ5SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlNmU1M2EuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJEVudHJ5SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkRW50cnlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkRW50cnlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NWYzYjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJEVudHJ5U2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJEtleUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJEtleUl0ZXJhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OGRjOTcyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRLZXlJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRLZXlTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkS2V5U2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGVjNGYyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRLZXlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkTG9jay5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRMb2NrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmQ0ZmMxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRMb2NrLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJE5vZGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkTm9kZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ1MzkwZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkTm9kZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcCRWYWx1ZUl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJFZhbHVlSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkM2YyMGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJFZhbHVlSXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkVmFsdWVzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwJFZhbHVlcy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY2ZjJjZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAkVmFsdWVzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU3RhdGljQnVja2V0TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MGI0YjE3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1RyYW5zZm9ybWVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHJhbnNmb3JtZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4ZjIxZjIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHJhbnNmb3JtZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UcmFuc2Zvcm1lZFNvcnRlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1RyYW5zZm9ybWVkU29ydGVkTWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YjAwNWVjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1RyYW5zZm9ybWVkU29ydGVkTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHlwZWRNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTczMDZiOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1R5cGVkU29ydGVkTWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHlwZWRTb3J0ZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkN2M4MjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHlwZWRTb3J0ZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVFbnRyeVNldCRVbm1vZGlmaWFibGVFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0JFVubW9kaWZpYWJsZUVudHJ5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Mjk0MTVkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0JFVubW9kaWZpYWJsZUVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlRW50cnlTZXQkVW5tb2RpZmlhYmxlRW50cnlTZXRJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0JFVubW9kaWZpYWJsZUVudHJ5U2V0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwYjFmYjkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlRW50cnlTZXQkVW5tb2RpZmlhYmxlRW50cnlTZXRJdGVyYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlRW50cnlTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMjIyMGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlRW50cnlTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlOTc5ZmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlTWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZU9yZGVyZWRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiOTFiZWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZVNvcnRlZE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZVNvcnRlZE1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY0OTU3Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVTb3J0ZWRNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNlcmlhbGl6YWJsZVNldERlY29yYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0Fic3RyYWN0U2VyaWFsaXphYmxlU2V0RGVjb3JhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmRhZjQ1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0Fic3RyYWN0U2VyaWFsaXphYmxlU2V0RGVjb3JhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQWJzdHJhY3RTZXREZWNvcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNldERlY29yYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk1ZGUwMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNldERlY29yYXRvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0Fic3RyYWN0U29ydGVkU2V0RGVjb3JhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQWJzdHJhY3RTb3J0ZWRTZXREZWNvcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlMjU0N2EuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQWJzdHJhY3RTb3J0ZWRTZXREZWNvcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Db21wb3NpdGVTZXQkU2V0TXV0YXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0NvbXBvc2l0ZVNldCRTZXRNdXRhdG9yLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmMzZWEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0NvbXBvc2l0ZVNldCRTZXRNdXRhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQ29tcG9zaXRlU2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQ29tcG9zaXRlU2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YmQ4MDE0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0NvbXBvc2l0ZVNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0xpc3RPcmRlcmVkU2V0JDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9MaXN0T3JkZXJlZFNldCQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTQ0YmUxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0xpc3RPcmRlcmVkU2V0JDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9MaXN0T3JkZXJlZFNldCRPcmRlcmVkU2V0SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9MaXN0T3JkZXJlZFNldCRPcmRlcmVkU2V0SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0MjcxM2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvTGlzdE9yZGVyZWRTZXQkT3JkZXJlZFNldEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvTGlzdE9yZGVyZWRTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9MaXN0T3JkZXJlZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjcyYmM4MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9MaXN0T3JkZXJlZFNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L01hcEJhY2tlZFNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L01hcEJhY2tlZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU0YjYxNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9NYXBCYWNrZWRTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9QcmVkaWNhdGVkU2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI5MDIxOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9QcmVkaWNhdGVkU2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNvcnRlZFNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1ByZWRpY2F0ZWRTb3J0ZWRTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlODUyYzYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNvcnRlZFNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1N5bmNocm9uaXplZFNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1N5bmNocm9uaXplZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGNlMDFhNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9TeW5jaHJvbml6ZWRTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9TeW5jaHJvbml6ZWRTb3J0ZWRTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9TeW5jaHJvbml6ZWRTb3J0ZWRTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmOTM2NjcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvU3luY2hyb25pemVkU29ydGVkU2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UcmFuc2Zvcm1lZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ0NWI5NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UcmFuc2Zvcm1lZFNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1RyYW5zZm9ybWVkU29ydGVkU2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTb3J0ZWRTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1ZTUzZDcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTb3J0ZWRTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UeXBlZFNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU2V0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTM2MzhhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHlwZWRTb3J0ZWRTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UeXBlZFNvcnRlZFNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFiMDJlOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UeXBlZFNvcnRlZFNldC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1VubW9kaWZpYWJsZVNldC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1VubW9kaWZpYWJsZVNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjU3NTNkNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Vbm1vZGlmaWFibGVTZXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Vbm1vZGlmaWFibGVTb3J0ZWRTZXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Vbm1vZGlmaWFibGVTb3J0ZWRTZXQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkOTE4ODAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVW5tb2RpZmlhYmxlU29ydGVkU2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjE5ZmE1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCi0jIAotIyBDb250cmlidXRvcnM6IAotIyBDaHJpcyBBbmlzemN6eWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1BcGFjaGUgQ29tbW9ucyBDb2xsZWN0aW9ucwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IzMDBhNy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zb3VyY2UKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczt2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9hYm91dC5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU2MTc1MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgOCwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQkJCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5Db21tb25zIENvbGxlY3Rpb25zIDMuMjwvaDQ+Ci08cD5UaGUgcGx1Zy1pbiBpbmNsdWRlcyBDb21tb25zIENvbGxlY3Rpb25zIDMuMiAoJnF1b3Q7Q29tbW9ucyBDb2xsZWN0aW9ucyZxdW90OykgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhcyBwYXJ0IG9mIHRoZSBBcGFjaGUgQ29tbW9ucyBwcm9qZWN0LiAgVGhlcmVmb3JlOjwvcD4KLQotPGJsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvYT4pLgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGUgQ29tbW9ucyBDb2xsZWN0aW9ucyBiaW5hcnkgY29kZSBpcyBpbmNsdWRlZCB3aXRoIG5vIG1vZGlmaWNhdGlvbnMgZXhjZXB0IHBvc3Rwcm9jZXNzaW5nCi0ocGFjazIwMCBjb25kaXRpb25pbmcgYW5kIHNpZ25pbmcpLiBUaGUgY29ycmVzcG9uZGluZyBDb21tb25zIENvbGxlY3Rpb25zIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gc3JjLnppcC48L3A+Ci0KLTxwPkNvbW1vbnMgTmV0IGlzOjwvcD4KLQotPGJsb2NrcXVvdGU+Q29weXJpZ2h0IChjKSAxOTk3LTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvYmxvY2txdW90ZT4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIENvbW1vbnMgQ29sbGVjdGlvbnMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAotaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvTElDRU5TRS50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4KLQotPHA+VGhlIEFwYWNoZSBhdHRyaWJ1dGlvbiA8YSBocmVmPSJhYm91dF9maWxlcy9OT1RJQ0UudHh0Ij5OT1RJQ0UudHh0PC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgotCi08cD5FeGFtcGxlcyBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIHVwZGF0ZWQgc291cmNlIGNvZGUgZm9yIENvbW1vbnMgQ29sbGVjdGlvbnMgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvY29sbGVjdGlvbnMvIj5odHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL2NvbGxlY3Rpb25zLzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9hYm91dF9maWxlcy9MSUNFTlNFLnR4dCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9hYm91dF9maWxlcy9OT1RJQ0UudHh0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYWJvdXRfZmlsZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y1OTgwNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9hYm91dF9maWxlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYWJvdXRfZmlsZXMvUkVBRE1FLnR4dCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL2Fib3V0X2ZpbGVzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkN2M0NTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYWJvdXRfZmlsZXMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLUpha2FydGEgQ29tbW9ucyBDb2xsZWN0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdlbGNvbWUgdG8gdGhlIENvbGxlY3Rpb25zIGNvbXBvbmVudCBvZiB0aGUgSmFrYXJ0YSBDb21tb25zIHByb2plY3QuCi1UaGlzIGNvbXBvbmVudCBjb250YWlucyBtYW55IG5ldyBjb2xsZWN0aW9ucyBhbmQgY29sbGVjdGlvbiB1dGlsaXRpZXMuCi0KLVR3byBqYXIgZmlsZXMgYXJlIHByb2R1Y2VkIGJ5IHRoaXMgY29tcG9uZW50LgotVGhlIGZpcnN0LCBjb21tb25zLWNvbGxlY3Rpb25zLmphciBpcyB0aGUgbWFpbiBqYXIgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi1UaGUgc2Vjb25kLCBjb21tb25zLWNvbGxlY3Rpb25zLXRlc3RmcmFtZXdvcmsuamFyIGlzIGFuIGV4dGVuc2lvbiB0byBqdW5pdAotZm9yIHRlc3RpbmcgbmV3IGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIGFuZCBpcyBub3Qgbm9ybWFsbHkgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi0KLQotQnVpbGRpbmcgZnJvbSBzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGNvbXBvbmVudCByZXF1aXJlcyB0aGUgZXhjZWxsZW50IEFudCB1dGlsaXR5LgotSXQgY2FuIGJlIGZvdW5kIGhlcmUgOgotCi0gIGh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KLQotRm9yIHRlc3RpbmcgdGhlIHByb2plY3QsIHlvdSB3aWxsIGFsc28gbmVlZCBKVW5pdCA6Ci0KLSAgaHR0cDovL3d3dy5qdW5pdC5vcmcvCi0KLVRvIGxldCB0aGUgdGVzdCBwcm9jZXNzIGZpbmQgSlVuaXQsIHlvdSBtYXkgbWFrZSBhIAotY29weSBvZiB0aGUgYnVpbGQucHJvcGVydGllcy5zYW1wbGUgZmlsZSwgcmVuYW1lIHRvCi1idWlsZC5wcm9wZXJ0aWVzLCAgYW5kIG1vZGlmeSB0byByZWZsZWN0Ci10aGUgbG9jYXRpb24gb2YgdGhlIGp1bml0LmphciBvbiB5b3VyIGNvbXB1dGVyLgotCi0KLU9uY2UgeW91IGhhdmUgQW50IHByb3Blcmx5IGluc3RhbGxlZCwgYW5kIHRoZQotYnVpbGQucHJvcGVydGllcyBmaWxlIGNvcnJlY3RseSByZWZsZWN0cyB0aGUgbG9jYXRpb24KLW9mIHlvdXIganVuaXQuamFyLCB5b3UgYXJlIHJlYWR5IHRvIGJ1aWxkIGFuZCB0ZXN0LgotVGhlIG1ham9yIHRhcmdldHMgYXJlOgotCi1hbnQgY29tcGlsZSAgICAgIC0gY29tcGlsZSB0aGUgY29kZQotYW50IHRlc3QgICAgICAgICAtIHRlc3QgdXNpbmcganVuaXQKLWFudCBqYXIgICAgICAgICAgLSBjcmVhdGUgYSBqYXIgZmlsZQotYW50IGphdmFkb2MgICAgICAtIGJ1aWxkIHRoZSBqYXZhZG9jCi1hbnQgZGlzdCAgICAgICAgIC0gY3JlYXRlIGZvbGRlcnMgYXMgcGVyIGEgZGlzdHJpYnV0aW9uCi1hbnQgdGYuamFyICAgICAgIC0gY3JlYXRlIHRoZSB0ZXN0ZnJhbWV3b3JrIGphciBmaWxlCi1hbnQgdGYuamF2YWRvYyAgIC0gYnVpbGQgdGhlIHRlc3RmcmFtZXdvcmsgamF2YWRvYwotCi0KLU1hdmVuCi0tLS0tLQotVGhlIGNvbXBvbmVudCBjYW4gYWxzbyBiZSBidWlsdCB1c2luZyBNYXZlbi4gKEFudCBpcyB0aGUgcHJpbWFyeSBidWlsZCB0b29sLikKLUl0IGNhbiBiZSBmb3VuZCBoZXJlIDoKLQotICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8KLQotT25jZSBpbnN0YWxsZWQsIHRoZSBqYXJzIG1heSBiZSBidWlsdCB3aXRoICdtYXZlbiBqYXInLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1NTQyOTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgb3JnLwpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0FycmF5U3RhY2suamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9BcnJheVN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNDMwNmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0FycmF5U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIGphdmEudXRpbC5TdGFja30gQVBJIHRoYXQgaXMgYmFzZWQgb24gYW4KLSAqIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gaW5zdGVhZCBvZiBhIDxjb2RlPlZlY3RvcjwvY29kZT4sIHNvIGl0IGlzIG5vdAotICogc3luY2hyb25pemVkIHRvIHByb3RlY3QgYWdhaW5zdCBtdWx0aS10aHJlYWRlZCBhY2Nlc3MuICBUaGUgaW1wbGVtZW50YXRpb24KLSAqIGlzIHRoZXJlZm9yZSBvcGVyYXRlcyBmYXN0ZXIgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHlvdSBkbyBub3QgbmVlZCB0bwotICogd29ycnkgYWJvdXQgbXVsdGlwbGUgdGhyZWFkIGNvbnRlbnRpb24uCi0gKiA8cD4KLSAqIFRoZSByZW1vdmFsIG9yZGVyIG9mIGFuIDxjb2RlPkFycmF5U3RhY2s8L2NvZGU+IGlzIGJhc2VkIG9uIGluc2VydGlvbiAKLSAqIG9yZGVyOiBUaGUgbW9zdCByZWNlbnRseSBhZGRlZCBlbGVtZW50IGlzIHJlbW92ZWQgZmlyc3QuICBUaGUgaXRlcmF0aW9uCi0gKiBvcmRlciBpcyA8aT5ub3Q8L2k+IHRoZSBzYW1lIGFzIHRoZSByZW1vdmFsIG9yZGVyLiAgVGhlIGl0ZXJhdG9yIHJldHVybnMKLSAqIGVsZW1lbnRzIGZyb20gdGhlIGJvdHRvbSB1cCwgd2hlcmVhcyB0aGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHJlbW92ZXMKLSAqIHRoZW0gZnJvbSB0aGUgdG9wIGRvd24uCi0gKiA8cD4KLSAqIFVubGlrZSA8Y29kZT5TdGFjazwvY29kZT4sIDxjb2RlPkFycmF5U3RhY2s8L2NvZGU+IGFjY2VwdHMgbnVsbCBlbnRyaWVzLgotICoKLSAqIEBzZWUgamF2YS51dGlsLlN0YWNrCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlTdGFjayBleHRlbmRzIEFycmF5TGlzdCBpbXBsZW1lbnRzIEJ1ZmZlciB7Ci0KLSAgICAvKiogRW5zdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSAqLyAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTMwMDc5MTU5OTMxNTc0NTk5TDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgPGNvZGU+QXJyYXlTdGFjazwvY29kZT4uIFRoZSBpbml0aWFsIHNpemUKLSAgICAgKiBpcyBjb250cm9sbGVkIGJ5IDxjb2RlPkFycmF5TGlzdDwvY29kZT4gYW5kIGlzIGN1cnJlbnRseSAxMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlTdGFjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IDxjb2RlPkFycmF5U3RhY2s8L2NvZGU+IHdpdGggYW4gaW5pdGlhbCBzaXplLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZSAgdGhlIGluaXRpYWwgc2l6ZSB0byB1c2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIHNwZWNpZmllZCBpbml0aWFsIHNpemUKLSAgICAgKiAgaXMgbmVnYXRpdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlTdGFjayhpbnQgaW5pdGlhbFNpemUpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbFNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCA8Y29kZT5qYXZhLnV0aWwuU3RhY2s8L2NvZGU+LgotICAgICAqIE5ldyB1c2VycyBvZiB0aGlzIGNsYXNzIHNob3VsZCB1c2UgPGNvZGU+aXNFbXB0eTwvY29kZT4gaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotICAgICAgICByZXR1cm4gaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvcCBpdGVtIG9mZiBvZiB0aGlzIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3AgaXRlbSBvbiB0aGUgc3RhY2sKLSAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcGVlaygpIHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG4gPSBzaXplKCk7Ci0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0KG4gLSAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG4ndGggaXRlbSBkb3duICh6ZXJvLXJlbGF0aXZlKSBmcm9tIHRoZSB0b3Agb2YgdGhpcwotICAgICAqIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbiAgdGhlIG51bWJlciBvZiBpdGVtcyBkb3duIHRvIGdvCi0gICAgICogQHJldHVybiB0aGUgbid0aCBpdGVtIG9uIHRoZSBzdGFjaywgemVybyByZWxhdGl2ZQotICAgICAqIEB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiAgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggaXRlbXMgb24gdGhlCi0gICAgICogIHN0YWNrIHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwZWVrKGludCBuKSB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBtID0gKHNpemUoKSAtIG4pIC0gMTsKLSAgICAgICAgaWYgKG0gPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldChtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHMgdGhlIHRvcCBpdGVtIG9mZiBvZiB0aGlzIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3AgaXRlbSBvbiB0aGUgc3RhY2sKLSAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcG9wKCkgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewotICAgICAgICBpbnQgbiA9IHNpemUoKTsKLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZW1vdmUobiAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGEgbmV3IGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suIFRoZSBwdXNoZWQgaXRlbSBpcyBhbHNvCi0gICAgICogcmV0dXJuZWQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPmFkZDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSAgdGhlIGl0ZW0gdG8gYmUgYWRkZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVtIGp1c3QgcHVzaGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXNoKE9iamVjdCBpdGVtKSB7Ci0gICAgICAgIGFkZChpdGVtKTsKLSAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb25lLWJhc2VkIHBvc2l0aW9uIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgdGhhdCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgb2JqZWN0IGV4aXN0cyBvbiB0aGlzIHN0YWNrLCB3aGVyZSB0aGUgdG9wLW1vc3QgZWxlbWVudCBpcwotICAgICAqIGNvbnNpZGVyZWQgdG8gYmUgYXQgZGlzdGFuY2UgPGNvZGU+MTwvY29kZT4uICBJZiB0aGUgb2JqZWN0IGlzIG5vdAotICAgICAqIHByZXNlbnQgb24gdGhlIHN0YWNrLCByZXR1cm4gPGNvZGU+LTE8L2NvZGU+IGluc3RlYWQuICBUaGUKLSAgICAgKiA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kIGlzIHVzZWQgdG8gY29tcGFyZSB0byB0aGUgaXRlbXMKLSAgICAgKiBpbiB0aGlzIHN0YWNrLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBiZSBzZWFyY2hlZCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSAxLWJhc2VkIGRlcHRoIGludG8gdGhlIHN0YWNrIG9mIHRoZSBvYmplY3QsIG9yIC0xIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2VhcmNoKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaW50IGkgPSBzaXplKCkgLSAxOyAgICAgICAgLy8gQ3VycmVudCBpbmRleAotICAgICAgICBpbnQgbiA9IDE7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGRpc3RhbmNlCi0gICAgICAgIHdoaWxlIChpID49IDApIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50ID0gZ2V0KGkpOwotICAgICAgICAgICAgaWYgKChvYmplY3QgPT0gbnVsbCAmJiBjdXJyZW50ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoY3VycmVudCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXQoc2l6ZSAtIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnQgCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzViZDljLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVmaW5lcyBhIGNvbGxlY3Rpb24gdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyBhbiBvYmplY3QgYXBwZWFycyBpbgotICogdGhlIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFN1cHBvc2UgeW91IGhhdmUgYSBCYWcgdGhhdCBjb250YWlucyA8Y29kZT57YSwgYSwgYiwgY308L2NvZGU+LgotICogQ2FsbGluZyB7QGxpbmsgI2dldENvdW50KE9iamVjdCl9IG9uIDxjb2RlPmE8L2NvZGU+IHdvdWxkIHJldHVybiAyLCB3aGlsZQotICogY2FsbGluZyB7QGxpbmsgI3VuaXF1ZVNldCgpfSB3b3VsZCByZXR1cm4gPGNvZGU+e2EsIGIsIGN9PC9jb2RlPi4KLSAqIDxwPgotICogPGk+Tk9URTogVGhpcyBpbnRlcmZhY2UgdmlvbGF0ZXMgdGhlIHtAbGluayBDb2xsZWN0aW9ufSBjb250cmFjdC48L2k+IAotICogVGhlIGJlaGF2aW9yIHNwZWNpZmllZCBpbiBtYW55IG9mIHRoZXNlIG1ldGhvZHMgaXMgPGk+bm90PC9pPiB0aGUgc2FtZQotICogYXMgdGhlIGJlaGF2aW9yIHNwZWNpZmllZCBieSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPi4KLSAqIFRoZSBub25jb21wbGlhbnQgbWV0aG9kcyBhcmUgY2xlYXJseSBtYXJrZWQgd2l0aCAiKFZpb2xhdGlvbikiLgotICogRXhlcmNpc2UgY2F1dGlvbiB3aGVuIHVzaW5nIGEgYmFnIGFzIGEgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgdmlvbGF0aW9uIHJlc3VsdGVkIGZyb20gdGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiBJbiBhbiBpZGVhbCB3b3JsZCwgdGhlIGludGVyZmFjZSB3b3VsZCBiZSBjaGFuZ2VkIHRvIGZpeCB0aGUgcHJvYmxlbXMsIGhvd2V2ZXIKLSAqIGl0IGhhcyBiZWVuIGRlY2lkZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW5zdGVhZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIENodWNrIEJ1cmRpY2sKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFnIGV4dGVuZHMgQ29sbGVjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKGNhcmRpbmFsaXR5KSBvZiB0aGUgZ2l2ZW4KLSAgICAgKiBvYmplY3QgY3VycmVudGx5IGluIHRoZSBiYWcuIElmIHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QgaW4gdGhlCi0gICAgICogYmFnLCByZXR1cm4gMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIG9iamVjdCwgemVybyBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBpbnQgZ2V0Q291bnQoT2JqZWN0IG9iamVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiA8aT4oVmlvbGF0aW9uKTwvaT4KLSAgICAgKiBBZGRzIG9uZSBjb3B5IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBCYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSB7QGxpbmsgI3VuaXF1ZVNldCgpfSB0aGVuIGluY3JlbWVudCBpdHMKLSAgICAgKiBjb3VudCBhcyByZXBvcnRlZCBieSB7QGxpbmsgI2dldENvdW50KE9iamVjdCl9LiBPdGhlcndpc2UgYWRkIGl0IHRvIHRoZQotICAgICAqIHtAbGluayAjdW5pcXVlU2V0KCl9IGFuZCByZXBvcnQgaXRzIGNvdW50IGFzIDEuCi0gICAgICogPHA+Ci0gICAgICogU2luY2UgdGhpcyBtZXRob2QgYWx3YXlzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgYmFnLAotICAgICAqIGFjY29yZGluZyB0byB0aGUge0BsaW5rIENvbGxlY3Rpb24jYWRkKE9iamVjdCl9IGNvbnRyYWN0LCBpdCAKLSAgICAgKiBzaG91bGQgYWx3YXlzIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4gIFNpbmNlIGl0IHNvbWV0aW1lcyByZXR1cm5zCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGlzIG1ldGhvZCB2aW9sYXRlcyB0aGUgY29udHJhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCB3YXMgbm90IGFscmVhZHkgaW4gdGhlIDxjb2RlPnVuaXF1ZVNldDwvY29kZT4KLSAgICAgKi8KLSAgICBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgPGNvZGU+bkNvcGllczwvY29kZT4gY29waWVzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBCYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSB7QGxpbmsgI3VuaXF1ZVNldCgpfSB0aGVuIGluY3JlbWVudCBpdHMKLSAgICAgKiBjb3VudCBhcyByZXBvcnRlZCBieSB7QGxpbmsgI2dldENvdW50KE9iamVjdCl9LiBPdGhlcndpc2UgYWRkIGl0IHRvIHRoZQotICAgICAqIHtAbGluayAjdW5pcXVlU2V0KCl9IGFuZCByZXBvcnQgaXRzIGNvdW50IGFzIDxjb2RlPm5Db3BpZXM8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHBhcmFtIG5Db3BpZXMgIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGFkZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCB3YXMgbm90IGFscmVhZHkgaW4gdGhlIDxjb2RlPnVuaXF1ZVNldDwvY29kZT4KLSAgICAgKi8KLSAgICBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0LCBpbnQgbkNvcGllcyk7Ci0KLSAgICAvKioKLSAgICAgKiA8aT4oVmlvbGF0aW9uKTwvaT4KLSAgICAgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gdGhlIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHdpbGwgYWxzbyByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSB7QGxpbmsgI3VuaXF1ZVNldCgpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZShPYmplY3QpfSBtZXRob2QsCi0gICAgICogdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgcmVtb3ZlIHRoZSA8aT5maXJzdDwvaT4gb2NjdXJyZW5jZSBvZiB0aGUKLSAgICAgKiBnaXZlbiBvYmplY3QsIG5vdCA8aT5hbGw8L2k+IG9jY3VycmVuY2VzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhbGwgY2hhbmdlZCB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyA8Y29kZT5uQ29waWVzPC9jb2RlPiBjb3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgQmFnLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIHJlbW92ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YKLSAgICAgKiBjb3BpZXMgaW4gdGhlIEJhZywgbm8gZXJyb3IgaXMgdGhyb3duLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIG5Db3BpZXMgIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYWxsIGNoYW5nZWQgdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0LCBpbnQgbkNvcGllcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNldH0gb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBCYWcuCi0gICAgICogPHA+Ci0gICAgICogVW5pcXVlbmVzcyBjb25zdHJhaW50cyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4ge0BsaW5rIGphdmEudXRpbC5TZXR9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFNldCBvZiB1bmlxdWUgQmFnIGVsZW1lbnRzCi0gICAgICovCi0gICAgU2V0IHVuaXF1ZVNldCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBiYWcgYWNyb3NzIGFsbCB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBCYWcKLSAgICAgKi8KLSAgICBpbnQgc2l6ZSgpOwotCi0gICAgLyoqCi0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYmFnIGNvbnRhaW5zIGFsbCBlbGVtZW50cyBpbgotICAgICAqIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCByZXNwZWN0aW5nIGNhcmRpbmFsaXR5LiAgVGhhdCBpcywgaWYgdGhlCi0gICAgICogZ2l2ZW4gY29sbGVjdGlvbiA8Y29kZT5jb2xsPC9jb2RlPiBjb250YWlucyA8Y29kZT5uPC9jb2RlPiBjb3BpZXMKLSAgICAgKiBvZiBhIGdpdmVuIG9iamVjdCwgY2FsbGluZyB7QGxpbmsgI2dldENvdW50KE9iamVjdCl9IG9uIHRoYXQgb2JqZWN0IG11c3QKLSAgICAgKiBiZSA8Y29kZT4mZ3Q7PSBuPC9jb2RlPiBmb3IgYWxsIDxjb2RlPm48L2NvZGU+IGluIDxjb2RlPmNvbGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoZSB7QGxpbmsgQ29sbGVjdGlvbiNjb250YWluc0FsbChDb2xsZWN0aW9uKX0gbWV0aG9kIHNwZWNpZmllcwotICAgICAqIHRoYXQgY2FyZGluYWxpdHkgc2hvdWxkIDxpPm5vdDwvaT4gYmUgcmVzcGVjdGVkOyB0aGlzIG1ldGhvZCBzaG91bGQKLSAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgYmFnIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiBldmVyeSBvYmplY3QgY29udGFpbmVkCi0gICAgICogaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIGNoZWNrIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBCYWcgY29udGFpbnMgYWxsIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpOwotCi0gICAgLyoqCi0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogUmVtb3ZlIGFsbCBlbGVtZW50cyByZXByZXNlbnRlZCBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiwKLSAgICAgKiByZXNwZWN0aW5nIGNhcmRpbmFsaXR5LiAgVGhhdCBpcywgaWYgdGhlIGdpdmVuIGNvbGxlY3Rpb24KLSAgICAgKiA8Y29kZT5jb2xsPC9jb2RlPiBjb250YWlucyA8Y29kZT5uPC9jb2RlPiBjb3BpZXMgb2YgYSBnaXZlbiBvYmplY3QsCi0gICAgICogdGhlIGJhZyB3aWxsIGhhdmUgPGNvZGU+bjwvY29kZT4gZmV3ZXIgY29waWVzLCBhc3N1bWluZyB0aGUgYmFnCi0gICAgICogaGFkIGF0IGxlYXN0IDxjb2RlPm48L2NvZGU+IGNvcGllcyB0byBiZWdpbiB3aXRoLgotICAgICAqCi0gICAgICogPFA+VGhlIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZUFsbChDb2xsZWN0aW9uKX0gbWV0aG9kIHNwZWNpZmllcwotICAgICAqIHRoYXQgY2FyZGluYWxpdHkgc2hvdWxkIDxpPm5vdDwvaT4gYmUgcmVzcGVjdGVkOyB0aGlzIG1ldGhvZCBzaG91bGQKLSAgICAgKiByZW1vdmUgPGk+YWxsPC9pPiBvY2N1cnJlbmNlcyBvZiBldmVyeSBvYmplY3QgY29udGFpbmVkIGluIHRoZSAKLSAgICAgKiBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYWxsIGNoYW5nZWQgdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpOwotCi0gICAgLyoqCi0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogUmVtb3ZlIGFueSBtZW1iZXJzIG9mIHRoZSBiYWcgdGhhdCBhcmUgbm90IGluIHRoZSBnaXZlbgotICAgICAqIGNvbGxlY3Rpb24sIHJlc3BlY3RpbmcgY2FyZGluYWxpdHkuICBUaGF0IGlzLCBpZiB0aGUgZ2l2ZW4KLSAgICAgKiBjb2xsZWN0aW9uIDxjb2RlPmNvbGw8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPm48L2NvZGU+IGNvcGllcyBvZiBhCi0gICAgICogZ2l2ZW4gb2JqZWN0IGFuZCB0aGUgYmFnIGhhcyA8Y29kZT5tICZndDsgbjwvY29kZT4gY29waWVzLCB0aGVuCi0gICAgICogZGVsZXRlIDxjb2RlPm0gLSBuPC9jb2RlPiBjb3BpZXMgZnJvbSB0aGUgYmFnLiAgSW4gYWRkaXRpb24sIGlmCi0gICAgICogPGNvZGU+ZTwvY29kZT4gaXMgYW4gb2JqZWN0IGluIHRoZSBiYWcgYnV0Ci0gICAgICogPGNvZGU+IWNvbGwuY29udGFpbnMoZSk8L2NvZGU+LCB0aGVuIHJlbW92ZSA8Y29kZT5lPC9jb2RlPiBhbmQgYW55Ci0gICAgICogb2YgaXRzIGNvcGllcy4KLSAgICAgKgotICAgICAqIDxQPlRoZSB7QGxpbmsgQ29sbGVjdGlvbiNyZXRhaW5BbGwoQ29sbGVjdGlvbil9IG1ldGhvZCBzcGVjaWZpZXMKLSAgICAgKiB0aGF0IGNhcmRpbmFsaXR5IHNob3VsZCA8aT5ub3Q8L2k+IGJlIHJlc3BlY3RlZDsgdGhpcyBtZXRob2Qgc2hvdWxkCi0gICAgICoga2VlcCA8aT5hbGw8L2k+IG9jY3VycmVuY2VzIG9mIGV2ZXJ5IG9iamVjdCBjb250YWluZWQgaW4gdGhlIAotICAgICAqIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gcmV0YWluCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhbGwgY2hhbmdlZCB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBJdGVyYXRvcn0gb3ZlciB0aGUgZW50aXJlIHNldCBvZiBtZW1iZXJzLAotICAgICAqIGluY2x1ZGluZyBjb3BpZXMgZHVlIHRvIGNhcmRpbmFsaXR5LiBUaGlzIGl0ZXJhdG9yIGlzIGZhaWwtZmFzdAotICAgICAqIGFuZCB3aWxsIG5vdCB0b2xlcmF0ZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBpdGVyYXRvciBvdmVyIGFsbCBlbGVtZW50cyBpbiB0aGUgQmFnCi0gICAgICovCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgbm90IHBhcnQgb2YgdGhlIGZvcm1hbCBCYWcgaW50ZXJmYWNlLCBob3dldmVyIHdoZXJlIHBvc3NpYmxlCi0gICAgLy8gQmFnIGltcGxlbWVudGF0aW9ucyBzaG91bGQgZm9sbG93IHRoZXNlIGNvbW1lbnRzLgotLy8gICAgLyoqCi0vLyAgICAgKiBDb21wYXJlcyB0aGlzIEJhZyB0byBhbm90aGVyLgotLy8gICAgICogVGhpcyBCYWcgZXF1YWxzIGFub3RoZXIgQmFnIGlmIGl0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZgotLy8gICAgICogdGhlIHNhbWUgZWxlbWVudHMuCi0vLyAgICAgKiBUaGlzIGVxdWFscyBkZWZpbml0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgU2V0IGludGVyZmFjZS4KLS8vICAgICAqIAotLy8gICAgICogQHBhcmFtIG9iaiAgdGhlIEJhZyB0byBjb21wYXJlIHRvCi0vLyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLS8vICAgICAqLwotLy8gICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7Ci0vLwotLy8gICAgLyoqCi0vLyAgICAgKiBHZXRzIGEgaGFzaCBjb2RlIGZvciB0aGUgQmFnIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBlcXVhbHMuCi0vLyAgICAgKiBUaGUgaGFzaCBjb2RlIGlzIGRlZmluZWQgYXMgdGhlIHN1bSB0b3RhbCBvZiBhIGhhc2ggY29kZSBmb3IgZWFjaCBlbGVtZW50LgotLy8gICAgICogVGhlIHBlciBlbGVtZW50IGhhc2ggY29kZSBpcyBkZWZpbmVkIGFzCi0vLyAgICAgKiA8Y29kZT4oZT09bnVsbCA/IDAgOiBlLmhhc2hDb2RlKCkpIF4gbm9PY2N1cmFuY2VzKTwvY29kZT4uCi0vLyAgICAgKiBUaGlzIGhhc2ggY29kZSBkZWZpbml0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgU2V0IGludGVyZmFjZS4KLS8vICAgICAqIAotLy8gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoZSBCYWcKLS8vICAgICAqLwotLy8gICAgaW50IGhhc2hDb2RlKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmFnVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CYWdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWQzNzdjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CYWdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZy5QcmVkaWNhdGVkQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWcuUHJlZGljYXRlZFNvcnRlZEJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLlN5bmNocm9uaXplZEJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLlN5bmNocm9uaXplZFNvcnRlZEJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLlRyYW5zZm9ybWVkQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWcuVHJhbnNmb3JtZWRTb3J0ZWRCYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZy5UcmVlQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWcuVHlwZWRCYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZy5UeXBlZFNvcnRlZEJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLlVubW9kaWZpYWJsZUJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnLlVubW9kaWZpYWJsZVNvcnRlZEJhZzsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgYW5kIGRlY29yYXRvcnMgZm9yCi0gKiB7QGxpbmsgQmFnfSBhbmQge0BsaW5rIFNvcnRlZEJhZ30gaW5zdGFuY2VzLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBBbmRyZXcgRnJlZW1hbgotICogQGF1dGhvciBNYXR0aGV3IEhhd3Rob3JuZQotICovCi1wdWJsaWMgY2xhc3MgQmFnVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgdW5tb2RpZmlhYmxlIGJhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJhZyBFTVBUWV9CQUcgPSBVbm1vZGlmaWFibGVCYWcuZGVjb3JhdGUobmV3IEhhc2hCYWcoKSk7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSB1bm1vZGlmaWFibGUgc29ydGVkIGJhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJhZyBFTVBUWV9TT1JURURfQkFHID0gVW5tb2RpZmlhYmxlU29ydGVkQmFnLmRlY29yYXRlKG5ldyBUcmVlQmFnKCkpOwotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGlvbiBvZiBCYWdVdGlscyBpcyBub3QgaW50ZW5kZWQgb3IgcmVxdWlyZWQuCi0gICAgICogSG93ZXZlciwgc29tZSB0b29scyByZXF1aXJlIGFuIGluc3RhbmNlIHRvIG9wZXJhdGUuCi0gICAgICovCi0gICAgcHVibGljIEJhZ1V0aWxzKCkgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3luY2hyb25pemVkICh0aHJlYWQtc2FmZSkgYmFnIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYmFnLgotICAgICAqIEluIG9yZGVyIHRvIGd1YXJhbnRlZSBzZXJpYWwgYWNjZXNzLCBpdCBpcyBjcml0aWNhbCB0aGF0IGFsbCAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGJhY2tpbmcgYmFnIGlzIGFjY29tcGxpc2hlZCB0aHJvdWdoIHRoZSByZXR1cm5lZCBiYWcuCi0gICAgICogPHA+Ci0gICAgICogSXQgaXMgaW1wZXJhdGl2ZSB0aGF0IHRoZSB1c2VyIG1hbnVhbGx5IHN5bmNocm9uaXplIG9uIHRoZSByZXR1cm5lZAotICAgICAqIGJhZyB3aGVuIGl0ZXJhdGluZyBvdmVyIGl0OgotICAgICAqCi0gICAgICogPHByZT4KLSAgICAgKiBCYWcgYmFnID0gQmFnVXRpbHMuc3luY2hyb25pemVkQmFnKG5ldyBIYXNoQmFnKCkpOwotICAgICAqIC4uLgotICAgICAqIHN5bmNocm9uaXplZChiYWcpIHsKLSAgICAgKiAgICAgSXRlcmF0b3IgaSA9IGJhZy5pdGVyYXRvcigpOyAvLyBNdXN0IGJlIGluIHN5bmNocm9uaXplZCBibG9jawotICAgICAqICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICogICAgICAgICBmb28oaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogRmFpbHVyZSB0byBmb2xsb3cgdGhpcyBhZHZpY2UgbWF5IHJlc3VsdCBpbiBub24tZGV0ZXJtaW5pc3RpYyAKLSAgICAgKiBiZWhhdmlvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gc3luY2hyb25pemUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIGJhZyBiYWNrZWQgYnkgdGhhdCBiYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIEJhZyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCYWcgc3luY2hyb25pemVkQmFnKEJhZyBiYWcpIHsKLSAgICAgICAgcmV0dXJuIFN5bmNocm9uaXplZEJhZy5kZWNvcmF0ZShiYWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIGdpdmVuIGJhZy4gIEFueSBtb2RpZmljYXRpb24KLSAgICAgKiBhdHRlbXB0cyB0byB0aGUgcmV0dXJuZWQgYmFnIHdpbGwgcmFpc2UgYW4gCi0gICAgICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgd2hvc2UgdW5tb2RpZmlhYmxlIHZpZXcgaXMgdG8gYmUgcmV0dXJuZWQsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoYXQgYmFnCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBCYWcgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmFnIHVubW9kaWZpYWJsZUJhZyhCYWcgYmFnKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVCYWcuZGVjb3JhdGUoYmFnKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByZWRpY2F0ZWQgKHZhbGlkYXRpbmcpIGJhZyBiYWNrZWQgYnkgdGhlIGdpdmVuIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGluIHRoZSBnaXZlbiBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBiYWcuCi0gICAgICogVHJ5aW5nIHRvIGFkZCBhbiBpbnZhbGlkIG9iamVjdCByZXN1bHRzIGluIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLSAgICAgKiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgYmFnIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLAotICAgICAqIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyBpbnZhbGlkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIHByZWRpY2F0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgZm9yIHRoZSBiYWcsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgcHJlZGljYXRlZCBiYWcgYmFja2VkIGJ5IHRoZSBnaXZlbiBiYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIEJhZyBvciBQcmVkaWNhdGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmFnIHByZWRpY2F0ZWRCYWcoQmFnIGJhZywgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICByZXR1cm4gUHJlZGljYXRlZEJhZy5kZWNvcmF0ZShiYWcsIHByZWRpY2F0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0eXBlZCBiYWcgYmFja2VkIGJ5IHRoZSBnaXZlbiBiYWcuCi0gICAgICogPHA+Ci0gICAgICogT25seSBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBjYW4gYmUgYWRkZWQgdG8gdGhlIGJhZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGxpbWl0IHRvIGEgc3BlY2lmaWMgdHlwZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0eXBlICB0aGUgdHlwZSBvZiBvYmplY3RzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgYmFnCi0gICAgICogQHJldHVybiBhIHR5cGVkIGJhZyBiYWNrZWQgYnkgdGhlIHNwZWNpZmllZCBiYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJhZyB0eXBlZEJhZyhCYWcgYmFnLCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBUeXBlZEJhZy5kZWNvcmF0ZShiYWcsIHR5cGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHJhbnNmb3JtZWQgYmFnIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYmFnLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggb2JqZWN0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1lciBhcyBpdCBpcyBhZGRlZCB0byB0aGUKLSAgICAgKiBCYWcuIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBiYWcgYWZ0ZXIgaW52b2tpbmcgdGhpcyAKLSAgICAgKiBtZXRob2QsIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyB1bnRyYW5zZm9ybWVkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIHByZWRpY2F0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIGZvciB0aGUgYmFnLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHRyYW5zZm9ybWVkIGJhZyBiYWNrZWQgYnkgdGhlIGdpdmVuIGJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgQmFnIG9yIFRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJhZyB0cmFuc2Zvcm1lZEJhZyhCYWcgYmFnLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZWRCYWcuZGVjb3JhdGUoYmFnLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3luY2hyb25pemVkICh0aHJlYWQtc2FmZSkgc29ydGVkIGJhZyBiYWNrZWQgYnkgdGhlIGdpdmVuIAotICAgICAqIHNvcnRlZCBiYWcuCi0gICAgICogSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHNlcmlhbCBhY2Nlc3MsIGl0IGlzIGNyaXRpY2FsIHRoYXQgYWxsIAotICAgICAqIGFjY2VzcyB0byB0aGUgYmFja2luZyBiYWcgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggdGhlIHJldHVybmVkIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyBpbXBlcmF0aXZlIHRoYXQgdGhlIHVzZXIgbWFudWFsbHkgc3luY2hyb25pemUgb24gdGhlIHJldHVybmVkCi0gICAgICogYmFnIHdoZW4gaXRlcmF0aW5nIG92ZXIgaXQ6Ci0gICAgICoKLSAgICAgKiA8cHJlPgotICAgICAqIFNvcnRlZEJhZyBiYWcgPSBCYWdVdGlscy5zeW5jaHJvbml6ZWRTb3J0ZWRCYWcobmV3IFRyZWVCYWcoKSk7Ci0gICAgICogLi4uCi0gICAgICogc3luY2hyb25pemVkKGJhZykgewotICAgICAqICAgICBJdGVyYXRvciBpID0gYmFnLml0ZXJhdG9yKCk7IC8vIE11c3QgYmUgaW4gc3luY2hyb25pemVkIGJsb2NrCi0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgKiAgICAgICAgIGZvbyhpLm5leHQoKSk7Ci0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBGYWlsdXJlIHRvIGZvbGxvdyB0aGlzIGFkdmljZSBtYXkgcmVzdWx0IGluIG5vbi1kZXRlcm1pbmlzdGljIAotICAgICAqIGJlaGF2aW9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBzeW5jaHJvbml6ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgYmFnIGJhY2tlZCBieSB0aGF0IGJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgU29ydGVkQmFnIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZEJhZyBzeW5jaHJvbml6ZWRTb3J0ZWRCYWcoU29ydGVkQmFnIGJhZykgewotICAgICAgICByZXR1cm4gU3luY2hyb25pemVkU29ydGVkQmFnLmRlY29yYXRlKGJhZyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIGdpdmVuIHNvcnRlZCBiYWcuICBBbnkgbW9kaWZpY2F0aW9uCi0gICAgICogYXR0ZW1wdHMgdG8gdGhlIHJldHVybmVkIGJhZyB3aWxsIHJhaXNlIGFuIAotICAgICAqIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHdob3NlIHVubW9kaWZpYWJsZSB2aWV3IGlzIHRvIGJlIHJldHVybmVkLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGF0IGJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgU29ydGVkQmFnIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZEJhZyB1bm1vZGlmaWFibGVTb3J0ZWRCYWcoU29ydGVkQmFnIGJhZykgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU29ydGVkQmFnLmRlY29yYXRlKGJhZyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBzb3J0ZWQgYmFnIGJhY2tlZCBieSB0aGUgZ2l2ZW4gc29ydGVkIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGluIHRoZSBnaXZlbiBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBiYWcuCi0gICAgICogVHJ5aW5nIHRvIGFkZCBhbiBpbnZhbGlkIG9iamVjdCByZXN1bHRzIGluIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLSAgICAgKiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgYmFnIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLAotICAgICAqIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyBpbnZhbGlkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgc29ydGVkIGJhZyB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIGZvciB0aGUgYmFnLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHByZWRpY2F0ZWQgYmFnIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYmFnCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBTb3J0ZWRCYWcgb3IgUHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZEJhZyBwcmVkaWNhdGVkU29ydGVkQmFnKFNvcnRlZEJhZyBiYWcsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIFByZWRpY2F0ZWRTb3J0ZWRCYWcuZGVjb3JhdGUoYmFnLCBwcmVkaWNhdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHlwZWQgc29ydGVkIGJhZyBiYWNrZWQgYnkgdGhlIGdpdmVuIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSBhZGRlZCB0byB0aGUgYmFnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gbGltaXQgdG8gYSBzcGVjaWZpYyB0eXBlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIG9mIG9iamVjdHMgd2hpY2ggbWF5IGJlIGFkZGVkIHRvIHRoZSBiYWcKLSAgICAgKiBAcmV0dXJuIGEgdHlwZWQgYmFnIGJhY2tlZCBieSB0aGUgc3BlY2lmaWVkIGJhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkQmFnIHR5cGVkU29ydGVkQmFnKFNvcnRlZEJhZyBiYWcsIENsYXNzIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIFR5cGVkU29ydGVkQmFnLmRlY29yYXRlKGJhZywgdHlwZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0cmFuc2Zvcm1lZCBzb3J0ZWQgYmFnIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYmFnLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggb2JqZWN0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1lciBhcyBpdCBpcyBhZGRlZCB0byB0aGUKLSAgICAgKiBCYWcuIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBiYWcgYWZ0ZXIgaW52b2tpbmcgdGhpcyAKLSAgICAgKiBtZXRob2QsIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyB1bnRyYW5zZm9ybWVkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIHByZWRpY2F0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIGZvciB0aGUgYmFnLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHRyYW5zZm9ybWVkIGJhZyBiYWNrZWQgYnkgdGhlIGdpdmVuIGJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgQmFnIG9yIFRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZEJhZyB0cmFuc2Zvcm1lZFNvcnRlZEJhZyhTb3J0ZWRCYWcgYmFnLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZWRTb3J0ZWRCYWcuZGVjb3JhdGUoYmFnLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CZWFuTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyYmU5NjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JlYW5NYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVW5tb2RpZmlhYmxlTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuQWJzdHJhY3RNYXBFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqIAotICogQW4gaW1wbGVtZW50YXRpb24gb2YgTWFwIGZvciBKYXZhQmVhbnMgd2hpY2ggdXNlcyBpbnRyb3NwZWN0aW9uIHRvCi0gKiBnZXQgYW5kIHB1dCBwcm9wZXJ0aWVzIGluIHRoZSBiZWFuLgotICogPHA+Ci0gKiBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBhdHRlbXB0cyB0byBnZXQgb3Igc2V0IGEgcHJvcGVydHkgdGhlbiB0aGUKLSAqIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgbm9uIGV4aXN0ZW50IGluIHRoZSBNYXAKLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBEaW1pdGVyIERpbWl0cm92Ci0gKiAKLSAqIEBkZXByZWNhdGVkIElkZW50aWNhbCBjbGFzcyBub3cgYXZhaWxhYmxlIGluIGNvbW1vbnMtYmVhbnV0aWxzIChmdWxsIGphciB2ZXJzaW9uKS4KLSAqIFRoaXMgdmVyc2lvbiBpcyBkdWUgdG8gYmUgcmVtb3ZlZCBpbiBjb2xsZWN0aW9ucyB2NC4wLgotICovCi1wdWJsaWMgY2xhc3MgQmVhbk1hcCBleHRlbmRzIEFic3RyYWN0TWFwIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBiZWFuOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSGFzaE1hcCByZWFkTWV0aG9kcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSGFzaE1hcCB3cml0ZU1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2hNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgYXJyYXkuICBVc2VkIHRvIGludm9rZSBhY2Nlc3NvcnMgdmlhIHJlZmxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOVUxMX0FSR1VNRU5UUyA9IHt9OwotCi0gICAgLyoqCi0gICAgICogTWFwcyBwcmltaXRpdmUgQ2xhc3MgdHlwZXMgdG8gdHJhbnNmb3JtZXJzLiAgVGhlIHRyYW5zZm9ybWVyCi0gICAgICogdHJhbnNmb3JtIHN0cmluZ3MgaW50byB0aGUgYXBwcm9wcmlhdGUgcHJpbWl0aXZlIHdyYXBwZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBIYXNoTWFwIGRlZmF1bHRUcmFuc2Zvcm1lcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlZmF1bHRUcmFuc2Zvcm1lcnMucHV0KCAKLSAgICAgICAgICAgIEJvb2xlYW4uVFlQRSwgCi0gICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCBpbnB1dCApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggaW5wdXQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgZGVmYXVsdFRyYW5zZm9ybWVycy5wdXQoIAotICAgICAgICAgICAgQ2hhcmFjdGVyLlRZUEUsIAotICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgaW5wdXQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKCBpbnB1dC50b1N0cmluZygpLmNoYXJBdCggMCApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBkZWZhdWx0VHJhbnNmb3JtZXJzLnB1dCggCi0gICAgICAgICAgICBCeXRlLlRZUEUsIAotICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgaW5wdXQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlLnZhbHVlT2YoIGlucHV0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGRlZmF1bHRUcmFuc2Zvcm1lcnMucHV0KCAKLSAgICAgICAgICAgIFNob3J0LlRZUEUsIAotICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgaW5wdXQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaG9ydC52YWx1ZU9mKCBpbnB1dC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBkZWZhdWx0VHJhbnNmb3JtZXJzLnB1dCggCi0gICAgICAgICAgICBJbnRlZ2VyLlRZUEUsIAotICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgaW5wdXQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoIGlucHV0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGRlZmF1bHRUcmFuc2Zvcm1lcnMucHV0KCAKLSAgICAgICAgICAgIExvbmcuVFlQRSwgCi0gICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCBpbnB1dCApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZiggaW5wdXQudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgZGVmYXVsdFRyYW5zZm9ybWVycy5wdXQoIAotICAgICAgICAgICAgRmxvYXQuVFlQRSwgCi0gICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCBpbnB1dCApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2YoIGlucHV0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGRlZmF1bHRUcmFuc2Zvcm1lcnMucHV0KCAKLSAgICAgICAgICAgIERvdWJsZS5UWVBFLCAKLSAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybSggT2JqZWN0IGlucHV0ICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YoIGlucHV0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8vIENvbnN0cnVjdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSA8Y29kZT5CZWFuTWFwPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmVhbk1hcCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJlYW5NYXA8L2NvZGU+IHRoYXQgb3BlcmF0ZXMgb24gdGhlIAotICAgICAqIHNwZWNpZmllZCBiZWFuLiAgSWYgdGhlIGdpdmVuIGJlYW4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KLSAgICAgKiB0aGlzIG1hcCB3aWxsIGJlIGVtcHR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW4gIHRoZSBiZWFuIGZvciB0aGlzIG1hcCB0byBvcGVyYXRlIG9uCi0gICAgICovCi0gICAgcHVibGljIEJlYW5NYXAoT2JqZWN0IGJlYW4pIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICAgICAgaW5pdGlhbGlzZSgpOwotICAgIH0KLQotICAgIC8vIE1hcCBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQmVhbk1hcDwiICsgU3RyaW5nLnZhbHVlT2YoYmVhbikgKyAiPiI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsb25lIHRoaXMgYmVhbiBtYXAgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm9jZXNzOiAKLSAgICAgKgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+SWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBiZWFuLCByZXR1cm4gYSBjbG9uZWQgQmVhbk1hcCB3aXRob3V0IGEKLSAgICAgKiBiZWFuLgotICAgICAqCi0gICAgICogPGxpPlNpbmNlIHRoZXJlIGlzIGFuIHVuZGVybHlpbmcgYmVhbiwgdHJ5IHRvIGluc3RhbnRpYXRlIGEgbmV3IGJlYW4gb2YKLSAgICAgKiB0aGUgc2FtZSB0eXBlIHVzaW5nIENsYXNzLm5ld0luc3RhbmNlKCkuCi0gICAgICogCi0gICAgICogPGxpPklmIHRoZSBpbnN0YW50aWF0aW9uIGZhaWxzLCB0aHJvdyBhIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiA8bGk+Q2xvbmUgdGhlIGJlYW4gbWFwIGFuZCBzZXQgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBiZWFuIGFzIHRoZQotICAgICAqIHVuZGVybHlpbmcgYmVhbiBmb3IgdGhlIGJlYW4gbWFwLgotICAgICAqCi0gICAgICogPGxpPkNvcHkgZWFjaCBwcm9wZXJ0eSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlIGZyb20gdGhlCi0gICAgICogZXhpc3Rpbmcgb2JqZWN0IHRvIGEgY2xvbmVkIGJlYW4gbWFwLiAgCi0gICAgICoKLSAgICAgKiA8bGk+SWYgYW55dGhpbmcgZmFpbHMgYWxvbmcgdGhlIHdheSwgdGhyb3cgYQotICAgICAqIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogPHVsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICBCZWFuTWFwIG5ld01hcCA9IChCZWFuTWFwKXN1cGVyLmNsb25lKCk7Ci0KLSAgICAgICAgaWYoYmVhbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBubyBiZWFuLCBqdXN0IGFuIGVtcHR5IGJlYW4gbWFwIGF0IHRoZSBtb21lbnQuICByZXR1cm4gYSBuZXdseQotICAgICAgICAgICAgLy8gY2xvbmVkIGFuZCBlbXB0eSBiZWFuIG1hcC4KLSAgICAgICAgICAgIHJldHVybiBuZXdNYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbmV3QmVhbiA9IG51bGw7ICAgICAgICAgICAgCi0gICAgICAgIENsYXNzIGJlYW5DbGFzcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBuZXdCZWFuID0gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB1bmFibGUgdG8gaW5zdGFudGlhdGUKLSAgICAgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIHRoZSB1bmRlcmx5aW5nIGJlYW4gXCIiICsKLSAgICAgICAgICAgICAgICAgYmVhbkNsYXNzLmdldE5hbWUoKSArICJcIjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld01hcC5zZXRCZWFuKG5ld0JlYW4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAoIlVuYWJsZSB0byBzZXQgYmVhbiBpbiB0aGUgY2xvbmVkIGJlYW4gbWFwOiAiICsgCi0gICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY29weSBvbmx5IHByb3BlcnRpZXMgdGhhdCBhcmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLiAgSWYgaXRzCi0gICAgICAgICAgICAvLyBub3QgcmVhZGFibGUsIHdlIGNhbid0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2xkIG1hcC4gIElmCi0gICAgICAgICAgICAvLyBpdHMgbm90IHdyaXRhYmxlLCB3ZSBjYW4ndCB3cml0ZSBhIHZhbHVlIGludG8gdGhlIG5ldyBtYXAuCi0gICAgICAgICAgICBJdGVyYXRvciByZWFkYWJsZUtleXMgPSByZWFkTWV0aG9kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUocmVhZGFibGVLZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSByZWFkYWJsZUtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKGdldFdyaXRlTWV0aG9kKGtleSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuZXdNYXAucHV0KGtleSwgZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCJVbmFibGUgdG8gY29weSBiZWFuIHZhbHVlcyB0byBjbG9uZWQgYmVhbiBtYXA6ICIgKwotICAgICAgICAgICAgICAgICBleGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld01hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIGFsbCBvZiB0aGUgd3JpdGFibGUgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBCZWFuTWFwIGludG8gdGhpcwotICAgICAqIEJlYW5NYXAuIFJlYWQtb25seSBhbmQgV3JpdGUtb25seSBwcm9wZXJ0aWVzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBCZWFuTWFwIHdob3NlIHByb3BlcnRpZXMgdG8gcHV0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsV3JpdGVhYmxlKEJlYW5NYXAgbWFwKSB7Ci0gICAgICAgIEl0ZXJhdG9yIHJlYWRhYmxlS2V5cyA9IG1hcC5yZWFkTWV0aG9kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocmVhZGFibGVLZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IHJlYWRhYmxlS2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZ2V0V3JpdGVNZXRob2Qoa2V5KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wdXQoa2V5LCBtYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZWluaXRpYWxpemVzIHRoZSBiZWFuIG1hcCB0byBoYXZlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUKLSAgICAgKiBiZWFuJ3MgcHJvcGVydGllcy4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZQotICAgICAqIG9mIHRoZSBiZWFuIHdoaWNoIHRoZSBtYXAgdXNlcyBhcyBpdHMgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4gIFRoaXMKLSAgICAgKiBiZWhhdmlvciBmb3IgPGNvZGU+Y2xlYXIoKTwvY29kZT4gZGlmZmVycyBmcm9tIHRoZSBNYXAgY29udHJhY3QgaW4gdGhhdAotICAgICAqIHRoZSBtYXBwaW5ncyBhcmUgbm90IGFjdHVhbGx5IHJlbW92ZWQgZnJvbSB0aGUgbWFwICh0aGUgbWFwcGluZ3MgZm9yIGEKLSAgICAgKiBCZWFuTWFwIGFyZSBmaXhlZCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmKGJlYW4gPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIENsYXNzIGJlYW5DbGFzcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBiZWFuID0gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJDb3VsZCBub3QgY3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBjbGFzczogIiArIGJlYW5DbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiZWFuIGRlZmluZXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSBnaXZlbiBuYW1lIG11c3QgYmUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+OyBpZiBub3QsIHRoaXMgbWV0aG9kCi0gICAgICogcmV0dXJucyBmYWxzZS4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgYmVhbgotICAgICAqIGRvZXMgbm90IGRlZmluZSBhIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFdyaXRlLW9ubHkgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBtYXRjaGVkIGFzIHRoZSB0ZXN0IG9wZXJhdGVzIGFnYWluc3QKLSAgICAgKiBwcm9wZXJ0eSByZWFkIG1ldGhvZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBudWxsIG9yIGlzIG5vdCBhIDxjb2RlPlN0cmluZzwvY29kZT47Ci0gICAgICogICBmYWxzZSBpZiB0aGUgYmVhbiBkb2VzIG5vdCBkZWZpbmUgYSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZTsgb3IKLSAgICAgKiAgIHRydWUgaWYgdGhlIGJlYW4gZG9lcyBkZWZpbmUgYSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBuYW1lKSB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRSZWFkTWV0aG9kKG5hbWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiZWFuIGRlZmluZXMgYSBwcm9wZXJ0eSB3aG9zZSBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBmYWxzZSAgdHJ1ZSBpZiB0aGUgYmVhbiBoYXMgYXQgbGVhc3Qgb25lIHByb3BlcnR5IHdob3NlIAotICAgICAqICAgY3VycmVudCB2YWx1ZSBpcyB0aGF0IG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBiZWFuJ3MgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IGJlIGEge0BsaW5rIFN0cmluZ30gYW5kIG11c3Qgbm90IGJlIAotICAgICAqIG51bGw7IG90aGVyd2lzZSwgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBJZiB0aGUgYmVhbiBkZWZpbmVzIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhlIHZhbHVlIG9mCi0gICAgICogdGhhdCBwcm9wZXJ0eSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgCi0gICAgICogcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogV3JpdGUtb25seSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG1hdGNoZWQgYXMgdGhlIHRlc3Qgb3BlcmF0ZXMgYWdhaW5zdAotICAgICAqIHByb3BlcnR5IHJlYWQgbWV0aG9kcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgdG8gcmV0dXJuCi0gICAgICogQHJldHVybiAgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBuYW1lKSB7Ci0gICAgICAgIGlmICggYmVhbiAhPSBudWxsICkgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFJlYWRNZXRob2QoIG5hbWUgKTsKLSAgICAgICAgICAgIGlmICggbWV0aG9kICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoIGJlYW4sIE5VTExfQVJHVU1FTlRTICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nV2FybiggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgICAgICAgICBsb2dXYXJuKCAgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nV2FybiggIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgICAgICAgICBsb2dXYXJuKCAgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiZWFuIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzZXQgdGhhdCBwcm9wZXJ0eSB0bwotICAgICAqIEByZXR1cm4gIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGF0IHByb3BlcnR5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBnaXZlbiBuYW1lIGlzIG51bGw7Ci0gICAgICogICBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgYSB7QGxpbmsgU3RyaW5nfTsgaWYgdGhlIGJlYW4gZG9lc24ndAotICAgICAqICAgZGVmaW5lIGEgcHJvcGVydHkgd2l0aCB0aGF0IG5hbWU7IG9yIGlmIHRoZSBiZWFuIHByb3BlcnR5IHdpdGgKLSAgICAgKiAgIHRoYXQgbmFtZSBpcyByZWFkLW9ubHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb24gewotICAgICAgICBpZiAoIGJlYW4gIT0gbnVsbCApIHsKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGdldCggbmFtZSApOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKCBuYW1lICk7Ci0gICAgICAgICAgICBpZiAoIG1ldGhvZCA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJUaGUgYmVhbiBvZiB0eXBlOiAiKyBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBoYXMgbm8gcHJvcGVydHkgY2FsbGVkOiAiICsgbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMgPSBjcmVhdGVXcml0ZU1ldGhvZEFyZ3VtZW50cyggbWV0aG9kLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoIGJlYW4sIGFyZ3VtZW50cyApOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gZ2V0KCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgICAgIGxvZ0luZm8oIGUgKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICAgICAgbG9nSW5mbyggZSApOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBkZWZpbmVkIGJ5IHRoZSBiZWFuLgotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhlIGJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkTWV0aG9kcy5zaXplKCk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBrZXlzIGZvciB0aGlzIEJlYW5NYXAuCi0gICAgICogPHA+Ci0gICAgICogV3JpdGUtb25seSBwcm9wZXJ0aWVzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkIGluIHRoZSByZXR1cm5lZCBzZXQgb2YKLSAgICAgKiBwcm9wZXJ0eSBuYW1lcywgYWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZWlyIHZhbHVlIGFuZCB0byBnZXQgCi0gICAgICogdGhlaXIgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEJlYW5NYXAga2V5cy4gIFRoZSBTZXQgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbm90Ci0gICAgICogICAgICAgIG1vZGlmaWFibGUuCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUocmVhZE1ldGhvZHMua2V5U2V0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBTZXQgb2YgTWFwRW50cnkgb2JqZWN0cyB0aGF0IGFyZSB0aGUgbWFwcGluZ3MgZm9yIHRoaXMgQmVhbk1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIE1hcEVudHJ5IGNhbiBiZSBzZXQgYnV0IG5vdCByZW1vdmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVubW9kaWZpYWJsZSBzZXQgb2YgbWFwcGluZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU2V0LmRlY29yYXRlKG5ldyBBYnN0cmFjdFNldCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlJdGVyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICByZXR1cm4gQmVhbk1hcC50aGlzLnJlYWRNZXRob2RzLnNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWVzIGZvciB0aGUgQmVhbk1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHZhbHVlcyBmb3IgdGhlIEJlYW5NYXAuICBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBub3QKLSAgICAgKiAgICAgICAgbW9kaWZpYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCByZWFkTWV0aG9kcy5zaXplKCkgKTsKLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IHZhbHVlSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgYW5zd2VyLmFkZCggaXRlci5uZXh0KCkgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdC5kZWNvcmF0ZShhbnN3ZXIpOwotICAgIH0KLQotCi0gICAgLy8gSGVscGVyIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiAgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0gICAgICogIHByb3BlcnR5IGV4aXN0cwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3MpIHR5cGVzLmdldCggbmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLgotICAgICAqIDxwPgotICAgICAqIFdyaXRlLW9ubHkgcHJvcGVydGllcyB3aWxsIG5vdCBiZSByZXR1cm5lZCBpbiB0aGUgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3Iga2V5SXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiByZWFkTWV0aG9kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciB2YWx1ZUl0ZXJhdG9yKCkgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0ga2V5SXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAicmVtb3ZlKCkgbm90IHN1cHBvcnRlZCBmb3IgQmVhbk1hcCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZW50cmllcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZW50cmllcwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBlbnRyeUl0ZXJhdG9yKCkgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0ga2V5SXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoa2V5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE15TWFwRW50cnkoIEJlYW5NYXAudGhpcywga2V5LCB2YWx1ZSApOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggInJlbW92ZSgpIG5vdCBzdXBwb3J0ZWQgZm9yIEJlYW5NYXAiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiZWFuIGN1cnJlbnRseSBiZWluZyBvcGVyYXRlZCBvbi4gIFRoZSByZXR1cm4gdmFsdWUgbWF5Ci0gICAgICogYmUgbnVsbCBpZiB0aGlzIG1hcCBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGJlYW4gYmVpbmcgb3BlcmF0ZWQgb24gYnkgdGhpcyBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJlYW4gdG8gYmUgb3BlcmF0ZWQgb24gYnkgdGhpcyBtYXAuICBUaGUgZ2l2ZW4gdmFsdWUgbWF5Ci0gICAgICogYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGlzIG1hcCB3aWxsIGJlIGVtcHR5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld0JlYW4gIHRoZSBuZXcgYmVhbiB0byBvcGVyYXRlIG9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbiggT2JqZWN0IG5ld0JlYW4gKSB7Ci0gICAgICAgIGJlYW4gPSBuZXdCZWFuOwotICAgICAgICByZWluaXRpYWxpc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2Nlc3NvciBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IAotICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIHByb3BlcnR5LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZCBnZXRSZWFkTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoTWV0aG9kKSByZWFkTWV0aG9kcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbXV0YXRvciBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgbXV0YXRvciBtZXRob2QgZm9yIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0V3JpdGVNZXRob2QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChNZXRob2QpIHdyaXRlTWV0aG9kcy5nZXQobmFtZSk7Ci0gICAgfQotCi0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY2Nlc3NvciBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IAotICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgbmFtZSBpcyBudWxsOyBudWxsIGlmIHRoZSBuYW1lIGlzIG5vdCBhIAotICAgICAqIHtAbGluayBTdHJpbmd9OyBudWxsIGlmIG5vIHN1Y2ggcHJvcGVydHkgZXhpc3RzOyBvciB0aGUgYWNjZXNzb3IKLSAgICAgKiAgbWV0aG9kIGZvciB0aGF0IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRSZWFkTWV0aG9kKCBPYmplY3QgbmFtZSApIHsKLSAgICAgICAgcmV0dXJuIChNZXRob2QpIHJlYWRNZXRob2RzLmdldCggbmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG11dGF0b3IgZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSAKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIG5hbWUgaXMgbnVsbDsgbnVsbCBpZiB0aGUgbmFtZSBpcyBub3QgYSAKLSAgICAgKiB7QGxpbmsgU3RyaW5nfTsgbnVsbCBpZiBubyBzdWNoIHByb3BlcnR5IGV4aXN0czsgbnVsbCBpZiB0aGUgCi0gICAgICogcHJvcGVydHkgaXMgcmVhZC1vbmx5OyBvciB0aGUgbXV0YXRvciBtZXRob2QgZm9yIHRoYXQgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldFdyaXRlTWV0aG9kKCBPYmplY3QgbmFtZSApIHsKLSAgICAgICAgcmV0dXJuIChNZXRob2QpIHdyaXRlTWV0aG9kcy5nZXQoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWluaXRpYWxpemVzIHRoaXMgYmVhbi4gIENhbGxlZCBkdXJpbmcge0BsaW5rICNzZXRCZWFuKE9iamVjdCl9LgotICAgICAqIERvZXMgaW50cm9zcGVjdGlvbiB0byBmaW5kIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVpbml0aWFsaXNlKCkgewotICAgICAgICByZWFkTWV0aG9kcy5jbGVhcigpOwotICAgICAgICB3cml0ZU1ldGhvZHMuY2xlYXIoKTsKLSAgICAgICAgdHlwZXMuY2xlYXIoKTsKLSAgICAgICAgaW5pdGlhbGlzZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXNlKCkgewotICAgICAgICBpZihnZXRCZWFuKCkgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIENsYXNzICBiZWFuQ2xhc3MgPSBnZXRCZWFuKCkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oIGJlYW4sIG51bGwgKTsKLSAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKCBiZWFuQ2xhc3MgKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBpZiAoIHByb3BlcnR5RGVzY3JpcHRvcnMgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9wZXJ0eURlc2NyaXB0b3IgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCB3cml0ZU1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYVR5cGUgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVhZE1ldGhvZCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2RzLnB1dCggbmFtZSwgcmVhZE1ldGhvZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3cml0ZU1ldGhvZCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWV0aG9kcy5wdXQoIG5hbWUsIHdyaXRlTWV0aG9kICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5wdXQoIG5hbWUsIGFUeXBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBsb2dXYXJuKCAgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGR1cmluZyBhIHN1Y2Nlc3NmdWwge0BsaW5rICNwdXQoT2JqZWN0LE9iamVjdCl9IG9wZXJhdGlvbi4KLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gIE92ZXJyaWRlIHRvIGJlIG5vdGlmaWVkIG9mCi0gICAgICogcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUgYmVhbiBjYXVzZWQgYnkgdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0gICAgICogQHBhcmFtIG9sZFZhbHVlICB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5Ci0gICAgICogQHBhcmFtIG5ld1ZhbHVlICB0aGUgbmV3IHZhbHVlIGZvciB0aGF0IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKCBPYmplY3Qga2V5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSApIHsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBjbGFzc2VzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBNYXAgZW50cnkgdXNlZCBieSB7QGxpbmsgQmVhbk1hcH0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNeU1hcEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RNYXBFbnRyeSB7ICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBCZWFuTWFwIG93bmVyOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+TXlNYXBFbnRyeTwvY29kZT4uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBvd25lciAgdGhlIEJlYW5NYXAgdGhpcyBlbnRyeSBiZWxvbmdzIHRvCi0gICAgICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgZm9yIHRoaXMgZW50cnkKLSAgICAgICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgZm9yIHRoaXMgZW50cnkKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBNeU1hcEVudHJ5KCBCZWFuTWFwIG93bmVyLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUgKSB7Ci0gICAgICAgICAgICBzdXBlcigga2V5LCB2YWx1ZSApOwotICAgICAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBlbnRyeQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUgZm9yIHRoZSBlbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBnZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IG93bmVyLmdldCgga2V5ICk7Ci0KLSAgICAgICAgICAgIG93bmVyLnB1dCgga2V5LCB2YWx1ZSApOwotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gb3duZXIuZ2V0KCBrZXkgKTsKLSAgICAgICAgICAgIHN1cGVyLnNldFZhbHVlKCBuZXdWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGdpdmVuIG11dGF0b3IgbWV0aG9kLgotICAgICAqIElmIHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IHRoZSByaWdodCB0eXBlIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCAKLSAgICAgKiBkaXJlY3RseSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rICNjb252ZXJ0VHlwZShDbGFzcyxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QgIHRoZSBtdXRhdG9yIG1ldGhvZAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHBhc3MgdG8gdGhlIG11dGF0b3IgbWV0aG9kCi0gICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIG9uZSBvYmplY3QgdGhhdCBpcyBlaXRoZXIgdGhlIGdpdmVuIHZhbHVlCi0gICAgICogICBvciBhIHRyYW5zZm9ybWVkIHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIHtAbGluayAjY29udmVydFR5cGUoQ2xhc3MsT2JqZWN0KX0KLSAgICAgKiAgIHJhaXNlcyBpdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvdGhlciBleGNlcHRpb24gaXMgcmFpc2VkCi0gICAgICogICBieSB7QGxpbmsgI2NvbnZlcnRUeXBlKENsYXNzLE9iamVjdCl9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIGNyZWF0ZVdyaXRlTWV0aG9kQXJndW1lbnRzKCBNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUgKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NDYXN0RXhjZXB0aW9uIHsgICAgICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCB0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZSA9IHR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoICEgcGFyYW1UeXBlLmlzQXNzaWduYWJsZUZyb20oIHZhbHVlLmdldENsYXNzKCkgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydFR5cGUoIHBhcmFtVHlwZSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdFtdIGFuc3dlciA9IHsgdmFsdWUgfTsKLSAgICAgICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBsb2dJbmZvKCBlICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgbG9nSW5mbyggZSApOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gdHlwZS4gIEZpcnN0LCByZWZsZWN0aW9uIGlzCi0gICAgICogaXMgdXNlZCB0byBmaW5kIGEgcHVibGljIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGJ5IHRoZSBnaXZlbiBjbGFzcyAKLSAgICAgKiB0aGF0IHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSB0aGUgcHJlY2lzZSB0eXBlIG9mIHRoZSAKLSAgICAgKiBnaXZlbiB2YWx1ZS4gIElmIHN1Y2ggYSBjb25zdHJ1Y3RvciBpcyBmb3VuZCwgYSBuZXcgb2JqZWN0IGlzCi0gICAgICogY3JlYXRlZCBieSBwYXNzaW5nIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGF0IGNvbnN0cnVjdG9yLCBhbmQgdGhlCi0gICAgICogbmV3bHkgY29uc3RydWN0ZWQgb2JqZWN0IGlzIHJldHVybmVkLjxQPgotICAgICAqCi0gICAgICogSWYgbm8gc3VjaCBjb25zdHJ1Y3RvciBleGlzdHMsIGFuZCB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHByaW1pdGl2ZQotICAgICAqIHR5cGUsIHRoZW4gdGhlIGdpdmVuIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyBpdHMgCi0gICAgICoge0BsaW5rIE9iamVjdCN0b1N0cmluZygpIHRvU3RyaW5nKCl9IG1ldGhvZCwgYW5kIHRoYXQgc3RyaW5nIGlzCi0gICAgICogcGFyc2VkIGludG8gdGhlIGNvcnJlY3QgcHJpbWl0aXZlIHR5cGUgdXNpbmcsIGZvciBpbnN0YW5jZSwgCi0gICAgICoge0BsaW5rIEludGVnZXIjdmFsdWVPZihTdHJpbmcpfSB0byBjb252ZXJ0IHRoZSBzdHJpbmcgaW50byBhbgotICAgICAqIDxjb2RlPmludDwvY29kZT4uPFA+Ci0gICAgICoKLSAgICAgKiBJZiBubyBzcGVjaWFsIGNvbnN0cnVjdG9yIGV4aXN0cyBhbmQgdGhlIGdpdmVuIHR5cGUgaXMgbm90IGEgCi0gICAgICogcHJpbWl0aXZlIHR5cGUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9yaWdpbmFsIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1R5cGUgIHRoZSB0eXBlIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZQotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIG5ld1R5cGUgaXMgYSBwcmltaXRpdmUgdHlwZSwgYW5kIAotICAgICAqICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB2YWx1ZSBjYW5ub3QgYmUgY29udmVydGVkCi0gICAgICogIHRvIHRoYXQgdHlwZQotICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiAgaWYgdGhlIGNvbnN0cnVjdG9yIGZvdW5kIHdpdGggCi0gICAgICogIHJlZmxlY3Rpb24gcmFpc2VzIGl0Ci0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uICBpZiB0aGUgY29uc3RydWN0b3IgZm91bmQgd2l0aAotICAgICAqICByZWZsZWN0aW9uIHJhaXNlcyBpdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiAgbmV2ZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgbmV2ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUeXBlKCBDbGFzcyBuZXdUeXBlLCBPYmplY3QgdmFsdWUgKSAKLSAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyB0cnkgY2FsbCBjb25zdHJ1Y3RvcgotICAgICAgICBDbGFzc1tdIHR5cGVzID0geyB2YWx1ZS5nZXRDbGFzcygpIH07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG5ld1R5cGUuZ2V0Q29uc3RydWN0b3IoIHR5cGVzICk7ICAgICAgICAKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IHsgdmFsdWUgfTsKLSAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSggYXJndW1lbnRzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIC8vIHRyeSB1c2luZyB0aGUgdHJhbnNmb3JtZXJzCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGdldFR5cGVUcmFuc2Zvcm1lciggbmV3VHlwZSApOwotICAgICAgICAgICAgaWYgKCB0cmFuc2Zvcm1lciAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHJhbnNmb3JtZXIgZm9yIHRoZSBnaXZlbiBwcmltaXRpdmUgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhVHlwZSAgdGhlIHByaW1pdGl2ZSB0eXBlIHdob3NlIHRyYW5zZm9ybWVyIHRvIHJldHVybgotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lciB0aGF0IHdpbGwgY29udmVydCBzdHJpbmdzIGludG8gdGhhdCB0eXBlLAotICAgICAqICBvciBudWxsIGlmIHRoZSBnaXZlbiB0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZSB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zZm9ybWVyIGdldFR5cGVUcmFuc2Zvcm1lciggQ2xhc3MgYVR5cGUgKSB7Ci0gICAgICAgIHJldHVybiAoVHJhbnNmb3JtZXIpIGRlZmF1bHRUcmFuc2Zvcm1lcnMuZ2V0KCBhVHlwZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgdGhlIGdpdmVuIGV4Y2VwdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4gIFVzZWQgdG8gZGlzcGxheQotICAgICAqIHdhcm5pbmdzIHdoaWxlIGFjY2Vzc2luZy9tdXRhdGluZyB0aGUgYmVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleCAgdGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dJbmZvKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZG8gbm90IHVzZSBMT0c0SiBvciBDb21tb25zIExvZ2dpbmcgdG8gYXZvaWQgZGVwZW5kZW5jaWVzCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIklORk86IEV4Y2VwdGlvbjogIiArIGV4ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIHRvIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LiAgVXNlZCB0byBkaXNwbGF5Ci0gICAgICogZXJyb3JzIHdoaWxlIGFjY2Vzc2luZy9tdXRhdGluZyB0aGUgYmVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleCAgdGhlIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dXYXJuKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZG8gbm90IHVzZSBMT0c0SiBvciBDb21tb25zIExvZ2dpbmcgdG8gYXZvaWQgZGVwZW5kZW5jaWVzCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIldBUk46IEV4Y2VwdGlvbjogIiArIGV4ICk7Ci0gICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CaWRpTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmlkaU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODRmZWUyZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmlkaU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIG1hcCB0aGF0IGFsbG93cyBiaWRpcmVjdGlvbmFsIGxvb2t1cCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzLgotICogPHA+Ci0gKiBUaGlzIGV4dGVuZGVkIDxjb2RlPk1hcDwvY29kZT4gcmVwcmVzZW50cyBhIG1hcHBpbmcgd2hlcmUgYSBrZXkgbWF5Ci0gKiBsb29rdXAgYSB2YWx1ZSBhbmQgYSB2YWx1ZSBtYXkgbG9va3VwIGEga2V5IHdpdGggZXF1YWwgZWFzZS4KLSAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgPGNvZGU+TWFwPC9jb2RlPiBhbmQgc28gbWF5IGJlIHVzZWQgYW55d2hlcmUgYSBtYXAKLSAqIGlzIHJlcXVpcmVkLiBUaGUgaW50ZXJmYWNlIHByb3ZpZGVzIGFuIGludmVyc2UgbWFwIHZpZXcsIGVuYWJsaW5nCi0gKiBmdWxsIGFjY2VzcyB0byBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIDxjb2RlPkJpZGlNYXA8L2NvZGU+LgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsbG93IGEgdmFsdWUgdG8gYmUgbG9va2VkIHVwIGZyb20gYSBrZXkgYW5kCi0gKiBhIGtleSB0byBiZSBsb29rZWQgdXAgZnJvbSBhIHZhbHVlIHdpdGggZXF1YWwgcGVyZm9ybWFuY2UuCi0gKiA8cD4KLSAqIFRoaXMgbWFwIGVuZm9yY2VzIHRoZSByZXN0cmljdGlvbiB0aGF0IHRoZXJlIGlzIGEgMToxIHJlbGF0aW9uIGJldHdlZW4KLSAqIGtleXMgYW5kIHZhbHVlcywgbWVhbmluZyB0aGF0IG11bHRpcGxlIGtleXMgY2Fubm90IG1hcCB0byB0aGUgc2FtZSB2YWx1ZS4gCi0gKiBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgImludmVydGluZyIgdGhlIG1hcCByZXN1bHRzIGluIGEgbWFwIHdpdGhvdXQgCi0gKiBkdXBsaWNhdGUga2V5cy4gU2VlIHRoZSB7QGxpbmsgI3B1dH0gbWV0aG9kIGRlc2NyaXB0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaU1hcCBleHRlbmRzIEl0ZXJhYmxlTWFwIHsKLQotICAgIC8qKgotICAgICAqIE9idGFpbnMgYSA8Y29kZT5NYXBJdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIEEgbWFwIGl0ZXJhdG9yIGlzIGFuIGVmZmljaWVudCB3YXkgb2YgaXRlcmF0aW5nIG92ZXIgbWFwcy4KLSAgICAgKiBJdCBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlIG1hcCBpcyBzdG9yZWQgdXNpbmcgTWFwIEVudHJ5IG9iamVjdHMKLSAgICAgKiB3aGljaCBjYW4gaW5jcmVhc2UgcGVyZm9ybWFuY2UuCi0gICAgICogPHByZT4KLSAgICAgKiBCaWRpTWFwIG1hcCA9IG5ldyBEdWFsSGFzaEJpZGlNYXAoKTsKLSAgICAgKiBNYXBJdGVyYXRvciBpdCA9IG1hcC5tYXBJdGVyYXRvcigpOwotICAgICAqIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgKiAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICogICBPYmplY3QgdmFsdWUgPSBpdC5nZXRWYWx1ZSgpOwotICAgICAqICAgaXQuc2V0VmFsdWUoIm5ld1ZhbHVlIik7Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBtYXAgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpOwotICAgIAotICAgIC8qKgotICAgICAqIFB1dHMgdGhlIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIG1hcCwgcmVwbGFjaW5nIGFueSBwcmV2aW91cyBwYWlyLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYWRkaW5nIGEga2V5LXZhbHVlIHBhaXIsIHRoZSB2YWx1ZSBtYXkgYWxyZWFkeSBleGlzdCBpbiB0aGUgbWFwCi0gICAgICogYWdhaW5zdCBhIGRpZmZlcmVudCBrZXkuIFRoYXQgbWFwcGluZyBpcyByZW1vdmVkLCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICAgKiB2YWx1ZSBvbmx5IG9jY3VycyBvbmNlIGluIHRoZSBpbnZlcnNlIG1hcC4KLSAgICAgKiA8cHJlPgotICAgICAqICBCaWRpTWFwIG1hcDEgPSBuZXcgRHVhbEhhc2hCaWRpTWFwKCk7Ci0gICAgICogIG1hcC5wdXQoIkEiLCJCIik7ICAvLyBjb250YWlucyBBIG1hcHBlZCB0byBCLCBhcyBwZXIgTWFwCi0gICAgICogIG1hcC5wdXQoIkEiLCJDIik7ICAvLyBjb250YWlucyBBIG1hcHBlZCB0byBDLCBhcyBwZXIgTWFwCi0gICAgICogCi0gICAgICogIEJpZGlNYXAgbWFwMiA9IG5ldyBEdWFsSGFzaEJpZGlNYXAoKTsKLSAgICAgKiAgbWFwLnB1dCgiQSIsIkIiKTsgIC8vIGNvbnRhaW5zIEEgbWFwcGVkIHRvIEIsIGFzIHBlciBNYXAKLSAgICAgKiAgbWFwLnB1dCgiQyIsIkIiKTsgIC8vIGNvbnRhaW5zIEMgbWFwcGVkIHRvIEIsIGtleSBBIGlzIHJlbW92ZWQKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc3RvcmUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG1hcHBlZCB0byB0aGlzIGtleQotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDxjb2RlPnB1dDwvY29kZT4gbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAob3B0aW9uYWwpIGlmIHRoZSBtYXAgbGltaXRzIHRoZSB0eXBlIG9mIHRoZSAKLSAgICAgKiAgdmFsdWUgYW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgaW5hcHByb3ByaWF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIChvcHRpb25hbCkgaWYgdGhlIG1hcCBsaW1pdHMgdGhlIHZhbHVlcwotICAgICAqICBpbiBzb21lIHdheSBhbmQgdGhlIHZhbHVlIHdhcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAob3B0aW9uYWwpIGlmIHRoZSBtYXAgbGltaXRzIHRoZSB2YWx1ZXMgdG8KLSAgICAgKiAgbm9uLW51bGwgYW5kIG51bGwgd2FzIHNwZWNpZmllZAotICAgICAqLwotICAgIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkgdGhhdCBpcyBjdXJyZW50bHkgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHZhbHVlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIG1hcCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZWVrIHRvIG1ha2UgdGhpcyBtZXRob2QgcGVyZm9ybSBlcXVhbGx5IGFzIHdlbGwKLSAgICAgKiBhcyA8Y29kZT5nZXQoT2JqZWN0KTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBmaW5kIHRoZSBrZXkgZm9yCi0gICAgICogQHJldHVybiB0aGUgbWFwcGVkIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0gICAgICogCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gKG9wdGlvbmFsKSBpZiB0aGUgbWFwIGxpbWl0cyB0aGUgdHlwZSBvZiB0aGUgCi0gICAgICogIHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIChvcHRpb25hbCkgaWYgdGhlIG1hcCBsaW1pdHMgdGhlIHZhbHVlcyB0bwotICAgICAqICBub24tbnVsbCBhbmQgbnVsbCB3YXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgT2JqZWN0IGdldEtleShPYmplY3QgdmFsdWUpOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgaXMgY3VycmVudGx5IG1hcHBlZCB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogdmFsdWUgKG9wdGlvbmFsIG9wZXJhdGlvbikuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHZhbHVlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIG1hcCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZWVrIHRvIG1ha2UgdGhpcyBtZXRob2QgcGVyZm9ybSBlcXVhbGx5IGFzIHdlbGwKLSAgICAgKiBhcyA8Y29kZT5yZW1vdmUoT2JqZWN0KTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBmaW5kIHRoZSBrZXktdmFsdWUgcGFpciBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgdGhhdCB3YXMgcmVtb3ZlZCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aGluZyByZW1vdmVkCi0gICAgICogCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gKG9wdGlvbmFsKSBpZiB0aGUgbWFwIGxpbWl0cyB0aGUgdHlwZSBvZiB0aGUgCi0gICAgICogIHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGluYXBwcm9wcmlhdGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIChvcHRpb25hbCkgaWYgdGhlIG1hcCBsaW1pdHMgdGhlIHZhbHVlcyB0bwotICAgICAqICBub24tbnVsbCBhbmQgbnVsbCB3YXMgc3BlY2lmaWVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICogIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIE9iamVjdCByZW1vdmVWYWx1ZShPYmplY3QgdmFsdWUpOwotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IG9mIHRoaXMgbWFwIHdoZXJlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIHJldmVyc2VkLgotICAgICAqIDxwPgotICAgICAqIENoYW5nZXMgdG8gb25lIG1hcCB3aWxsIGJlIHZpc2libGUgaW4gdGhlIG90aGVyIGFuZCB2aWNlIHZlcnNhLgotICAgICAqIFRoaXMgZW5hYmxlcyBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIG1hcCB0byBiZSBhY2Nlc3NlZCBhcyBhIDxjb2RlPk1hcDwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZWVrIHRvIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBldmVyeSB0aW1lIHRoaXMKLSAgICAgKiBtZXRob2QgaXMgY2FsbGVkLiBTZWUgPGNvZGU+QWJzdHJhY3RNYXAudmFsdWVzKCk8L2NvZGU+IGV0Yy4gQ2FsbGluZyB0aGlzCi0gICAgICogbWV0aG9kIG9uIHRoZSBpbnZlcnNlIG1hcCBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaW52ZXJ0ZWQgYmlkaXJlY3Rpb25hbCBtYXAKLSAgICAgKi8KLSAgICBCaWRpTWFwIGludmVyc2VCaWRpTWFwKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmluYXJ5SGVhcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JpbmFyeUhlYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY0NDE4Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQmluYXJ5SGVhcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCaW5hcnkgaGVhcCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Qcmlvcml0eVF1ZXVlPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIDxjb2RlPlByaW9yaXR5UXVldWU8L2NvZGU+IGludGVyZmFjZSBoYXMgbm93IGJlZW4gcmVwbGFjZWQgZm9yIG1vc3QgdXNlcwotICogYnkgdGhlIDxjb2RlPkJ1ZmZlcjwvY29kZT4gaW50ZXJmYWNlLiBUaGlzIGNsYXNzIGFuZCB0aGUgaW50ZXJmYWNlIGFyZQotICogcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGUgaW50ZW5kZWQgcmVwbGFjZW1lbnQgaXMKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyLlByaW9yaXR5QnVmZmVyIFByaW9yaXR5QnVmZmVyfS4KLSAqIDxwPgotICogVGhlIHJlbW92YWwgb3JkZXIgb2YgYSBiaW5hcnkgaGVhcCBpcyBiYXNlZCBvbiBlaXRoZXIgdGhlIG5hdHVyYWwgc29ydAotICogb3JkZXIgb2YgaXRzIGVsZW1lbnRzIG9yIGEgc3BlY2lmaWVkIHtAbGluayBDb21wYXJhdG9yfS4gIFRoZSAKLSAqIHtAbGluayAjcG9wKCl9IG1ldGhvZCBhbHdheXMgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBhcyBkZXRlcm1pbmVkCi0gKiBieSB0aGUgc29ydCBvcmRlci4gIChUaGUgPGNvZGU+aXNNaW5IZWFwPC9jb2RlPiBmbGFnIGluIHRoZSBjb25zdHJ1Y3RvcnMKLSAqIGNhbiBiZSB1c2VkIHRvIHJldmVyc2UgdGhlIHNvcnQgb3JkZXIsIGluIHdoaWNoIGNhc2Uge0BsaW5rICNwb3AoKX0KLSAqIHdpbGwgYWx3YXlzIHJlbW92ZSB0aGUgbGFzdCBlbGVtZW50LikgIFRoZSByZW1vdmFsIG9yZGVyIGlzIAotICogPGk+bm90PC9pPiB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgb2YgaXRlcmF0aW9uOyBlbGVtZW50cyBhcmUKLSAqIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotICogPHA+Ci0gKiBUaGUge0BsaW5rICNpbnNlcnQoT2JqZWN0KX0gYW5kIHtAbGluayAjcG9wKCl9IG9wZXJhdGlvbnMgcGVyZm9ybQotICogaW4gbG9nYXJpdGhtaWMgdGltZS4gIFRoZSB7QGxpbmsgI3BlZWsoKX0gb3BlcmF0aW9uIHBlcmZvcm1zIGluIGNvbnN0YW50Ci0gKiB0aW1lLiAgQWxsIG90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybSBpbiBsaW5lYXIgdGltZSBvciB3b3JzZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4gIFVzZSBTeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlCi0gKiB0byBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYSA8Y29kZT5CaW5hcnlIZWFwPC9jb2RlPjoKLSAqCi0gKiA8cHJlPgotICogUHJpb3JpdHlRdWV1ZSBoZWFwID0gbmV3IFN5bmNocm9uaXplZFByaW9yaXR5UXVldWUobmV3IEJpbmFyeUhlYXAoKSk7Ci0gKiA8L3ByZT4KLSAqCi0gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBQcmlvcml0eUJ1ZmZlciBpbiBidWZmZXIgc3VicGFja2FnZS4KLSAqICBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBQZXRlciBEb25hbGQKLSAqIEBhdXRob3IgUmFtIENoaWRhbWJhcmFtCi0gKiBAYXV0aG9yIE1pY2hhZWwgQS4gU21pdGgKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5SGVhcCBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgICAgICBpbXBsZW1lbnRzIFByaW9yaXR5UXVldWUsIEJ1ZmZlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBjYXBhY2l0eSBmb3IgYSBiaW5hcnkgaGVhcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDEzOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY3VycmVudGx5IGluIHRoaXMgaGVhcC4KLSAgICAgKi8KLSAgICBpbnQgbV9zaXplOyAgLy8gcGFja2FnZSBzY29wZWQgZm9yIHRlc3RpbmcKLSAgICAvKioKLSAgICAgKiBUaGUgZWxlbWVudHMgaW4gdGhpcyBoZWFwLgotICAgICAqLwotICAgIE9iamVjdFtdIG1fZWxlbWVudHM7ICAvLyBwYWNrYWdlIHNjb3BlZCBmb3IgdGVzdGluZwotICAgIC8qKgotICAgICAqIElmIHRydWUsIHRoZSBmaXJzdCBlbGVtZW50IGFzIGRldGVybWluZWQgYnkgdGhlIHNvcnQgb3JkZXIgd2lsbCAKLSAgICAgKiBiZSByZXR1cm5lZC4gIElmIGZhbHNlLCB0aGUgbGFzdCBlbGVtZW50IGFzIGRldGVybWluZWQgYnkgdGhlCi0gICAgICogc29ydCBvcmRlciB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIGJvb2xlYW4gbV9pc01pbkhlYXA7ICAvLyBwYWNrYWdlIHNjb3BlZCBmb3IgdGVzdGluZwotICAgIC8qKgotICAgICAqIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzCi0gICAgICovCi0gICAgQ29tcGFyYXRvciBtX2NvbXBhcmF0b3I7ICAvLyBwYWNrYWdlIHNjb3BlZCBmb3IgdGVzdGluZwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBtaW5pbXVtIGJpbmFyeSBoZWFwLgotICAgICAqLwotICAgIHB1YmxpYyBCaW5hcnlIZWFwKCkgewotICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+QmluYXJ5SGVhcDwvY29kZT4gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4KLSAgICAgKiBjb21wYXJhdG9yIHRvIG9yZGVyIGl0cyBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdXNlZCB0byBvcmRlciB0aGUgZWxlbWVudHMsIG51bGwKLSAgICAgKiAgbWVhbnMgdXNlIG5hdHVyYWwgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQmluYXJ5SGVhcChDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBtX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1pbmltdW0gYmluYXJ5IGhlYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgVGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBoZWFwLiAgVGhpcyB2YWx1ZSBtdXN0Ci0gICAgICogIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAKLSAgICAgKiAgaWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzICZsdDs9IDxjb2RlPjA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEJpbmFyeUhlYXAoaW50IGNhcGFjaXR5KSB7Ci0gICAgICAgIHRoaXMoY2FwYWNpdHksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+QmluYXJ5SGVhcDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IGZvciB0aGUgaGVhcAotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yICB0aGUgY29tcGFyYXRvciB1c2VkIHRvIG9yZGVyIHRoZSBlbGVtZW50cywgbnVsbAotICAgICAqICBtZWFucyB1c2UgbmF0dXJhbCBvcmRlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAKLSAgICAgKiAgaWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzICZsdDs9IDxjb2RlPjA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEJpbmFyeUhlYXAoaW50IGNhcGFjaXR5LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgdGhpcyhjYXBhY2l0eSk7Ci0gICAgICAgIG1fY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBtaW5pbXVtIG9yIG1heGltdW0gYmluYXJ5IGhlYXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpc01pbkhlYXAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBoZWFwIGlzIGNyZWF0ZWQgYXMgYSAKLSAgICAgKiBtaW5pbXVtIGhlYXA7IG90aGVyd2lzZSwgdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIG1heGltdW0gaGVhcAotICAgICAqLwotICAgIHB1YmxpYyBCaW5hcnlIZWFwKGJvb2xlYW4gaXNNaW5IZWFwKSB7Ci0gICAgICAgIHRoaXMoREVGQVVMVF9DQVBBQ0lUWSwgaXNNaW5IZWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJpbmFyeUhlYXA8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGlzTWluSGVhcCAgdHJ1ZSB0byB1c2UgdGhlIG9yZGVyIGltcG9zZWQgYnkgdGhlIGdpdmVuIAotICAgICAqICAgY29tcGFyYXRvcjsgZmFsc2UgdG8gcmV2ZXJzZSB0aGF0IG9yZGVyCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzLCBudWxsCi0gICAgICogIG1lYW5zIHVzZSBuYXR1cmFsIG9yZGVyCi0gICAgICovCi0gICAgcHVibGljIEJpbmFyeUhlYXAoYm9vbGVhbiBpc01pbkhlYXAsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICB0aGlzKGlzTWluSGVhcCk7Ci0gICAgICAgIG1fY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBtaW5pbXVtIG9yIG1heGltdW0gYmluYXJ5IGhlYXAgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGluaXRpYWwgY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBoZWFwLiAgVGhpcyB2YWx1ZSBtdXN0IAotICAgICAqIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgotICAgICAqIEBwYXJhbSBpc01pbkhlYXAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIAotICAgICAqICBtaW5pbXVtIGhlYXA7IG90aGVyd2lzZSwgdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAKLSAgICAgKiAgaWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzIDxjb2RlPiZsdDs9IDA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEJpbmFyeUhlYXAoaW50IGNhcGFjaXR5LCBib29sZWFuIGlzTWluSGVhcCkgewotICAgICAgICBpZiAoY2FwYWNpdHkgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjYXBhY2l0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1faXNNaW5IZWFwID0gaXNNaW5IZWFwOwotCi0gICAgICAgIC8vKzEgYXMgMCBpcyBub29wCi0gICAgICAgIG1fZWxlbWVudHMgPSBuZXcgT2JqZWN0W2NhcGFjaXR5ICsgMV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5CaW5hcnlIZWFwPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBoZWFwCi0gICAgICogQHBhcmFtIGlzTWluSGVhcCAgdHJ1ZSB0byB1c2UgdGhlIG9yZGVyIGltcG9zZWQgYnkgdGhlIGdpdmVuIAotICAgICAqICAgY29tcGFyYXRvcjsgZmFsc2UgdG8gcmV2ZXJzZSB0aGF0IG9yZGVyCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzLCBudWxsCi0gICAgICogIG1lYW5zIHVzZSBuYXR1cmFsIG9yZGVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gCi0gICAgICogIGlmIDxjb2RlPmNhcGFjaXR5PC9jb2RlPiBpcyA8Y29kZT4mbHQ7PSAwPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBCaW5hcnlIZWFwKGludCBjYXBhY2l0eSwgYm9vbGVhbiBpc01pbkhlYXAsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICB0aGlzKGNhcGFjaXR5LCBpc01pbkhlYXApOwotICAgICAgICBtX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIGVsZW1lbnRzIGZyb20gcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1fZWxlbWVudHMgPSBuZXcgT2JqZWN0W21fZWxlbWVudHMubGVuZ3RoXTsgIC8vIGZvciBnYwotICAgICAgICBtX3NpemUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGlmIHF1ZXVlIGlzIGVtcHR5LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBxdWV1ZSBpcyBlbXB0eTsgPGNvZGU+ZmFsc2U8L2NvZGU+IAotICAgICAqICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1fc2l6ZSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGlmIHF1ZXVlIGlzIGZ1bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHF1ZXVlIGlzIGZ1bGw7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgewotICAgICAgICAvLysxIGFzIGVsZW1lbnQgMCBpcyBub29wCi0gICAgICAgIHJldHVybiBtX2VsZW1lbnRzLmxlbmd0aCA9PSBtX3NpemUgKyAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbnRvIHF1ZXVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgIHRoZSBlbGVtZW50IHRvIGJlIGluc2VydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpc0Z1bGwoKSkgewotICAgICAgICAgICAgZ3JvdygpOwotICAgICAgICB9Ci0gICAgICAgIC8vcGVyY29sYXRlIGVsZW1lbnQgdG8gaXQncyBwbGFjZSBpbiB0cmVlCi0gICAgICAgIGlmIChtX2lzTWluSGVhcCkgewotICAgICAgICAgICAgcGVyY29sYXRlVXBNaW5IZWFwKGVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGVyY29sYXRlVXBNYXhIZWFwKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvbiB0b3Agb2YgaGVhcCBidXQgZG9uJ3QgcmVtb3ZlIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0b3Agb2YgaGVhcAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAgaWYgPGNvZGU+aXNFbXB0eSgpID09IHRydWU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwZWVrKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1fZWxlbWVudHNbMV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IG9uIHRvcCBvZiBoZWFwIGFuZCByZW1vdmUgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRvcCBvZiBoZWFwCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uICBpZiA8Y29kZT5pc0VtcHR5KCkgPT0gdHJ1ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHBvcCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IHBlZWsoKTsKLSAgICAgICAgbV9lbGVtZW50c1sxXSA9IG1fZWxlbWVudHNbbV9zaXplLS1dOwotCi0gICAgICAgIC8vIHNldCB0aGUgdW51c2VkIGVsZW1lbnQgdG8gJ251bGwnIHNvIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gICAgICAgIC8vIGNhbiBmcmVlIHRoZSBvYmplY3QgaWYgbm90IHVzZWQgYW55d2hlcmUgZWxzZS4ocmVtb3ZlIHJlZmVyZW5jZSkKLSAgICAgICAgbV9lbGVtZW50c1ttX3NpemUgKyAxXSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG1fc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBwZXJjb2xhdGUgdG9wIGVsZW1lbnQgdG8gaXQncyBwbGFjZSBpbiB0cmVlCi0gICAgICAgICAgICBpZiAobV9pc01pbkhlYXApIHsKLSAgICAgICAgICAgICAgICBwZXJjb2xhdGVEb3duTWluSGVhcCgxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVyY29sYXRlRG93bk1heEhlYXAoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmNvbGF0ZXMgZWxlbWVudCBkb3duIGhlYXAgZnJvbSB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgdGhlIGluZGV4LgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZXMgaXQgaXMgYSBtaW5pbXVtIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZURvd25NaW5IZWFwKGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBmaW5hbCBPYmplY3QgZWxlbWVudCA9IG1fZWxlbWVudHNbaW5kZXhdOwotICAgICAgICBpbnQgaG9sZSA9IGluZGV4OwotCi0gICAgICAgIHdoaWxlICgoaG9sZSAqIDIpIDw9IG1fc2l6ZSkgewotICAgICAgICAgICAgaW50IGNoaWxkID0gaG9sZSAqIDI7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByaWdodCBjaGlsZCBhbmQgdGhhdCBjaGlsZCBjYW4gbm90IGJlIHBlcmNvbGF0ZWQKLSAgICAgICAgICAgIC8vIHVwIHRoZW4gbW92ZSBvbnRvIG90aGVyIGNoaWxkCi0gICAgICAgICAgICBpZiAoY2hpbGQgIT0gbV9zaXplICYmIGNvbXBhcmUobV9lbGVtZW50c1tjaGlsZCArIDFdLCBtX2VsZW1lbnRzW2NoaWxkXSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgcmVzdGluZyBwbGFjZSBvZiBidWJibGUgdGhlbiB0ZXJtaW5hdGUgc2VhcmNoCi0gICAgICAgICAgICBpZiAoY29tcGFyZShtX2VsZW1lbnRzW2NoaWxkXSwgZWxlbWVudCkgPj0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX2VsZW1lbnRzW2hvbGVdID0gbV9lbGVtZW50c1tjaGlsZF07Ci0gICAgICAgICAgICBob2xlID0gY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2VsZW1lbnRzW2hvbGVdID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJjb2xhdGVzIGVsZW1lbnQgZG93biBoZWFwIGZyb20gdGhlIHBvc2l0aW9uIGdpdmVuIGJ5IHRoZSBpbmRleC4KLSAgICAgKiA8cD4KLSAgICAgKiBBc3N1bWVzIGl0IGlzIGEgbWF4aW11bSBoZWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZURvd25NYXhIZWFwKGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBmaW5hbCBPYmplY3QgZWxlbWVudCA9IG1fZWxlbWVudHNbaW5kZXhdOwotICAgICAgICBpbnQgaG9sZSA9IGluZGV4OwotCi0gICAgICAgIHdoaWxlICgoaG9sZSAqIDIpIDw9IG1fc2l6ZSkgewotICAgICAgICAgICAgaW50IGNoaWxkID0gaG9sZSAqIDI7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByaWdodCBjaGlsZCBhbmQgdGhhdCBjaGlsZCBjYW4gbm90IGJlIHBlcmNvbGF0ZWQKLSAgICAgICAgICAgIC8vIHVwIHRoZW4gbW92ZSBvbnRvIG90aGVyIGNoaWxkCi0gICAgICAgICAgICBpZiAoY2hpbGQgIT0gbV9zaXplICYmIGNvbXBhcmUobV9lbGVtZW50c1tjaGlsZCArIDFdLCBtX2VsZW1lbnRzW2NoaWxkXSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgcmVzdGluZyBwbGFjZSBvZiBidWJibGUgdGhlbiB0ZXJtaW5hdGUgc2VhcmNoCi0gICAgICAgICAgICBpZiAoY29tcGFyZShtX2VsZW1lbnRzW2NoaWxkXSwgZWxlbWVudCkgPD0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX2VsZW1lbnRzW2hvbGVdID0gbV9lbGVtZW50c1tjaGlsZF07Ci0gICAgICAgICAgICBob2xlID0gY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2VsZW1lbnRzW2hvbGVdID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJjb2xhdGVzIGVsZW1lbnQgdXAgaGVhcCBmcm9tIHRoZSBwb3NpdGlvbiBnaXZlbiBieSB0aGUgaW5kZXguCi0gICAgICogPHA+Ci0gICAgICogQXNzdW1lcyBpdCBpcyBhIG1pbmltdW0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGVyY29sYXRlZCB1cAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWluSGVhcChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50IGhvbGUgPSBpbmRleDsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBtX2VsZW1lbnRzW2hvbGVdOwotICAgICAgICB3aGlsZSAoaG9sZSA+IDEgJiYgY29tcGFyZShlbGVtZW50LCBtX2VsZW1lbnRzW2hvbGUgLyAyXSkgPCAwKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBwdXNoZWQgZG93bgotICAgICAgICAgICAgLy8gYXMgdGhlIGVsZW1lbnQgImJ1YmJsZSIgaXMgcGVyY29sYXRlZCB1cAotICAgICAgICAgICAgZmluYWwgaW50IG5leHQgPSBob2xlIC8gMjsKLSAgICAgICAgICAgIG1fZWxlbWVudHNbaG9sZV0gPSBtX2VsZW1lbnRzW25leHRdOwotICAgICAgICAgICAgaG9sZSA9IG5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9lbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyY29sYXRlcyBhIG5ldyBlbGVtZW50IHVwIGhlYXAgZnJvbSB0aGUgYm90dG9tLgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZXMgaXQgaXMgYSBtaW5pbXVtIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWluSGVhcChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBtX2VsZW1lbnRzWysrbV9zaXplXSA9IGVsZW1lbnQ7Ci0gICAgICAgIHBlcmNvbGF0ZVVwTWluSGVhcChtX3NpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmNvbGF0ZXMgZWxlbWVudCB1cCBoZWFwIGZyb20gZnJvbSB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgdGhlIGluZGV4LgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZSBpdCBpcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGVyY29sYXRlZCB1cAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWF4SGVhcChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50IGhvbGUgPSBpbmRleDsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBtX2VsZW1lbnRzW2hvbGVdOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGhvbGUgPiAxICYmIGNvbXBhcmUoZWxlbWVudCwgbV9lbGVtZW50c1tob2xlIC8gMl0pID4gMCkgewotICAgICAgICAgICAgLy8gc2F2ZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcHVzaGVkIGRvd24KLSAgICAgICAgICAgIC8vIGFzIHRoZSBlbGVtZW50ICJidWJibGUiIGlzIHBlcmNvbGF0ZWQgdXAKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXh0ID0gaG9sZSAvIDI7Ci0gICAgICAgICAgICBtX2VsZW1lbnRzW2hvbGVdID0gbV9lbGVtZW50c1tuZXh0XTsKLSAgICAgICAgICAgIGhvbGUgPSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgbV9lbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmNvbGF0ZXMgYSBuZXcgZWxlbWVudCB1cCBoZWFwIGZyb20gdGhlIGJvdHRvbS4KLSAgICAgKiA8cD4KLSAgICAgKiBBc3N1bWUgaXQgaXMgYSBtYXhpbXVtIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWF4SGVhcChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBtX2VsZW1lbnRzWysrbV9zaXplXSA9IGVsZW1lbnQ7Ci0gICAgICAgIHBlcmNvbGF0ZVVwTWF4SGVhcChtX3NpemUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gb2JqZWN0cyB1c2luZyB0aGUgY29tcGFyYXRvciBpZiBzcGVjaWZpZWQsIG9yIHRoZQotICAgICAqIG5hdHVyYWwgb3JkZXIgb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhICB0aGUgZmlyc3Qgb2JqZWN0Ci0gICAgICogQHBhcmFtIGIgIHRoZSBzZWNvbmQgb2JqZWN0Ci0gICAgICogQHJldHVybiAtdmUgaWYgYSBsZXNzIHRoYW4gYiwgMCBpZiB0aGV5IGFyZSBlcXVhbCwgK3ZlIGlmIGEgZ3JlYXRlciB0aGFuIGIKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotICAgICAgICBpZiAobV9jb21wYXJhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3IuY29tcGFyZShhLCBiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIGEpLmNvbXBhcmVUbyhiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgaGVhcCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBncm93KCkgewotICAgICAgICBmaW5hbCBPYmplY3RbXSBlbGVtZW50cyA9IG5ldyBPYmplY3RbbV9lbGVtZW50cy5sZW5ndGggKiAyXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShtX2VsZW1lbnRzLCAwLCBlbGVtZW50cywgMCwgbV9lbGVtZW50cy5sZW5ndGgpOwotICAgICAgICBtX2VsZW1lbnRzID0gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGhlYXAuICBUaGUgcmV0dXJuZWQgc3RyaW5nCi0gICAgICogaXMgc2ltaWxhciB0byB0aG9zZSBwcm9kdWNlZCBieSBzdGFuZGFyZCBKREsgY29sbGVjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaGVhcAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoIlsgIik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtX3NpemUgKyAxOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpICE9IDEpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQobV9lbGVtZW50c1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoIiBdIik7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBoZWFwJ3MgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBoZWFwJ3MgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGluZGV4ID0gMTsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IDw9IG1fc2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9lbGVtZW50c1tsYXN0UmV0dXJuZWRJbmRleF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2VsZW1lbnRzWyBsYXN0UmV0dXJuZWRJbmRleCBdID0gbV9lbGVtZW50c1sgbV9zaXplIF07Ci0gICAgICAgICAgICAgICAgbV9lbGVtZW50c1sgbV9zaXplIF0gPSBudWxsOwotICAgICAgICAgICAgICAgIG1fc2l6ZS0tOyAgCi0gICAgICAgICAgICAgICAgaWYoIG1fc2l6ZSAhPSAwICYmIGxhc3RSZXR1cm5lZEluZGV4IDw9IG1fc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyZVRvUGFyZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRvUGFyZW50ID0gY29tcGFyZShtX2VsZW1lbnRzW2xhc3RSZXR1cm5lZEluZGV4XSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lbGVtZW50c1tsYXN0UmV0dXJuZWRJbmRleCAvIDJdKTsgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2lzTWluSGVhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID4gMSAmJiBjb21wYXJlVG9QYXJlbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY29sYXRlVXBNaW5IZWFwKGxhc3RSZXR1cm5lZEluZGV4KTsgCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNvbGF0ZURvd25NaW5IZWFwKGxhc3RSZXR1cm5lZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIG1heCBoZWFwCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPiAxICYmIGNvbXBhcmVUb1BhcmVudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjb2xhdGVVcE1heEhlYXAobGFzdFJldHVybmVkSW5kZXgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY29sYXRlRG93bk1heEhlYXAobGFzdFJldHVybmVkSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7IAotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIG9iamVjdCB0byB0aGlzIGhlYXAuIFNhbWUgYXMge0BsaW5rICNpbnNlcnQoT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqIEByZXR1cm4gdHJ1ZSwgYWx3YXlzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaW5zZXJ0KG9iamVjdCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByaW9yaXR5IGVsZW1lbnQuIFNhbWUgYXMge0BsaW5rICNwZWVrKCl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJpb3JpdHkgZWxlbWVudAotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGlmIHRoaXMgaGVhcCBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHBlZWsoKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBwcmlvcml0eSBlbGVtZW50LiBTYW1lIGFzIHtAbGluayAjcG9wKCl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBwcmlvcml0eSBlbGVtZW50Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgdGhpcyBoZWFwIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9wKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgaGVhcC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGhlYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtX3NpemU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQm91bmRlZENvbGxlY3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTFjNDY3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYSBjb2xsZWN0aW9uIHRoYXQgaXMgYm91bmRlZCBpbiBzaXplLgotICogPHA+Ci0gKiBUaGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbiBjYW4gdmFyeSwgYnV0IGl0IGNhbiBuZXZlciBleGNlZWQgYSBwcmVzZXQgCi0gKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cy4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIHRoZSBxdWVyeWluZyBvZiBkZXRhaWxzCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzLgotICoKLSAqIEBzZWUgQ29sbGVjdGlvblV0aWxzI2lzRnVsbAotICogQHNlZSBDb2xsZWN0aW9uVXRpbHMjbWF4U2l6ZQotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgSGVydmUgUXVpcm96Ci0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJvdW5kZWRDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb2xsZWN0aW9uIGlzIGZ1bGwgYW5kIG5vIG5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2xsZWN0aW9uIGlzIGZ1bGwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRnVsbCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uICh0aGUgYm91bmQpLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhlIGNvbGxlY3Rpb24gY2FuIGhvbGQKLSAgICAgKi8KLSAgICBpbnQgbWF4U2l6ZSgpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQm91bmRlZEZpZm9CdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkRmlmb0J1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MGRkOWQ0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkRmlmb0J1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBCb3VuZGVkRmlmb0J1ZmZlciBpcyBhIHZlcnkgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mCi0gKiBCdWZmZXIgdGhhdCBkb2VzIG5vdCBhbHRlciB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF0IHJ1bnRpbWUuCi0gKiA8cD4KLSAqIFRoZSByZW1vdmFsIG9yZGVyIG9mIGEgPGNvZGU+Qm91bmRlZEZpZm9CdWZmZXI8L2NvZGU+IGlzIGJhc2VkIG9uIHRoZSAKLSAqIGluc2VydGlvbiBvcmRlcjsgZWxlbWVudHMgYXJlIHJlbW92ZWQgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleQotICogd2VyZSBhZGRlZC4gIFRoZSBpdGVyYXRpb24gb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW92YWwgb3JkZXIuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgI2FkZChPYmplY3QpfSwge0BsaW5rICNyZW1vdmUoKX0gYW5kIHtAbGluayAjZ2V0KCl9IG9wZXJhdGlvbnMKLSAqIGFsbCBwZXJmb3JtIGluIGNvbnN0YW50IHRpbWUuICBBbGwgb3RoZXIgb3BlcmF0aW9ucyBwZXJmb3JtIGluIGxpbmVhcgotICogdGltZSBvciB3b3JzZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4gIFRoZSBmb2xsb3dpbmcgY2FuIGJlCi0gKiB1c2VkIHRvIHByb3ZpZGUgc3luY2hyb25pemVkIGFjY2VzcyB0byB5b3VyIDxjb2RlPkJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPjoKLSAqIDxwcmU+Ci0gKiAgIEJ1ZmZlciBmaWZvID0gQnVmZmVyVXRpbHMuc3luY2hyb25pemVkQnVmZmVyKG5ldyBCb3VuZGVkRmlmb0J1ZmZlcigpKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGlzIGJ1ZmZlciBwcmV2ZW50cyBudWxsIG9iamVjdHMgZnJvbSBiZWluZyBhZGRlZC4KLSAqCi0gKiBAZGVwcmVjYXRlZCBNb3ZlZCB0byBidWZmZXIgc3VicGFja2FnZS4gRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzaW5jZSAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIEF2YWxvbgotICogQGF1dGhvciBCZXJpbiBMb3JpdHNjaAotICogQGF1dGhvciBQYXVsIEphY2sKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIEhlcnZlIFF1aXJvegotICovCi1wdWJsaWMgY2xhc3MgQm91bmRlZEZpZm9CdWZmZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KLSAgICAgICAgaW1wbGVtZW50cyBCdWZmZXIsIEJvdW5kZWRDb2xsZWN0aW9uIHsKLSAgICAgICAgICAgIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbV9lbGVtZW50czsKLSAgICBwcml2YXRlIGludCBtX3N0YXJ0ID0gMDsKLSAgICBwcml2YXRlIGludCBtX2VuZCA9IDA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fZnVsbCA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1heEVsZW1lbnRzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Cb3VuZGVkRmlmb0J1ZmZlcjwvY29kZT4gYmlnIGVub3VnaCB0byBob2xkCi0gICAgICogMzIgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIEJvdW5kZWRGaWZvQnVmZmVyKCkgewotICAgICAgICB0aGlzKDMyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPiBiaWcgZW5vdWdoIHRvIGhvbGQKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaXplICB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHRoaXMgZmlmbwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgc2l6ZSBpcyBsZXNzIHRoYW4gMQotICAgICAqLwotICAgIHB1YmxpYyBCb3VuZGVkRmlmb0J1ZmZlcihpbnQgc2l6ZSkgewotICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7Ci0gICAgICAgIH0KLSAgICAgICAgbV9lbGVtZW50cyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gICAgICAgIG1heEVsZW1lbnRzID0gbV9lbGVtZW50cy5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Cb3VuZGVkRmlmb0J1ZmZlcjwvY29kZT4gYmlnIGVub3VnaCB0byBob2xkIGFsbAotICAgICAqIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uIFRoYXQgY29sbGVjdGlvbidzCi0gICAgICogZWxlbWVudHMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgdG8gYWRkLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQm91bmRlZEZpZm9CdWZmZXIoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRoaXMoY29sbC5zaXplKCkpOwotICAgICAgICBhZGRBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIGJ1ZmZlcidzIHNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLQotICAgICAgICBpZiAobV9lbmQgPCBtX3N0YXJ0KSB7Ci0gICAgICAgICAgICBzaXplID0gbWF4RWxlbWVudHMgLSBtX3N0YXJ0ICsgbV9lbmQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9lbmQgPT0gbV9zdGFydCkgewotICAgICAgICAgICAgc2l6ZSA9IChtX2Z1bGwgPyBtYXhFbGVtZW50cyA6IDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZSA9IG1fZW5kIC0gbV9zdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBlbXB0eTsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbGxlY3Rpb24gaXMgZnVsbCBhbmQgbm8gbmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSBtYXhFbGVtZW50czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uICh0aGUgYm91bmQpLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhlIGNvbGxlY3Rpb24gY2FuIGhvbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtYXhFbGVtZW50czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoaXMgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtX2Z1bGwgPSBmYWxzZTsKLSAgICAgICAgbV9zdGFydCA9IDA7Ci0gICAgICAgIG1fZW5kID0gMDsKLSAgICAgICAgQXJyYXlzLmZpbGwobV9lbGVtZW50cywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCB0byB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50ICB0aGUgZWxlbWVudCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUsIGFsd2F5cwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uICBpZiB0aGlzIGJ1ZmZlciBpcyBmdWxsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChudWxsID09IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQXR0ZW1wdGVkIHRvIGFkZCBudWxsIG9iamVjdCB0byBidWZmZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2Z1bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigiVGhlIGJ1ZmZlciBjYW5ub3QgaG9sZCBtb3JlIHRoYW4gIiArIG1heEVsZW1lbnRzICsgIiBvYmplY3RzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9lbGVtZW50c1ttX2VuZCsrXSA9IGVsZW1lbnQ7Ci0KLSAgICAgICAgaWYgKG1fZW5kID49IG1heEVsZW1lbnRzKSB7Ci0gICAgICAgICAgICBtX2VuZCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9lbmQgPT0gbV9zdGFydCkgewotICAgICAgICAgICAgbV9mdWxsID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxlYXN0IHJlY2VudGx5IGluc2VydGVkIGVsZW1lbnQgaW4gdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbV9lbGVtZW50c1ttX3N0YXJ0XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbGVtZW50IGZyb20gdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSgpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZWxlbWVudCA9IG1fZWxlbWVudHNbbV9zdGFydF07Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gZWxlbWVudCkgewotICAgICAgICAgICAgbV9lbGVtZW50c1ttX3N0YXJ0KytdID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1fc3RhcnQgPj0gbWF4RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICBtX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbV9mdWxsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBpbnRlcm5hbCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBpbmNyZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW5jcmVtZW50KGludCBpbmRleCkgewotICAgICAgICBpbmRleCsrOyAKLSAgICAgICAgaWYgKGluZGV4ID49IG1heEVsZW1lbnRzKSB7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY3JlbWVudHMgdGhlIGludGVybmFsIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGRlY3JlbWVudAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgaW5kZXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkZWNyZW1lbnQoaW50IGluZGV4KSB7Ci0gICAgICAgIGluZGV4LS07Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gbWF4RWxlbWVudHMgLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBidWZmZXIncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGJ1ZmZlcidzIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IG1fc3RhcnQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBsYXN0UmV0dXJuZWRJbmRleCA9IC0xOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRmlyc3QgPSBtX2Z1bGw7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzRmlyc3QgfHwgKGluZGV4ICE9IG1fZW5kKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIGluZGV4ID0gaW5jcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9lbGVtZW50c1tsYXN0UmV0dXJuZWRJbmRleF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPT0gLTEpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgcXVpY2tseQotICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA9PSBtX3N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEJvdW5kZWRGaWZvQnVmZmVyLnRoaXMucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlciBlbGVtZW50cyByZXF1aXJlIHVzIHRvIHNoaWZ0IHRoZSBzdWJzZXF1ZW50IGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgaW50IGkgPSBsYXN0UmV0dXJuZWRJbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkgIT0gbV9lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gbWF4RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZWxlbWVudHNbaSAtIDFdID0gbV9lbGVtZW50c1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9lbGVtZW50c1tpIC0gMV0gPSBtX2VsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBtX2VuZCA9IGRlY3JlbWVudChtX2VuZCk7Ci0gICAgICAgICAgICAgICAgbV9lbGVtZW50c1ttX2VuZF0gPSBudWxsOwotICAgICAgICAgICAgICAgIG1fZnVsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGluZGV4ID0gZGVjcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Cb3VuZGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3YTgyZjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0JvdW5kZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlZmluZXMgYSBtYXAgdGhhdCBpcyBib3VuZGVkIGluIHNpemUuCi0gKiA8cD4KLSAqIFRoZSBzaXplIG9mIHRoZSBtYXAgY2FuIHZhcnksIGJ1dCBpdCBjYW4gbmV2ZXIgZXhjZWVkIGEgcHJlc2V0IAotICogbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMuIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB0aGUgcXVlcnlpbmcgb2YgZGV0YWlscwotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJvdW5kZWRNYXAgZXh0ZW5kcyBNYXAgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIGlzIGZ1bGwgYW5kIG5vIG5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXAgaXMgZnVsbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNGdWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hcCAodGhlIGJvdW5kKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSBtYXAgY2FuIGhvbGQKLSAgICAgKi8KLSAgICBpbnQgbWF4U2l6ZSgpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZjMyNjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYSBjb2xsZWN0aW9uIHRoYXQgYWxsb3dzIG9iamVjdHMgdG8gYmUgcmVtb3ZlZCBpbiBzb21lIHdlbGwtZGVmaW5lZCBvcmRlci4KLSAqIDxwPgotICogVGhlIHJlbW92YWwgb3JkZXIgY2FuIGJlIGJhc2VkIG9uIGluc2VydGlvbiBvcmRlciAoZWcsIGEgRklGTyBxdWV1ZSBvciBhCi0gKiBMSUZPIHN0YWNrKSwgb24gYWNjZXNzIG9yZGVyIChlZywgYW4gTFJVIGNhY2hlKSwgb24gc29tZSBhcmJpdHJhcnkgY29tcGFyYXRvcgotICogKGVnLCBhIHByaW9yaXR5IHF1ZXVlKSBvciBvbiBhbnkgb3RoZXIgd2VsbC1kZWZpbmVkIG9yZGVyaW5nLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIHJlbW92YWwgb3JkZXIgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBpdGVyYXRpb24KLSAqIG9yZGVyLiAgQSA8Y29kZT5CdWZmZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIG1heSBoYXZlIGVxdWl2YWxlbnQgcmVtb3ZhbAotICogYW5kIGl0ZXJhdGlvbiBvcmRlcnMsIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgZG9lcyBub3Qgc3BlY2lmeSBhbnkgYmVoYXZpb3IgZm9yIAotICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gYW5kIHtAbGluayBPYmplY3QjaGFzaENvZGV9IG1ldGhvZHMuICBJdAotICogaXMgdGhlcmVmb3JlIHBvc3NpYmxlIGZvciBhIDxjb2RlPkJ1ZmZlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gYWxzbwotICogYWxzbyBpbXBsZW1lbnQge0BsaW5rIGphdmEudXRpbC5MaXN0fSwge0BsaW5rIGphdmEudXRpbC5TZXR9IG9yIAotICoge0BsaW5rIEJhZ30uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBBdmFsb24KLSAqIEBhdXRob3IgQmVyaW4gTG9yaXRzY2gKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1ZmZlciBleHRlbmRzIENvbGxlY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbmQgcmVtb3ZlcyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGJ1ZmZlciwgd2hpY2ggaXMgYWxzbyByZW1vdmVkCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Ci0gICAgICovCi0gICAgT2JqZWN0IHJlbW92ZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgYnVmZmVyIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgYnVmZmVyLCB3aGljaCBpcyBub3QgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmOGUyMzMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlck92ZXJmbG93RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi0vKioKLSAqIFRoZSBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGJ1ZmZlcidzIGNhcGFjaXR5IGhhcyBiZWVuCi0gKiBleGNlZWRlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIEF2YWxvbgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ymxvcml0c2NoQGFwYWNoZS5vcmciPkJlcmluIExvcml0c2NoPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVmZnRAYXBhY2hlLm9yZyI+SmVmZiBUdXJuZXI8L2E+Ci0gKiBAYXV0aG9yIFBhdWwgSmFjawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSByb290IGNhdXNlIHRocm93YWJsZSAqLwotICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3dhYmxlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzKG1lc3NhZ2UsIG51bGwpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlICB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhyb3dhYmxlID0gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gdGhyb3dhYmxlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGUzYTE5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5LgotICogPHA+Ci0gKiBOT1RFOiBGcm9tIHZlcnNpb24gMy4wLCB0aGlzIGV4Y2VwdGlvbiBleHRlbmRzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKgotICogQGF1dGhvciBBdmFsb24KLSAqIEBhdXRob3IgQmVyaW4gTG9yaXRzY2gKLSAqIEBhdXRob3IgSmVmZiBUdXJuZXIKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGV4dGVuZHMgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSByb290IGNhdXNlIHRocm93YWJsZSAqLwotICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+QnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aHJvd2FibGUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+QnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhyb3dhYmxlID0gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gdGhyb3dhYmxlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9CdWZmZXJVdGlscy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxZjZhNjEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0J1ZmZlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXIuQmxvY2tpbmdCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlci5QcmVkaWNhdGVkQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXIuU3luY2hyb25pemVkQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXIuVHJhbnNmb3JtZWRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlci5UeXBlZEJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyLlVubW9kaWZpYWJsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyLkJvdW5kZWRCdWZmZXI7Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGFuZCBkZWNvcmF0b3JzIGZvciB7QGxpbmsgQnVmZmVyfSBpbnN0YW5jZXMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlclV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IHVubW9kaWZpYWJsZSBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCdWZmZXIgRU1QVFlfQlVGRkVSID0gVW5tb2RpZmlhYmxlQnVmZmVyLmRlY29yYXRlKG5ldyBBcnJheVN0YWNrKDEpKTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkJ1ZmZlclV0aWxzPC9jb2RlPiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVmZmVyVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgYnVmZmVyIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyLgotICAgICAqIE11Y2ggbGlrZSB0aGUgc3luY2hyb25pemVkIGNvbGxlY3Rpb25zIHJldHVybmVkIGJ5Ci0gICAgICoge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9uc30sIHlvdSBtdXN0IG1hbnVhbGx5IHN5bmNocm9uaXplIG9uCi0gICAgICogdGhlIHJldHVybmVkIGJ1ZmZlcidzIGl0ZXJhdG9yIHRvIGF2b2lkIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yOgotICAgICAqCi0gICAgICogPHByZT4KLSAgICAgKiBCdWZmZXIgYiA9IEJ1ZmZlclV0aWxzLnN5bmNocm9uaXplZEJ1ZmZlcihteUJ1ZmZlcik7Ci0gICAgICogc3luY2hyb25pemVkIChiKSB7Ci0gICAgICogICAgIEl0ZXJhdG9yIGkgPSBiLml0ZXJhdG9yKCk7Ci0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgcHJvY2VzcyAoaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBzeW5jaHJvbml6ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgYnVmZmVyIGJhY2tlZCBieSB0aGF0IGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgQnVmZmVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBzeW5jaHJvbml6ZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICByZXR1cm4gU3luY2hyb25pemVkQnVmZmVyLmRlY29yYXRlKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN5bmNocm9uaXplZCBidWZmZXIgYmFja2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIgdGhhdCB3aWxsCi0gICAgICogYmxvY2sgb24ge0BsaW5rIEJ1ZmZlciNnZXQoKX0gYW5kIHtAbGluayBCdWZmZXIjcmVtb3ZlKCl9IG9wZXJhdGlvbnMuCi0gICAgICogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSwgdGhlbiB0aGUge0BsaW5rIEJ1ZmZlciNnZXQoKX0gYW5kCi0gICAgICoge0BsaW5rIEJ1ZmZlciNyZW1vdmUoKX0gb3BlcmF0aW9ucyB3aWxsIGJsb2NrIHVudGlsIG5ldyBlbGVtZW50cwotICAgICAqIGFyZSBhZGRlZCB0byB0aGUgYnVmZmVyLCByYXRoZXIgdGhhbiBpbW1lZGlhdGVseSB0aHJvd2luZyBhCi0gICAgICogPGNvZGU+QnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgIHRoZSBidWZmZXIgdG8gc3luY2hyb25pemUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgYmxvY2tpbmcgYnVmZmVyIGJhY2tlZCBieSB0aGF0IGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgQnVmZmVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBibG9ja2luZ0J1ZmZlcihCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBCbG9ja2luZ0J1ZmZlci5kZWNvcmF0ZShidWZmZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgYnVmZmVyIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyIHRoYXQgd2lsbAotICAgICAqIGJsb2NrIG9uIHtAbGluayBCdWZmZXIjZ2V0KCl9IGFuZCB7QGxpbmsgQnVmZmVyI3JlbW92ZSgpfSBvcGVyYXRpb25zCi0gICAgICogdW50aWwgPGNvZGU+dGltZW91dDwvY29kZT4gZXhwaXJlcy4gIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHRoZW4gdGhlCi0gICAgICoge0BsaW5rIEJ1ZmZlciNnZXQoKX0gYW5kIHtAbGluayBCdWZmZXIjcmVtb3ZlKCl9IG9wZXJhdGlvbnMgd2lsbCBibG9jawotICAgICAqIHVudGlsIG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW4gaW1tZWRpYXRlbHkKLSAgICAgKiB0aHJvd2luZyBhIDxjb2RlPkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIHN5bmNocm9uaXplLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRpbWVvdXRNaWxsaXMgIHRoZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcywgemVybyBvciBsZXNzIGZvciBubyB0aW1lb3V0Ci0gICAgICogQHJldHVybiBhIGJsb2NraW5nIGJ1ZmZlciBiYWNrZWQgYnkgdGhhdCBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIEJ1ZmZlciBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXIgYmxvY2tpbmdCdWZmZXIoQnVmZmVyIGJ1ZmZlciwgbG9uZyB0aW1lb3V0TWlsbGlzKSB7Ci0gICAgICAgIHJldHVybiBCbG9ja2luZ0J1ZmZlci5kZWNvcmF0ZShidWZmZXIsIHRpbWVvdXRNaWxsaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgYnVmZmVyIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyIHRoYXQgd2lsbAotICAgICAqIGJsb2NrIG9uIHtAbGluayBCdWZmZXIjYWRkKE9iamVjdCl9IGFuZAotICAgICAqIHtAbGluayBCdWZmZXIjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKX0gdW50aWwgZW5vdWdoIG9iamVjdChzKSBhcmUKLSAgICAgKiByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciB0byBhbGxvdyB0aGUgb2JqZWN0KHMpIHRvIGJlIGFkZGVkIGFuZCBzdGlsbAotICAgICAqIG1haW50YWluIHRoZSBtYXhpbXVtIHNpemUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIG1ha2UgYm91bmRlZCwgIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUgIHRoZSBtYXhpbXVtIHNpemUKLSAgICAgKiBAcmV0dXJuIGEgYm91bmRlZCBidWZmZXIgYmFja2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBib3VuZGVkQnVmZmVyKEJ1ZmZlciBidWZmZXIsIGludCBtYXhpbXVtU2l6ZSkgewotICAgICAgICByZXR1cm4gQm91bmRlZEJ1ZmZlci5kZWNvcmF0ZShidWZmZXIsIG1heGltdW1TaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3luY2hyb25pemVkIGJ1ZmZlciBiYWNrZWQgYnkgdGhlIGdpdmVuIGJ1ZmZlciB0aGF0IHdpbGwKLSAgICAgKiBibG9jayBvbiB7QGxpbmsgQnVmZmVyI2FkZChPYmplY3QpfSBhbmQKLSAgICAgKiB7QGxpbmsgQnVmZmVyI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbil9IHVudGlsIGVub3VnaCBvYmplY3QocykgYXJlCi0gICAgICogcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgdG8gYWxsb3cgdGhlIG9iamVjdChzKSB0byBiZSBhZGRlZCBhbmQgc3RpbGwKLSAgICAgKiBtYWludGFpbiB0aGUgbWF4aW11bSBzaXplIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gbWFrZSBib3VuZGVkLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIG1heGltdW1TaXplIHRoZSBtYXhpbXVtIHNpemUKLSAgICAgKiBAcGFyYW0gdGltZW91dE1pbGxpcyAgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLCB6ZXJvIG9yIGxlc3MgZm9yIG5vIHRpbWVvdXQKLSAgICAgKiBAcmV0dXJuIGEgYm91bmRlZCBidWZmZXIgYmFja2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBib3VuZGVkQnVmZmVyKEJ1ZmZlciBidWZmZXIsIGludCBtYXhpbXVtU2l6ZSwgbG9uZyB0aW1lb3V0TWlsbGlzKSB7Ci0gICAgICAgIHJldHVybiBCb3VuZGVkQnVmZmVyLmRlY29yYXRlKGJ1ZmZlciwgbWF4aW11bVNpemUsIHRpbWVvdXRNaWxsaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGJ1ZmZlciBiYWNrZWQgYnkgdGhlIGdpdmVuIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgIHRoZSBidWZmZXIgdG8gbWFrZSB1bm1vZGlmaWFibGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBidWZmZXIgYmFja2VkIGJ5IHRoYXQgYnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBCdWZmZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyIHVubW9kaWZpYWJsZUJ1ZmZlcihCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVCdWZmZXIuZGVjb3JhdGUoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgYnVmZmVyIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyLgotICAgICAqIDxwPgotICAgICAqIE9ubHkgb2JqZWN0cyB0aGF0IHBhc3MgdGhlIHRlc3QgaW4gdGhlIGdpdmVuIHByZWRpY2F0ZSBjYW4gYmUgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KLSAgICAgKiBUcnlpbmcgdG8gYWRkIGFuIGludmFsaWQgb2JqZWN0IHJlc3VsdHMgaW4gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotICAgICAqIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBidWZmZXIgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsCi0gICAgICogYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIGludmFsaWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgIHRoZSBidWZmZXIgdG8gcHJlZGljYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIGV2YWx1YXRlIG5ldyBlbGVtZW50cywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBwcmVkaWNhdGVkIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgQnVmZmVyIG9yIFByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXIgcHJlZGljYXRlZEJ1ZmZlcihCdWZmZXIgYnVmZmVyLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBQcmVkaWNhdGVkQnVmZmVyLmRlY29yYXRlKGJ1ZmZlciwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHlwZWQgYnVmZmVyIGJhY2tlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyLgotICAgICAqIDxwPgotICAgICAqIE9ubHkgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSBhZGRlZCB0byB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgaW50byB0aGUgYnVmZmVyLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHR5cGVkIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgYnVmZmVyIG9yIHR5cGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyIHR5cGVkQnVmZmVyKEJ1ZmZlciBidWZmZXIsIENsYXNzIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIFR5cGVkQnVmZmVyLmRlY29yYXRlKGJ1ZmZlciwgdHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRyYW5zZm9ybWVkIGJ1ZmZlciBiYWNrZWQgYnkgdGhlIGdpdmVuIGJ1ZmZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG9iamVjdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgdHJhbnNmb3JtZXIgYXMgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICAgICogQnVmZmVyLiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgYnVmZmVyIGFmdGVyIGludm9raW5nIHRoaXMgCi0gICAgICogbWV0aG9kLCBhcyBpdCBpcyBhIGJhY2tkb29yIGZvciBhZGRpbmcgdW50cmFuc2Zvcm1lZCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciBmb3IgdGhlIGJ1ZmZlciwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lZCBidWZmZXIgYmFja2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIEJ1ZmZlciBvciBUcmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXIgdHJhbnNmb3JtZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlciwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVkQnVmZmVyLmRlY29yYXRlKGJ1ZmZlciwgdHJhbnNmb3JtZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Nsb3N1cmUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NmQ3N2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Nsb3N1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIGZ1bmN0b3IgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBkbyBzb21ldGhpbmcuCi0gKiA8cD4KLSAqIEEgPGNvZGU+Q2xvc3VyZTwvY29kZT4gcmVwcmVzZW50cyBhIGJsb2NrIG9mIGNvZGUgd2hpY2ggaXMgZXhlY3V0ZWQgZnJvbQotICogaW5zaWRlIHNvbWUgYmxvY2ssIGZ1bmN0aW9uIG9yIGl0ZXJhdGlvbi4gSXQgb3BlcmF0ZXMgYW4gaW5wdXQgb2JqZWN0LgotICogPHA+Ci0gKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YgY29tbW9uIGNsb3N1cmVzIGFyZSBwcm92aWRlZCBieQotICoge0BsaW5rIENsb3N1cmVVdGlsc30uIFRoZXNlIGluY2x1ZGUgbWV0aG9kIGludm9rYXRpb24gYW5kIGZvci93aGlsZSBsb29wcy4KLSAqICAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDEuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOSAkCi0gKgotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBOaWNvbGEgS2VuIEJhcm96emkKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xvc3VyZSB7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhbiBhY3Rpb24gb24gdGhlIHNwZWNpZmllZCBpbnB1dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCB0byBleGVjdXRlIG9uCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gKHJ1bnRpbWUpIGlmIHRoZSBpbnB1dCBpcyB0aGUgd3JvbmcgY2xhc3MKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAocnVudGltZSkgaWYgdGhlIGlucHV0IGlzIGludmFsaWQKLSAgICAgKiBAdGhyb3dzIEZ1bmN0b3JFeGNlcHRpb24gKHJ1bnRpbWUpIGlmIGFueSBvdGhlciBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DbG9zdXJlVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9DbG9zdXJlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ5NDMzMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ2xvc3VyZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0LDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZENsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkVxdWFsUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5FeGNlcHRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Gb3JDbG9zdXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JZkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTk9QQ2xvc3VyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuU3dpdGNoQ2xvc3VyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVHJhbnNmb3JtZXJDbG9zdXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5XaGlsZUNsb3N1cmU7Ci0KLS8qKgotICogPGNvZGU+Q2xvc3VyZVV0aWxzPC9jb2RlPiBwcm92aWRlcyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zIGFuZCB1dGlsaXRpZXMKLSAqIGZvciB0aGUgQ2xvc3VyZSBmdW5jdG9yIGludGVyZmFjZS4gVGhlIHN1cHBsaWVkIGNsb3N1cmVzIGFyZToKLSAqIDx1bD4KLSAqIDxsaT5JbnZva2VyIC0gaW52b2tlcyBhIG1ldGhvZCBvbiB0aGUgaW5wdXQgb2JqZWN0Ci0gKiA8bGk+Rm9yIC0gcmVwZWF0ZWRseSBjYWxscyBhIGNsb3N1cmUgZm9yIGEgZml4ZWQgbnVtYmVyIG9mIHRpbWVzCi0gKiA8bGk+V2hpbGUgLSByZXBlYXRlZGx5IGNhbGxzIGEgY2xvc3VyZSB3aGlsZSBhIHByZWRpY2F0ZSBpcyB0cnVlCi0gKiA8bGk+RG9XaGlsZSAtIHJlcGVhdGVkbHkgY2FsbHMgYSBjbG9zdXJlIHdoaWxlIGEgcHJlZGljYXRlIGlzIHRydWUKLSAqIDxsaT5DaGFpbmVkIC0gY2hhaW5zIHR3byBvciBtb3JlIGNsb3N1cmVzIHRvZ2V0aGVyCi0gKiA8bGk+U3dpdGNoIC0gY2FsbHMgb25lIGNsb3N1cmUgYmFzZWQgb24gb25lIG9yIG1vcmUgcHJlZGljYXRlcwotICogPGxpPlN3aXRjaE1hcCAtIGNhbGxzIG9uZSBjbG9zdXJlIGxvb2tlZCB1cCBmcm9tIGEgTWFwCi0gKiA8bGk+VHJhbnNmb3JtZXIgLSB3cmFwcyBhIFRyYW5zZm9ybWVyIGFzIGEgQ2xvc3VyZQotICogPGxpPk5PUCAtIGRvZXMgbm90aGluZwotICogPGxpPkV4Y2VwdGlvbiAtIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gKiA8L3VsPgotICogQWxsIHRoZSBzdXBwbGllZCBjbG9zdXJlcyBhcmUgU2VyaWFsaXphYmxlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHQgQmVuc29uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9zdXJlVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlVXRpbHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIENsb3N1cmUgdGhhdCBhbHdheXMgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCBkdXJpbmcgdGVzdGluZyBhcyBhIHBsYWNlaG9sZGVyLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuRXhjZXB0aW9uQ2xvc3VyZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNsb3N1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZXhjZXB0aW9uQ2xvc3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbkNsb3N1cmUuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIENsb3N1cmUgdGhhdCB3aWxsIGRvIG5vdGhpbmcuCi0gICAgICogVGhpcyBjb3VsZCBiZSB1c2VmdWwgZHVyaW5nIHRlc3RpbmcgYXMgYSBwbGFjZWhvbGRlci4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk5PUENsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIG5vcENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBOT1BDbG9zdXJlLklOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBDbG9zdXJlIHRoYXQgY2FsbHMgYSBUcmFuc2Zvcm1lciBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLgotICAgICAqIFRoZSB0cmFuc2Zvcm1lciB3aWxsIGJlIGNhbGxlZCB1c2luZyB0aGUgY2xvc3VyZSdzIGlucHV0IG9iamVjdC4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIncyByZXN1bHQgd2lsbCBiZSBpZ25vcmVkLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVHJhbnNmb3JtZXJDbG9zdXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gcnVuIGVhY2ggdGltZSBpbiB0aGUgY2xvc3VyZSwgbnVsbCBtZWFucyBub3AKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGFzQ2xvc3VyZShUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZXJDbG9zdXJlLmdldEluc3RhbmNlKHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ2xvc3VyZSB0aGF0IHdpbGwgY2FsbCB0aGUgY2xvc3VyZSA8Y29kZT5jb3VudDwvY29kZT4gdGltZXMuCi0gICAgICogPHA+Ci0gICAgICogQSBudWxsIGNsb3N1cmUgb3IgemVybyBjb3VudCByZXR1cm5zIHRoZSA8Y29kZT5OT1BDbG9zdXJlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkZvckNsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY291bnQgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gbG9vcAotICAgICAqIEBwYXJhbSBjbG9zdXJlICB0aGUgY2xvc3VyZSB0byBjYWxsIHJlcGVhdGVkbHkKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5mb3I8L2NvZGU+IGNsb3N1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZm9yQ2xvc3VyZShpbnQgY291bnQsIENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICByZXR1cm4gRm9yQ2xvc3VyZS5nZXRJbnN0YW5jZShjb3VudCwgY2xvc3VyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENsb3N1cmUgdGhhdCB3aWxsIGNhbGwgdGhlIGNsb3N1cmUgcmVwZWF0ZWRseSB1bnRpbCB0aGUgCi0gICAgICogcHJlZGljYXRlIHJldHVybnMgZmFsc2UuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5XaGlsZUNsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBhcyBhbiBlbmQgb2YgbG9vcCB0ZXN0LCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjbG9zdXJlICB0aGUgY2xvc3VyZSB0byBjYWxsIHJlcGVhdGVkbHksIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+d2hpbGU8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSB3aGlsZUNsb3N1cmUoUHJlZGljYXRlIHByZWRpY2F0ZSwgQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgICAgIHJldHVybiBXaGlsZUNsb3N1cmUuZ2V0SW5zdGFuY2UocHJlZGljYXRlLCBjbG9zdXJlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENsb3N1cmUgdGhhdCB3aWxsIGNhbGwgdGhlIGNsb3N1cmUgb25jZSBhbmQgdGhlbiByZXBlYXRlZGx5Ci0gICAgICogdW50aWwgdGhlIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuV2hpbGVDbG9zdXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsb3N1cmUgIHRoZSBjbG9zdXJlIHRvIGNhbGwgcmVwZWF0ZWRseSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBhcyBhbiBlbmQgb2YgbG9vcCB0ZXN0LCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmRvLXdoaWxlPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIGFyZ3VtZW50IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZG9XaGlsZUNsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBXaGlsZUNsb3N1cmUuZ2V0SW5zdGFuY2UocHJlZGljYXRlLCBjbG9zdXJlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ2xvc3VyZSB0aGF0IHdpbGwgaW52b2tlIGEgc3BlY2lmaWMgbWV0aG9kIG9uIHRoZSBjbG9zdXJlJ3MKLSAgICAgKiBpbnB1dCBvYmplY3QgYnkgcmVmbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLlRyYW5zZm9ybWVyQ2xvc3VyZQotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lICB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+aW52b2tlcjwvY29kZT4gY2xvc3VyZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgbmFtZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGludm9rZXJDbG9zdXJlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIC8vIHJldXNlIHRyYW5zZm9ybWVyIGFzIGl0IGhhcyBjYWNoaW5nIC0gdGhpcyBpcyBsYXp5IHJlYWxseSwgc2hvdWxkIGhhdmUgaW5uZXIgY2xhc3MgaGVyZQotICAgICAgICByZXR1cm4gYXNDbG9zdXJlKEludm9rZXJUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtZXRob2ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENsb3N1cmUgdGhhdCB3aWxsIGludm9rZSBhIHNwZWNpZmljIG1ldGhvZCBvbiB0aGUgY2xvc3VyZSdzCi0gICAgICogaW5wdXQgb2JqZWN0IGJ5IHJlZmxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnZva2VyVHJhbnNmb3JtZXIKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5UcmFuc2Zvcm1lckNsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgcGFyYW1ldGVyIHR5cGVzCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5pbnZva2VyPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBuYW1lIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcGFyYW1UeXBlcyBhbmQgYXJncyBkb24ndCBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBpbnZva2VyQ2xvc3VyZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIC8vIHJldXNlIHRyYW5zZm9ybWVyIGFzIGl0IGhhcyBjYWNoaW5nIC0gdGhpcyBpcyBsYXp5IHJlYWxseSwgc2hvdWxkIGhhdmUgaW5uZXIgY2xhc3MgaGVyZQotICAgICAgICByZXR1cm4gYXNDbG9zdXJlKEludm9rZXJUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtZXRob2ROYW1lLCBwYXJhbVR5cGVzLCBhcmdzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENsb3N1cmUgdGhhdCBjYWxscyB0d28gQ2xvc3VyZXMsIHBhc3NpbmcgdGhlIHJlc3VsdCBvZgotICAgICAqIHRoZSBmaXJzdCBpbnRvIHRoZSBzZWNvbmQuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZENsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZTEgIHRoZSBmaXJzdCBjbG9zdXJlCi0gICAgICogQHBhcmFtIGNsb3N1cmUyICB0aGUgc2Vjb25kIGNsb3N1cmUKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5jaGFpbmVkPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIGNsb3N1cmUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBjaGFpbmVkQ2xvc3VyZShDbG9zdXJlIGNsb3N1cmUxLCBDbG9zdXJlIGNsb3N1cmUyKSB7Ci0gICAgICAgIHJldHVybiBDaGFpbmVkQ2xvc3VyZS5nZXRJbnN0YW5jZShjbG9zdXJlMSwgY2xvc3VyZTIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbG9zdXJlIHRoYXQgY2FsbHMgZWFjaCBjbG9zdXJlIGluIHR1cm4sIHBhc3NpbmcgdGhlIAotICAgICAqIHJlc3VsdCBpbnRvIHRoZSBuZXh0IGNsb3N1cmUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZENsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIGFuIGFycmF5IG9mIGNsb3N1cmVzIHRvIGNoYWluCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y2hhaW5lZDwvY29kZT4gY2xvc3VyZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjbG9zdXJlcyBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNsb3N1cmUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgY2hhaW5lZENsb3N1cmUoQ2xvc3VyZVtdIGNsb3N1cmVzKSB7Ci0gICAgICAgIHJldHVybiBDaGFpbmVkQ2xvc3VyZS5nZXRJbnN0YW5jZShjbG9zdXJlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENsb3N1cmUgdGhhdCBjYWxscyBlYWNoIGNsb3N1cmUgaW4gdHVybiwgcGFzc2luZyB0aGUgCi0gICAgICogcmVzdWx0IGludG8gdGhlIG5leHQgY2xvc3VyZS4gVGhlIG9yZGVyaW5nIGlzIHRoYXQgb2YgdGhlIGl0ZXJhdG9yKCkKLSAgICAgKiBtZXRob2Qgb24gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZENsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIGEgY29sbGVjdGlvbiBvZiBjbG9zdXJlcyB0byBjaGFpbgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNoYWluZWQ8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY2xvc3VyZXMgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNsb3N1cmVzIGNvbGxlY3Rpb24gaXMgZW1wdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY2xvc3VyZSBpbiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGNoYWluZWRDbG9zdXJlKENvbGxlY3Rpb24gY2xvc3VyZXMpIHsKLSAgICAgICAgcmV0dXJuIENoYWluZWRDbG9zdXJlLmdldEluc3RhbmNlKGNsb3N1cmVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ2xvc3VyZSB0aGF0IGNhbGxzIGFub3RoZXIgY2xvc3VyZSBiYXNlZCBvbiB0aGUKLSAgICAgKiByZXN1bHQgb2YgdGhlIHNwZWNpZmllZCBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSWZDbG9zdXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHZhbGlkYXRpbmcgcHJlZGljYXRlCi0gICAgICogQHBhcmFtIHRydWVDbG9zdXJlICB0aGUgY2xvc3VyZSBjYWxsZWQgaWYgdGhlIHByZWRpY2F0ZSBpcyB0cnVlCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+aWY8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY2xvc3VyZSBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGlmQ2xvc3VyZShQcmVkaWNhdGUgcHJlZGljYXRlLCBDbG9zdXJlIHRydWVDbG9zdXJlKSB7Ci0gICAgICAgIHJldHVybiBJZkNsb3N1cmUuZ2V0SW5zdGFuY2UocHJlZGljYXRlLCB0cnVlQ2xvc3VyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENsb3N1cmUgdGhhdCBjYWxscyBvbmUgb2YgdHdvIGNsb3N1cmVzIGRlcGVuZGluZyAKLSAgICAgKiBvbiB0aGUgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JZkNsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHN3aXRjaCBvbgotICAgICAqIEBwYXJhbSB0cnVlQ2xvc3VyZSAgdGhlIGNsb3N1cmUgY2FsbGVkIGlmIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZQotICAgICAqIEBwYXJhbSBmYWxzZUNsb3N1cmUgIHRoZSBjbG9zdXJlIGNhbGxlZCBpZiB0aGUgcHJlZGljYXRlIGlzIGZhbHNlCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+c3dpdGNoPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIGNsb3N1cmUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBpZkNsb3N1cmUoUHJlZGljYXRlIHByZWRpY2F0ZSwgQ2xvc3VyZSB0cnVlQ2xvc3VyZSwgQ2xvc3VyZSBmYWxzZUNsb3N1cmUpIHsKLSAgICAgICAgcmV0dXJuIElmQ2xvc3VyZS5nZXRJbnN0YW5jZShwcmVkaWNhdGUsIHRydWVDbG9zdXJlLCBmYWxzZUNsb3N1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbG9zdXJlIHRoYXQgY2FsbHMgb25lIG9mIHRoZSBjbG9zdXJlcyBkZXBlbmRpbmcgCi0gICAgICogb24gdGhlIHByZWRpY2F0ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNsb3N1cmUgYXQgYXJyYXkgbG9jYXRpb24gMCBpcyBjYWxsZWQgaWYgdGhlIHByZWRpY2F0ZSBhdCBhcnJheSAKLSAgICAgKiBsb2NhdGlvbiAwIHJldHVybmVkIHRydWUuIEVhY2ggcHJlZGljYXRlIGlzIGV2YWx1YXRlZAotICAgICAqIHVudGlsIG9uZSByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuU3dpdGNoQ2xvc3VyZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjbG9zdXJlcyAgYW4gYXJyYXkgb2YgY2xvc3VyZXMgdG8gY2FsbCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5zd2l0Y2g8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZWl0aGVyIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgZWxlbWVudCBpbiB0aGUgYXJyYXlzIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgc3dpdGNoQ2xvc3VyZShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzLCBDbG9zdXJlW10gY2xvc3VyZXMpIHsKLSAgICAgICAgcmV0dXJuIFN3aXRjaENsb3N1cmUuZ2V0SW5zdGFuY2UocHJlZGljYXRlcywgY2xvc3VyZXMsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbG9zdXJlIHRoYXQgY2FsbHMgb25lIG9mIHRoZSBjbG9zdXJlcyBkZXBlbmRpbmcgCi0gICAgICogb24gdGhlIHByZWRpY2F0ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNsb3N1cmUgYXQgYXJyYXkgbG9jYXRpb24gMCBpcyBjYWxsZWQgaWYgdGhlIHByZWRpY2F0ZSBhdCBhcnJheQotICAgICAqIGxvY2F0aW9uIDAgcmV0dXJuZWQgdHJ1ZS4gRWFjaCBwcmVkaWNhdGUgaXMgZXZhbHVhdGVkCi0gICAgICogdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gSWYgbm8gcHJlZGljYXRlcyBldmFsdWF0ZSB0byB0cnVlLCB0aGUgZGVmYXVsdAotICAgICAqIGNsb3N1cmUgaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLlN3aXRjaENsb3N1cmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyAgYW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIGFuIGFycmF5IG9mIGNsb3N1cmVzIHRvIGNhbGwsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGRlZmF1bHRDbG9zdXJlICB0aGUgZGVmYXVsdCB0byBjYWxsIGlmIG5vIHByZWRpY2F0ZSBtYXRjaGVzCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+c3dpdGNoPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGVpdGhlciBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaW4gdGhlIGFycmF5cyBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIHN3aXRjaENsb3N1cmUoUHJlZGljYXRlW10gcHJlZGljYXRlcywgQ2xvc3VyZVtdIGNsb3N1cmVzLCBDbG9zdXJlIGRlZmF1bHRDbG9zdXJlKSB7Ci0gICAgICAgIHJldHVybiBTd2l0Y2hDbG9zdXJlLmdldEluc3RhbmNlKHByZWRpY2F0ZXMsIGNsb3N1cmVzLCBkZWZhdWx0Q2xvc3VyZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbG9zdXJlIHRoYXQgY2FsbHMgb25lIG9mIHRoZSBjbG9zdXJlcyBkZXBlbmRpbmcgCi0gICAgICogb24gdGhlIHByZWRpY2F0ZXMuIAotICAgICAqIDxwPgotICAgICAqIFRoZSBNYXAgY29uc2lzdHMgb2YgUHJlZGljYXRlIGtleXMgYW5kIENsb3N1cmUgdmFsdWVzLiBBIGNsb3N1cmUgCi0gICAgICogaXMgY2FsbGVkIGlmIGl0cyBtYXRjaGluZyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLiBFYWNoIHByZWRpY2F0ZSBpcyBldmFsdWF0ZWQKLSAgICAgKiB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBJZiBubyBwcmVkaWNhdGVzIGV2YWx1YXRlIHRvIHRydWUsIHRoZSBkZWZhdWx0Ci0gICAgICogY2xvc3VyZSBpcyBjYWxsZWQuIFRoZSBkZWZhdWx0IGNsb3N1cmUgaXMgc2V0IGluIHRoZSBtYXAgd2l0aCBhIAotICAgICAqIG51bGwga2V5LiBUaGUgb3JkZXJpbmcgaXMgdGhhdCBvZiB0aGUgaXRlcmF0b3IoKSBtZXRob2Qgb24gdGhlIGVudHJ5c2V0IAotICAgICAqIGNvbGxlY3Rpb24gb2YgdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Td2l0Y2hDbG9zdXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXNBbmRDbG9zdXJlcyAgYSBtYXAgb2YgcHJlZGljYXRlcyB0byBjbG9zdXJlcwotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnN3aXRjaDwvY29kZT4gY2xvc3VyZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgZW1wdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY2xvc3VyZSBpbiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAgaWYgdGhlIG1hcCBlbGVtZW50cyBhcmUgb2YgdGhlIHdyb25nIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgc3dpdGNoQ2xvc3VyZShNYXAgcHJlZGljYXRlc0FuZENsb3N1cmVzKSB7Ci0gICAgICAgIHJldHVybiBTd2l0Y2hDbG9zdXJlLmdldEluc3RhbmNlKHByZWRpY2F0ZXNBbmRDbG9zdXJlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENsb3N1cmUgdGhhdCB1c2VzIHRoZSBpbnB1dCBvYmplY3QgYXMgYSBrZXkgdG8gZmluZCB0aGUKLSAgICAgKiBjbG9zdXJlIHRvIGNhbGwuIAotICAgICAqIDxwPgotICAgICAqIFRoZSBNYXAgY29uc2lzdHMgb2Ygb2JqZWN0IGtleXMgYW5kIENsb3N1cmUgdmFsdWVzLiBBIGNsb3N1cmUgCi0gICAgICogaXMgY2FsbGVkIGlmIHRoZSBpbnB1dCBvYmplY3QgZXF1YWxzIHRoZSBrZXkuIElmIHRoZXJlIGlzIG5vIG1hdGNoLCB0aGUKLSAgICAgKiBkZWZhdWx0IGNsb3N1cmUgaXMgY2FsbGVkLiBUaGUgZGVmYXVsdCBjbG9zdXJlIGlzIHNldCBpbiB0aGUgbWFwCi0gICAgICogdXNpbmcgYSBudWxsIGtleS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Td2l0Y2hDbG9zdXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdHNBbmRDbG9zdXJlcyAgYSBtYXAgb2Ygb2JqZWN0cyB0byBjbG9zdXJlcwotICAgICAqIEByZXR1cm4gdGhlIGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIGVtcHR5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNsb3N1cmUgaW4gdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIHN3aXRjaE1hcENsb3N1cmUoTWFwIG9iamVjdHNBbmRDbG9zdXJlcykgewotICAgICAgICBDbG9zdXJlW10gdHJzID0gbnVsbDsKLSAgICAgICAgUHJlZGljYXRlW10gcHJlZHMgPSBudWxsOwotICAgICAgICBpZiAob2JqZWN0c0FuZENsb3N1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBvYmplY3QgYW5kIGNsb3N1cmUgbWFwIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBDbG9zdXJlIGRlZiA9IChDbG9zdXJlKSBvYmplY3RzQW5kQ2xvc3VyZXMucmVtb3ZlKG51bGwpOwotICAgICAgICBpbnQgc2l6ZSA9IG9iamVjdHNBbmRDbG9zdXJlcy5zaXplKCk7Ci0gICAgICAgIHRycyA9IG5ldyBDbG9zdXJlW3NpemVdOwotICAgICAgICBwcmVkcyA9IG5ldyBQcmVkaWNhdGVbc2l6ZV07Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG9iamVjdHNBbmRDbG9zdXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHByZWRzW2ldID0gRXF1YWxQcmVkaWNhdGUuZ2V0SW5zdGFuY2UoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgdHJzW2ldID0gKENsb3N1cmUpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN3aXRjaENsb3N1cmUocHJlZHMsIHRycywgZGVmKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db2xsZWN0aW9uVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db2xsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGY3MzlkYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ29sbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5QcmVkaWNhdGVkQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlRyYW5zZm9ybWVkQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5UeXBlZENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgYW5kIGRlY29yYXRvcnMgZm9yIHtAbGluayBDb2xsZWN0aW9ufSBpbnN0YW5jZXMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBSb2RuZXkgV2FsZGhvZmYKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBTdGV2ZSBEb3duZXkKLSAqIEBhdXRob3IgSGVydmUgUXVpcm96Ci0gKiBAYXV0aG9yIFBldGVyIEtvQmVrCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKiBAYXV0aG9yIEphbmVrIEJvZ3Vja2kKLSAqIEBhdXRob3IgUGhpbCBTdGVpdHoKLSAqIEBhdXRob3IgU3RldmVuIE1lbHplcgotICogQGF1dGhvciBKb24gU2NoZXdlCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBTdGVwaGVuIFNtaXRoCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVXRpbHMgewotCi0gICAgLyoqIENvbnN0YW50IHRvIGF2b2lkIHJlcGVhdGVkIG9iamVjdCBjcmVhdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIEludGVnZXIgSU5URUdFUl9PTkUgPSBuZXcgSW50ZWdlcigxKTsKLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uLgotICAgICAqIFRoZSBKREsgcHJvdmlkZXMgZW1wdHkgU2V0IGFuZCBMaXN0IGltcGxlbWVudGF0aW9ucyB3aGljaCBjb3VsZCBiZSB1c2VkIGZvcgotICAgICAqIHRoaXMgcHVycG9zZS4gSG93ZXZlciB0aGV5IGNvdWxkIGJlIGNhc3QgdG8gU2V0IG9yIExpc3Qgd2hpY2ggbWlnaHQgYmUKLSAgICAgKiB1bmRlc2lyYWJsZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IGltcGxlbWVudHMgQ29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRU1QVFlfQ09MTEVDVElPTiA9IFVubW9kaWZpYWJsZUNvbGxlY3Rpb24uZGVjb3JhdGUobmV3IEFycmF5TGlzdCgpKTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPkNvbGxlY3Rpb25VdGlsczwvY29kZT4gc2hvdWxkIG5vdCBub3JtYWxseSBiZSBpbnN0YW50aWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb25VdGlscygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbGxlY3Rpb259IGNvbnRhaW5pbmcgdGhlIHVuaW9uCi0gICAgICogb2YgdGhlIGdpdmVuIHtAbGluayBDb2xsZWN0aW9ufXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhcmRpbmFsaXR5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgcmV0dXJuZWQge0BsaW5rIENvbGxlY3Rpb259Ci0gICAgICogd2lsbCBiZSBlcXVhbCB0byB0aGUgbWF4aW11bSBvZiB0aGUgY2FyZGluYWxpdHkgb2YgdGhhdCBlbGVtZW50Ci0gICAgICogaW4gdGhlIHR3byBnaXZlbiB7QGxpbmsgQ29sbGVjdGlvbn1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGEgIHRoZSBmaXJzdCBjb2xsZWN0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGIgIHRoZSBzZWNvbmQgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gIHRoZSB1bmlvbiBvZiB0aGUgdHdvIGNvbGxlY3Rpb25zCi0gICAgICogQHNlZSBDb2xsZWN0aW9uI2FkZEFsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiB1bmlvbihmaW5hbCBDb2xsZWN0aW9uIGEsIGZpbmFsIENvbGxlY3Rpb24gYikgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIG1hcGEgPSBnZXRDYXJkaW5hbGl0eU1hcChhKTsKLSAgICAgICAgTWFwIG1hcGIgPSBnZXRDYXJkaW5hbGl0eU1hcChiKTsKLSAgICAgICAgU2V0IGVsdHMgPSBuZXcgSGFzaFNldChhKTsKLSAgICAgICAgZWx0cy5hZGRBbGwoYik7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZWx0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MCxtPU1hdGgubWF4KGdldEZyZXEob2JqLG1hcGEpLGdldEZyZXEob2JqLG1hcGIpKTtpPG07aSsrKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbGxlY3Rpb259IGNvbnRhaW5pbmcgdGhlIGludGVyc2VjdGlvbgotICAgICAqIG9mIHRoZSBnaXZlbiB7QGxpbmsgQ29sbGVjdGlvbn1zLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYXJkaW5hbGl0eSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIHtAbGluayBDb2xsZWN0aW9ufQotICAgICAqIHdpbGwgYmUgZXF1YWwgdG8gdGhlIG1pbmltdW0gb2YgdGhlIGNhcmRpbmFsaXR5IG9mIHRoYXQgZWxlbWVudAotICAgICAqIGluIHRoZSB0d28gZ2l2ZW4ge0BsaW5rIENvbGxlY3Rpb259cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhICB0aGUgZmlyc3QgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBiICB0aGUgc2Vjb25kIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBjb2xsZWN0aW9ucwotICAgICAqIEBzZWUgQ29sbGVjdGlvbiNyZXRhaW5BbGwKLSAgICAgKiBAc2VlICNjb250YWluc0FueQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBpbnRlcnNlY3Rpb24oZmluYWwgQ29sbGVjdGlvbiBhLCBmaW5hbCBDb2xsZWN0aW9uIGIpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXBhID0gZ2V0Q2FyZGluYWxpdHlNYXAoYSk7Ci0gICAgICAgIE1hcCBtYXBiID0gZ2V0Q2FyZGluYWxpdHlNYXAoYik7Ci0gICAgICAgIFNldCBlbHRzID0gbmV3IEhhc2hTZXQoYSk7Ci0gICAgICAgIGVsdHMuYWRkQWxsKGIpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGVsdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgZm9yKGludCBpPTAsbT1NYXRoLm1pbihnZXRGcmVxKG9iaixtYXBhKSxnZXRGcmVxKG9iaixtYXBiKSk7aTxtO2krKykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBDb2xsZWN0aW9ufSBjb250YWluaW5nIHRoZSBleGNsdXNpdmUgZGlzanVuY3Rpb24KLSAgICAgKiAoc3ltbWV0cmljIGRpZmZlcmVuY2UpIG9mIHRoZSBnaXZlbiB7QGxpbmsgQ29sbGVjdGlvbn1zLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYXJkaW5hbGl0eSBvZiBlYWNoIGVsZW1lbnQgPGk+ZTwvaT4gaW4gdGhlIHJldHVybmVkIHtAbGluayBDb2xsZWN0aW9ufQotICAgICAqIHdpbGwgYmUgZXF1YWwgdG8KLSAgICAgKiA8dHQ+bWF4KGNhcmRpbmFsaXR5KDxpPmU8L2k+LDxpPmE8L2k+KSxjYXJkaW5hbGl0eSg8aT5lPC9pPiw8aT5iPC9pPikpIC0gbWluKGNhcmRpbmFsaXR5KDxpPmU8L2k+LDxpPmE8L2k+KSxjYXJkaW5hbGl0eSg8aT5lPC9pPiw8aT5iPC9pPikpPC90dD4uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICAgICogPHR0PntAbGluayAjc3VidHJhY3Qgc3VidHJhY3R9KHtAbGluayAjdW5pb24gdW5pb24oYSxiKX0se0BsaW5rICNpbnRlcnNlY3Rpb24gaW50ZXJzZWN0aW9uKGEsYil9KTwvdHQ+Ci0gICAgICogb3IKLSAgICAgKiA8dHQ+e0BsaW5rICN1bmlvbiB1bmlvbn0oe0BsaW5rICNzdWJ0cmFjdCBzdWJ0cmFjdChhLGIpfSx7QGxpbmsgI3N1YnRyYWN0IHN1YnRyYWN0KGIsYSl9KTwvdHQ+LgotICAgICAqCi0gICAgICogQHBhcmFtIGEgIHRoZSBmaXJzdCBjb2xsZWN0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGIgIHRoZSBzZWNvbmQgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHRoZSB0d28gY29sbGVjdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZGlzanVuY3Rpb24oZmluYWwgQ29sbGVjdGlvbiBhLCBmaW5hbCBDb2xsZWN0aW9uIGIpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXBhID0gZ2V0Q2FyZGluYWxpdHlNYXAoYSk7Ci0gICAgICAgIE1hcCBtYXBiID0gZ2V0Q2FyZGluYWxpdHlNYXAoYik7Ci0gICAgICAgIFNldCBlbHRzID0gbmV3IEhhc2hTZXQoYSk7Ci0gICAgICAgIGVsdHMuYWRkQWxsKGIpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGVsdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgZm9yKGludCBpPTAsbT0oKE1hdGgubWF4KGdldEZyZXEob2JqLG1hcGEpLGdldEZyZXEob2JqLG1hcGIpKSktKE1hdGgubWluKGdldEZyZXEob2JqLG1hcGEpLGdldEZyZXEob2JqLG1hcGIpKSkpO2k8bTtpKyspIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChvYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIENvbGxlY3Rpb259IGNvbnRhaW5pbmcgPHR0PjxpPmE8L2k+IC0gPGk+YjwvaT48L3R0Pi4KLSAgICAgKiBUaGUgY2FyZGluYWxpdHkgb2YgZWFjaCBlbGVtZW50IDxpPmU8L2k+IGluIHRoZSByZXR1cm5lZCB7QGxpbmsgQ29sbGVjdGlvbn0KLSAgICAgKiB3aWxsIGJlIHRoZSBjYXJkaW5hbGl0eSBvZiA8aT5lPC9pPiBpbiA8aT5hPC9pPiBtaW51cyB0aGUgY2FyZGluYWxpdHkKLSAgICAgKiBvZiA8aT5lPC9pPiBpbiA8aT5iPC9pPiwgb3IgemVybywgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYSAgdGhlIGNvbGxlY3Rpb24gdG8gc3VidHJhY3QgZnJvbSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBiICB0aGUgY29sbGVjdGlvbiB0byBzdWJ0cmFjdCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgY29sbGVjdGlvbiB3aXRoIHRoZSByZXN1bHRzCi0gICAgICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZUFsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBzdWJ0cmFjdChmaW5hbCBDb2xsZWN0aW9uIGEsIGZpbmFsIENvbGxlY3Rpb24gYikgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoIGEgKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXQubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpcyBpbiBib3RoIGNvbGxlY3Rpb25zLgotICAgICAqIDxwPgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUKLSAgICAgKiB7QGxpbmsgI2ludGVyc2VjdGlvbn0gb2YgPGk+Y29sbDE8L2k+IGFuZCA8aT5jb2xsMjwvaT4gaXMgbm90IGVtcHR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsMSAgdGhlIGZpcnN0IGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gY29sbDIgIHRoZSBmaXJzdCBjb2xsZWN0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgY29sbGVjdGlvbnMgaXMgbm9uLWVtcHR5Ci0gICAgICogQHNpbmNlIDIuMQotICAgICAqIEBzZWUgI2ludGVyc2VjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FueShmaW5hbCBDb2xsZWN0aW9uIGNvbGwxLCBmaW5hbCBDb2xsZWN0aW9uIGNvbGwyKSB7Ci0gICAgICAgIGlmIChjb2xsMS5zaXplKCkgPCBjb2xsMi5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb2xsMS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbGwyLmNvbnRhaW5zKGl0Lm5leHQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoY29sbDEuY29udGFpbnMoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgTWFwfSBtYXBwaW5nIGVhY2ggdW5pcXVlIGVsZW1lbnQgaW4gdGhlIGdpdmVuCi0gICAgICoge0BsaW5rIENvbGxlY3Rpb259IHRvIGFuIHtAbGluayBJbnRlZ2VyfSByZXByZXNlbnRpbmcgdGhlIG51bWJlcgotICAgICAqIG9mIG9jY3VycmVuY2VzIG9mIHRoYXQgZWxlbWVudCBpbiB0aGUge0BsaW5rIENvbGxlY3Rpb259LgotICAgICAqIDxwPgotICAgICAqIE9ubHkgdGhvc2UgZWxlbWVudHMgcHJlc2VudCBpbiB0aGUgY29sbGVjdGlvbiB3aWxsIGFwcGVhciBhcwotICAgICAqIGtleXMgaW4gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gZ2V0IHRoZSBjYXJkaW5hbGl0eSBtYXAgZm9yLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgcG9wdWxhdGVkIGNhcmRpbmFsaXR5IG1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldENhcmRpbmFsaXR5TWFwKGZpbmFsIENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBNYXAgY291bnQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgSW50ZWdlciBjID0gKEludGVnZXIpIChjb3VudC5nZXQob2JqKSk7Ci0gICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY291bnQucHV0KG9iaixJTlRFR0VSX09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvdW50LnB1dChvYmosbmV3IEludGVnZXIoYy5pbnRWYWx1ZSgpICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWZmIDxpPmE8L2k+IGlzIGEgc3ViLWNvbGxlY3Rpb24gb2YgPGk+YjwvaT4sCi0gICAgICogdGhhdCBpcywgaWZmIHRoZSBjYXJkaW5hbGl0eSBvZiA8aT5lPC9pPiBpbiA8aT5hPC9pPiBpcyBsZXNzCi0gICAgICogdGhhbiBvciBlcXVhbCB0byB0aGUgY2FyZGluYWxpdHkgb2YgPGk+ZTwvaT4gaW4gPGk+YjwvaT4sCi0gICAgICogZm9yIGVhY2ggZWxlbWVudCA8aT5lPC9pPiBpbiA8aT5hPC9pPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhICB0aGUgZmlyc3QgKHN1Yj8pIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gYiAgdGhlIHNlY29uZCAoc3VwZXI/KSBjb2xsZWN0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGk+YTwvaT4gaXMgYSBzdWItY29sbGVjdGlvbiBvZiA8aT5iPC9pPgotICAgICAqIEBzZWUgI2lzUHJvcGVyU3ViQ29sbGVjdGlvbgotICAgICAqIEBzZWUgQ29sbGVjdGlvbiNjb250YWluc0FsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YkNvbGxlY3Rpb24oZmluYWwgQ29sbGVjdGlvbiBhLCBmaW5hbCBDb2xsZWN0aW9uIGIpIHsKLSAgICAgICAgTWFwIG1hcGEgPSBnZXRDYXJkaW5hbGl0eU1hcChhKTsKLSAgICAgICAgTWFwIG1hcGIgPSBnZXRDYXJkaW5hbGl0eU1hcChiKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBhLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZ2V0RnJlcShvYmosIG1hcGEpID4gZ2V0RnJlcShvYmosIG1hcGIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZmYgPGk+YTwvaT4gaXMgYSA8aT5wcm9wZXI8L2k+IHN1Yi1jb2xsZWN0aW9uIG9mIDxpPmI8L2k+LAotICAgICAqIHRoYXQgaXMsIGlmZiB0aGUgY2FyZGluYWxpdHkgb2YgPGk+ZTwvaT4gaW4gPGk+YTwvaT4gaXMgbGVzcwotICAgICAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNhcmRpbmFsaXR5IG9mIDxpPmU8L2k+IGluIDxpPmI8L2k+LAotICAgICAqIGZvciBlYWNoIGVsZW1lbnQgPGk+ZTwvaT4gaW4gPGk+YTwvaT4sIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLSAgICAgKiBlbGVtZW50IDxpPmY8L2k+IHN1Y2ggdGhhdCB0aGUgY2FyZGluYWxpdHkgb2YgPGk+ZjwvaT4gaW4gPGk+YjwvaT4KLSAgICAgKiBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhlIGNhcmRpbmFsaXR5IG9mIDxpPmY8L2k+IGluIDxpPmE8L2k+LgotICAgICAqIDxwPgotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzCi0gICAgICogPHVsPgotICAgICAqICAgIDxsaT48Y29kZT5hLnNpemUoKTwvY29kZT4gYW5kIDxjb2RlPmIuc2l6ZSgpPC9jb2RlPiByZXByZXNlbnQgdGhlIAotICAgICAqICAgIHRvdGFsIGNhcmRpbmFsaXR5IG9mIDxpPmE8L2k+IGFuZCA8aT5iPC9pPiwgcmVzcC4gPC9saT4KLSAgICAgKiAgICA8bGk+PGNvZGU+YS5zaXplKCkgPCBJbnRlZ2VyLk1BWFZBTFVFPC9jb2RlPjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhICB0aGUgZmlyc3QgKHN1Yj8pIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gYiAgdGhlIHNlY29uZCAoc3VwZXI/KSBjb2xsZWN0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGk+YTwvaT4gaXMgYSA8aT5wcm9wZXI8L2k+IHN1Yi1jb2xsZWN0aW9uIG9mIDxpPmI8L2k+Ci0gICAgICogQHNlZSAjaXNTdWJDb2xsZWN0aW9uCi0gICAgICogQHNlZSBDb2xsZWN0aW9uI2NvbnRhaW5zQWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvcGVyU3ViQ29sbGVjdGlvbihmaW5hbCBDb2xsZWN0aW9uIGEsIGZpbmFsIENvbGxlY3Rpb24gYikgewotICAgICAgICByZXR1cm4gKGEuc2l6ZSgpIDwgYi5zaXplKCkpICYmIENvbGxlY3Rpb25VdGlscy5pc1N1YkNvbGxlY3Rpb24oYSxiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWZmIHRoZSBnaXZlbiB7QGxpbmsgQ29sbGVjdGlvbn1zIGNvbnRhaW4KLSAgICAgKiBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIHdpdGggZXhhY3RseSB0aGUgc2FtZSBjYXJkaW5hbGl0aWVzLgotICAgICAqIDxwPgotICAgICAqIFRoYXQgaXMsIGlmZiB0aGUgY2FyZGluYWxpdHkgb2YgPGk+ZTwvaT4gaW4gPGk+YTwvaT4gaXMKLSAgICAgKiBlcXVhbCB0byB0aGUgY2FyZGluYWxpdHkgb2YgPGk+ZTwvaT4gaW4gPGk+YjwvaT4sCi0gICAgICogZm9yIGVhY2ggZWxlbWVudCA8aT5lPC9pPiBpbiA8aT5hPC9pPiBvciA8aT5iPC9pPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhICB0aGUgZmlyc3QgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBiICB0aGUgc2Vjb25kIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgY29sbGVjdGlvbnMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGNhcmRpbmFsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXF1YWxDb2xsZWN0aW9uKGZpbmFsIENvbGxlY3Rpb24gYSwgZmluYWwgQ29sbGVjdGlvbiBiKSB7Ci0gICAgICAgIGlmKGEuc2l6ZSgpICE9IGIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNYXAgbWFwYSA9IGdldENhcmRpbmFsaXR5TWFwKGEpOwotICAgICAgICAgICAgTWFwIG1hcGIgPSBnZXRDYXJkaW5hbGl0eU1hcChiKTsKLSAgICAgICAgICAgIGlmKG1hcGEuc2l6ZSgpICE9IG1hcGIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcGEua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoZ2V0RnJlcShvYmosbWFwYSkgIT0gZ2V0RnJlcShvYmosbWFwYikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiA8aT5vYmo8L2k+IGluIDxpPmNvbGw8L2k+LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBjYXJkaW5hbGl0eSBvZgotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIG9iaiBpbiBjb2xsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY2FyZGluYWxpdHkoT2JqZWN0IG9iaiwgZmluYWwgQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGlmIChjb2xsIGluc3RhbmNlb2YgU2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvbGwuY29udGFpbnMob2JqKSA/IDEgOiAwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sbCBpbnN0YW5jZW9mIEJhZykgewotICAgICAgICAgICAgcmV0dXJuICgoQmFnKSBjb2xsKS5nZXRDb3VudChvYmopOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTtpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0Lm5leHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTtpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iai5lcXVhbHMoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgY29sbGVjdGlvbiBvciBwcmVkaWNhdGUgaXMgbnVsbCwgb3Igbm8gZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiAKLSAgICAgKiBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gc2VhcmNoLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlLCBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2hpY2ggbWF0Y2hlcyB0aGUgcHJlZGljYXRlIG9yIG51bGwgaWYgbm9uZSBjb3VsZCBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgcHJlZGljYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlLmV2YWx1YXRlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjbG9zdXJlIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgY29sbGVjdGlvbiBvciBjbG9zdXJlIGlzIG51bGwsIHRoZXJlIGlzIG5vIGNoYW5nZSBtYWRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBnZXQgdGhlIGlucHV0IGZyb20sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGNsb3N1cmUgIHRoZSBjbG9zdXJlIHRvIHBlcmZvcm0sIG1heSBiZSBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvckFsbERvKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY2xvc3VyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgY2xvc3VyZS5leGVjdXRlKGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogRmlsdGVyIHRoZSBjb2xsZWN0aW9uIGJ5IGFwcGx5aW5nIGEgUHJlZGljYXRlIHRvIGVhY2ggZWxlbWVudC4gSWYgdGhlCi0gICAgICogcHJlZGljYXRlIHJldHVybnMgZmFsc2UsIHJlbW92ZSB0aGUgZWxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgY29sbGVjdGlvbiBvciBwcmVkaWNhdGUgaXMgbnVsbCwgdGhlcmUgaXMgbm8gY2hhbmdlIG1hZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIGdldCB0aGUgaW5wdXQgZnJvbSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBhcyBhIGZpbHRlciwgbWF5IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsdGVyKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIHByZWRpY2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5ldmFsdWF0ZShpdC5uZXh0KCkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUcmFuc2Zvcm0gdGhlIGNvbGxlY3Rpb24gYnkgYXBwbHlpbmcgYSBUcmFuc2Zvcm1lciB0byBlYWNoIGVsZW1lbnQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGlucHV0IGNvbGxlY3Rpb24gb3IgdHJhbnNmb3JtZXIgaXMgbnVsbCwgdGhlcmUgaXMgbm8gY2hhbmdlIG1hZGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByb3V0aW5lIGlzIGJlc3QgZm9yIExpc3RzLCBmb3Igd2hpY2ggc2V0KCkgaXMgdXNlZCB0byBkbyB0aGUgCi0gICAgICogdHJhbnNmb3JtYXRpb25zICJpbiBwbGFjZS4iICBGb3Igb3RoZXIgQ29sbGVjdGlvbnMsIGNsZWFyKCkgYW5kIGFkZEFsbCgpCi0gICAgICogYXJlIHVzZWQgdG8gcmVwbGFjZSBlbGVtZW50cy4gIAotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGNvbnRyb2xzIGl0cyBpbnB1dCwgc3VjaCBhcyBhIFNldCwgYW5kIHRoZQotICAgICAqIFRyYW5zZm9ybWVyIGNyZWF0ZXMgZHVwbGljYXRlcyAob3IgYXJlIG90aGVyd2lzZSBpbnZhbGlkKSwgdGhlIAotICAgICAqIGNvbGxlY3Rpb24gbWF5IHJlZHVjZSBpbiBzaXplIGR1ZSB0byBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBnZXQgdGhlIGlucHV0IGZyb20sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gcGVyZm9ybSwgbWF5IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0cmFuc2Zvcm1lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgY29sbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBmb3IgKExpc3RJdGVyYXRvciBpdCA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgaXQuc2V0KHRyYW5zZm9ybWVyLnRyYW5zZm9ybShpdC5uZXh0KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcmVzdWx0Q29sbGVjdGlvbiA9IGNvbGxlY3QoY29sbGVjdGlvbiwgdHJhbnNmb3JtZXIpOwotICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZEFsbChyZXN1bHRDb2xsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgY29sbGVjdGlvbiB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuCi0gICAgICogPHA+Ci0gICAgICogQSA8Y29kZT5udWxsPC9jb2RlPiBjb2xsZWN0aW9uIG9yIHByZWRpY2F0ZSBtYXRjaGVzIG5vIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dENvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIGdldCB0aGUgaW5wdXQgZnJvbSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3IgdGhlIHByZWRpY2F0ZSBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50TWF0Y2hlcyhDb2xsZWN0aW9uIGlucHV0Q29sbGVjdGlvbiwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAoaW5wdXRDb2xsZWN0aW9uICE9IG51bGwgJiYgcHJlZGljYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpbnB1dENvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuZXZhbHVhdGUoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEFuc3dlcnMgdHJ1ZSBpZiBhIHByZWRpY2F0ZSBpcyB0cnVlIGZvciBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogQSA8Y29kZT5udWxsPC9jb2RlPiBjb2xsZWN0aW9uIG9yIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIHRoZSBjb2xsZWN0aW9uIHRvIGdldCB0aGUgaW5wdXQgZnJvbSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBwcmVkaWNhdGUgdG8gdXNlLCBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiBtYXRjaGVzIHRoZSBwcmVkaWNhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhpc3RzKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIHByZWRpY2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5ldmFsdWF0ZShpdC5uZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIGZyb20gaW5wdXQgY29sbGVjdGlvbiB3aGljaCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlCi0gICAgICogaW50byBhbiBvdXRwdXQgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBBIDxjb2RlPm51bGw8L2NvZGU+IHByZWRpY2F0ZSBtYXRjaGVzIG5vIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dENvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIGdldCB0aGUgaW5wdXQgZnJvbSwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHByZWRpY2F0ZSAobmV3IGxpc3QpCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHNlbGVjdChDb2xsZWN0aW9uIGlucHV0Q29sbGVjdGlvbiwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBBcnJheUxpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdChpbnB1dENvbGxlY3Rpb24uc2l6ZSgpKTsKLSAgICAgICAgc2VsZWN0KGlucHV0Q29sbGVjdGlvbiwgcHJlZGljYXRlLCBhbnN3ZXIpOwotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBmcm9tIGlucHV0IGNvbGxlY3Rpb24gd2hpY2ggbWF0Y2ggdGhlIGdpdmVuIHByZWRpY2F0ZQotICAgICAqIGFuZCBhZGRzIHRoZW0gdG8gb3V0cHV0Q29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgY29sbGVjdGlvbiBvciBwcmVkaWNhdGUgaXMgbnVsbCwgdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHRoZSAKLSAgICAgKiBvdXRwdXQgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXRDb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBnZXQgdGhlIGlucHV0IGZyb20sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIG91dHB1dENvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIG91dHB1dCBpbnRvLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0KENvbGxlY3Rpb24gaW5wdXRDb2xsZWN0aW9uLCBQcmVkaWNhdGUgcHJlZGljYXRlLCBDb2xsZWN0aW9uIG91dHB1dENvbGxlY3Rpb24pIHsKLSAgICAgICAgaWYgKGlucHV0Q29sbGVjdGlvbiAhPSBudWxsICYmIHByZWRpY2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbnB1dENvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlLmV2YWx1YXRlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dENvbGxlY3Rpb24uYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBmcm9tIGlucHV0Q29sbGVjdGlvbiB3aGljaCBkb24ndCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlCi0gICAgICogaW50byBhbiBvdXRwdXQgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgcHJlZGljYXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlucHV0Q29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gZ2V0IHRoZSBpbnB1dCBmcm9tLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50cyA8Yj5ub3Q8L2I+IG1hdGNoaW5nIHRoZSBwcmVkaWNhdGUgKG5ldyBsaXN0KQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGlucHV0IGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBzZWxlY3RSZWplY3RlZChDb2xsZWN0aW9uIGlucHV0Q29sbGVjdGlvbiwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBBcnJheUxpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdChpbnB1dENvbGxlY3Rpb24uc2l6ZSgpKTsKLSAgICAgICAgc2VsZWN0UmVqZWN0ZWQoaW5wdXRDb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGFuc3dlcik7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBmcm9tIGlucHV0Q29sbGVjdGlvbiB3aGljaCBkb24ndCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlCi0gICAgICogYW5kIGFkZHMgdGhlbSB0byBvdXRwdXRDb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbnB1dCBwcmVkaWNhdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIG5vIGVsZW1lbnRzIGFyZSBhZGRlZCB0byA8Y29kZT5vdXRwdXRDb2xsZWN0aW9uPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXRDb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBnZXQgdGhlIGlucHV0IGZyb20sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIG91dHB1dENvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIG91dHB1dCBpbnRvLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0UmVqZWN0ZWQoQ29sbGVjdGlvbiBpbnB1dENvbGxlY3Rpb24sIFByZWRpY2F0ZSBwcmVkaWNhdGUsIENvbGxlY3Rpb24gb3V0cHV0Q29sbGVjdGlvbikgewotICAgICAgICBpZiAoaW5wdXRDb2xsZWN0aW9uICE9IG51bGwgJiYgcHJlZGljYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGlucHV0Q29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuZXZhbHVhdGUoaXRlbSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29sbGVjdGlvbi5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBSZXR1cm5zIGEgbmV3IENvbGxlY3Rpb24gY29uc2lzdGluZyBvZiB0aGUgZWxlbWVudHMgb2YgaW5wdXRDb2xsZWN0aW9uIHRyYW5zZm9ybWVkCi0gICAgICogYnkgdGhlIGdpdmVuIHRyYW5zZm9ybWVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbnB1dCB0cmFuc2Zvcm1lciBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlucHV0Q29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gZ2V0IHRoZSBpbnB1dCBmcm9tLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgcmVzdWx0IChuZXcgbGlzdCkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gY29sbGVjdChDb2xsZWN0aW9uIGlucHV0Q29sbGVjdGlvbiwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgQXJyYXlMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoaW5wdXRDb2xsZWN0aW9uLnNpemUoKSk7Ci0gICAgICAgIGNvbGxlY3QoaW5wdXRDb2xsZWN0aW9uLCB0cmFuc2Zvcm1lciwgYW5zd2VyKTsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRyYW5zZm9ybXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0SXRlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdHJhbnNmb3JtZXIgCi0gICAgICogYW5kIGFkZHMgdGhlbSB0byB0aGUgb3V0cHV0Q29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgaXRlcmF0b3Igb3IgdHJhbnNmb3JtZXIgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dEl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZ2V0IHRoZSBpbnB1dCBmcm9tLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQgKG5ldyBsaXN0KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBjb2xsZWN0KEl0ZXJhdG9yIGlucHV0SXRlcmF0b3IsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIEFycmF5TGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbGxlY3QoaW5wdXRJdGVyYXRvciwgdHJhbnNmb3JtZXIsIGFuc3dlcik7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBUcmFuc2Zvcm1zIGFsbCBlbGVtZW50cyBmcm9tIGlucHV0Q29sbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0cmFuc2Zvcm1lciAKLSAgICAgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSBvdXRwdXRDb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbnB1dCBjb2xsZWN0aW9uIG9yIHRyYW5zZm9ybWVyIGlzIG51bGwsIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB0aGUgCi0gICAgICogb3V0cHV0IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRDb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBnZXQgdGhlIGlucHV0IGZyb20sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBvdXRwdXRDb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBvdXRwdXQgaW50bywgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgb3V0cHV0Q29sbGVjdGlvbiB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBpbnB1dCBhZGRlZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG91dHB1dCBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gY29sbGVjdChDb2xsZWN0aW9uIGlucHV0Q29sbGVjdGlvbiwgZmluYWwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsIGZpbmFsIENvbGxlY3Rpb24gb3V0cHV0Q29sbGVjdGlvbikgewotICAgICAgICBpZiAoaW5wdXRDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0KGlucHV0Q29sbGVjdGlvbi5pdGVyYXRvcigpLCB0cmFuc2Zvcm1lciwgb3V0cHV0Q29sbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dENvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRyYW5zZm9ybXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0SXRlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdHJhbnNmb3JtZXIgCi0gICAgICogYW5kIGFkZHMgdGhlbSB0byB0aGUgb3V0cHV0Q29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgaW5wdXQgaXRlcmF0b3Igb3IgdHJhbnNmb3JtZXIgaXMgbnVsbCwgdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHRoZSAKLSAgICAgKiBvdXRwdXQgY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dEl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZ2V0IHRoZSBpbnB1dCBmcm9tLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gb3V0cHV0Q29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gb3V0cHV0IGludG8sIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIG91dHB1dENvbGxlY3Rpb24gd2l0aCB0aGUgdHJhbnNmb3JtZWQgaW5wdXQgYWRkZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBvdXRwdXQgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGNvbGxlY3QoSXRlcmF0b3IgaW5wdXRJdGVyYXRvciwgZmluYWwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsIGZpbmFsIENvbGxlY3Rpb24gb3V0cHV0Q29sbGVjdGlvbikgewotICAgICAgICBpZiAoaW5wdXRJdGVyYXRvciAhPSBudWxsICYmIHRyYW5zZm9ybWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbnB1dEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaW5wdXRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG91dHB1dENvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0cHV0Q29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBjb2xsZWN0aW9uIHVubGVzcyB0aGUgZWxlbWVudCBpcyBudWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBhZGQgdG8sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGFkZCwgaWYgbnVsbCBpdCB3aWxsIG5vdCBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFkZElnbm9yZU51bGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiAob2JqZWN0ID09IG51bGwgPyBmYWxzZSA6IGNvbGxlY3Rpb24uYWRkKG9iamVjdCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCBlbGVtZW50cyBpbiB0aGUgaXRlcmF0aW9uIHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBhZGQgdG8sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciBvZiBlbGVtZW50cyB0byBhZGQsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIG9yIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCBlbGVtZW50cyBpbiB0aGUgZW51bWVyYXRpb24gdG8gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0bywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBlbnVtZXJhdGlvbiAgdGhlIGVudW1lcmF0aW9uIG9mIGVsZW1lbnRzIHRvIGFkZCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gb3IgZW51bWVyYXRpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikgewotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKiogCi0gICAgICogQWRkcyBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5IHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBhZGQgdG8sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBhZGQsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIG9yIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYW4gT2JqZWN0LCBhbmQgYW4gaW5kZXgsIHJldHVybnMgdGhlIG50aCB2YWx1ZSBpbiB0aGUKLSAgICAgKiBvYmplY3QuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiBvYmogaXMgYSBNYXAsIHJldHVybnMgdGhlIG50aCB2YWx1ZSBmcm9tIHRoZSA8Yj5rZXlTZXQ8L2I+IGl0ZXJhdG9yLCB1bmxlc3MgCi0gICAgICogICAgIHRoZSBNYXAgY29udGFpbnMgYW4gSW50ZWdlciBrZXkgd2l0aCBpbnRlZ2VyIHZhbHVlID0gaWR4LCBpbiB3aGljaCBjYXNlIHRoZQotICAgICAqICAgICBjb3JyZXNwb25kaW5nIG1hcCBlbnRyeSB2YWx1ZSBpcyByZXR1cm5lZC4gIElmIGlkeCBleGNlZWRzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAqICAgICB0aGUgbWFwLCBhbiBlbXB0eSBJdGVyYXRvciBpcyByZXR1cm5lZC4KLSAgICAgKiA8bGk+SWYgb2JqIGlzIGEgTGlzdCBvciBhbiBhcnJheSwgcmV0dXJucyB0aGUgbnRoIHZhbHVlLCB0aHJvd2luZyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLAotICAgICAqICAgICBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIHJlc3AuIGlmIHRoZSBudGggdmFsdWUgZG9lcyBub3QgZXhpc3QuCi0gICAgICogPGxpPklmIG9iaiBpcyBhbiBpdGVyYXRvciwgZW51bWVyYXRpb24gb3IgQ29sbGVjdGlvbiwgcmV0dXJucyB0aGUgbnRoIHZhbHVlIGZyb20gdGhlIGl0ZXJhdG9yLAotICAgICAqICAgICByZXR1cm5pbmcgYW4gZW1wdHkgSXRlcmF0b3IgKHJlc3AuIEVudW1lcmF0aW9uKSBpZiB0aGUgbnRoIHZhbHVlIGRvZXMgbm90IGV4aXN0LgotICAgICAqIDxsaT5SZXR1cm5zIHRoZSBvcmlnaW5hbCBvYmogaWYgaXQgaXMgbnVsbCBvciBub3QgYSBDb2xsZWN0aW9uIG9yIEl0ZXJhdG9yLgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBnZXQgYW4gaW5kZXggb2YsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGlkeCAgdGhlIGluZGV4IHRvIGdldAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXQoT2JqZWN0LCBpbnQpfSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjQuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluZGV4KE9iamVjdCBvYmosIGludCBpZHgpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4KG9iaiwgbmV3IEludGVnZXIoaWR4KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdpdmVuIGFuIE9iamVjdCwgYW5kIGEga2V5IChpbmRleCksIHJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoYXQga2V5IGluIHRoZSBPYmplY3QuIFRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZSBtYWRlOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+SWYgb2JqIGlzIGEgTWFwLCB1c2UgdGhlIGluZGV4IGFzIGEga2V5IHRvIGdldCBhIHZhbHVlLiBJZiBubyBtYXRjaCBjb250aW51ZS4KLSAgICAgKiA8bGk+Q2hlY2sga2V5IGlzIGFuIEludGVnZXIuIElmIG5vdCwgcmV0dXJuIHRoZSBvYmplY3QgcGFzc2VkIGluLgotICAgICAqIDxsaT5JZiBvYmogaXMgYSBNYXAsIGdldCB0aGUgbnRoIHZhbHVlIGZyb20gdGhlIDxiPmtleVNldDwvYj4gaXRlcmF0b3IuCi0gICAgICogICAgIElmIHRoZSBNYXAgaGFzIGZld2VyIHRoYW4gbiBlbnRyaWVzLCByZXR1cm4gYW4gZW1wdHkgSXRlcmF0b3IuCi0gICAgICogPGxpPklmIG9iaiBpcyBhIExpc3Qgb3IgYW4gYXJyYXksIGdldCB0aGUgbnRoIHZhbHVlLCB0aHJvd2luZyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLAotICAgICAqICAgICBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIHJlc3AuIGlmIHRoZSBudGggdmFsdWUgZG9lcyBub3QgZXhpc3QuCi0gICAgICogPGxpPklmIG9iaiBpcyBhbiBpdGVyYXRvciwgZW51bWVyYXRpb24gb3IgQ29sbGVjdGlvbiwgZ2V0IHRoZSBudGggdmFsdWUgZnJvbSB0aGUgaXRlcmF0b3IsCi0gICAgICogICAgIHJldHVybmluZyBhbiBlbXB0eSBJdGVyYXRvciAocmVzcC4gRW51bWVyYXRpb24pIGlmIHRoZSBudGggdmFsdWUgZG9lcyBub3QgZXhpc3QuCi0gICAgICogPGxpPlJldHVybiB0aGUgb3JpZ2luYWwgb2JqLgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBnZXQgYW4gaW5kZXggb2YKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBnZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXQoT2JqZWN0LCBpbnQpfSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjQuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluZGV4KE9iamVjdCBvYmosIE9iamVjdCBpbmRleCkgewotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKW9iajsKLSAgICAgICAgICAgIGlmKG1hcC5jb250YWluc0tleShpbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFwLmdldChpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGlkeCA9IC0xOwotICAgICAgICBpZihpbmRleCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIGlkeCA9ICgoSW50ZWdlcilpbmRleCkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZihpZHggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9IAotICAgICAgICBlbHNlIGlmKG9iaiBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApb2JqOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBpbmRleChpdGVyYXRvciwgaWR4KTsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZSBpZihvYmogaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChMaXN0KW9iaikuZ2V0KGlkeCk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYob2JqIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIHJldHVybiAoKE9iamVjdFtdKW9iailbaWR4XTsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZSBpZihvYmogaW5zdGFuY2VvZiBFbnVtZXJhdGlvbikgewotICAgICAgICAgICAgRW51bWVyYXRpb24gaXQgPSAoRW51bWVyYXRpb24pb2JqOwotICAgICAgICAgICAgd2hpbGUoaXQuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZHgtLTsKLSAgICAgICAgICAgICAgICBpZihpZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0Lm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXQubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYob2JqIGluc3RhbmNlb2YgSXRlcmF0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleCgoSXRlcmF0b3Ipb2JqLCBpZHgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYob2JqIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pb2JqKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgcmV0dXJuIGluZGV4KGl0ZXJhdG9yLCBpZHgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGluZGV4KEl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgaWR4KSB7Ci0gICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaWR4LS07Ci0gICAgICAgICAgICBpZihpZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4tdGggdmFsdWUgaW4gPGNvZGU+b2JqZWN0PC9jb2RlPiwgdGhyb3dpbmcKLSAgICAgKiA8Y29kZT5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnQgb3IgCi0gICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG5vdCBhbiAKLSAgICAgKiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIHN1cHBvcnRlZCB0eXBlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3VwcG9ydGVkIHR5cGVzLCBhbmQgYXNzb2NpYXRlZCBzZW1hbnRpY3MgYXJlOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IE1hcCAtLSB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gaW4gcG9zaXRpb24gCi0gICAgICogICAgICA8Y29kZT5pbmRleDwvY29kZT4gaW4gdGhlIG1hcCdzIDxjb2RlPmVudHJ5U2V0PC9jb2RlPiBpdGVyYXRvciwgCi0gICAgICogICAgICBpZiB0aGVyZSBpcyBzdWNoIGFuIGVudHJ5LjwvbGk+Ci0gICAgICogPGxpPiBMaXN0IC0tIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGxpc3QncyBnZXQgbWV0aG9kLjwvbGk+Ci0gICAgICogPGxpPiBBcnJheSAtLSB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+LXRoIGFycmF5IGVudHJ5IGlzIHJldHVybmVkLCAKLSAgICAgKiAgICAgIGlmIHRoZXJlIGlzIHN1Y2ggYW4gZW50cnk7IG90aGVyd2lzZSBhbiA8Y29kZT5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPgotICAgICAqICAgICAgaXMgdGhyb3duLjwvbGk+Ci0gICAgICogPGxpPiBDb2xsZWN0aW9uIC0tIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+LXRoIG9iamVjdCAKLSAgICAgKiAgICAgIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgZGVmYXVsdCBpdGVyYXRvciwgaWYgdGhlcmUgaXMgc3VjaCBhbiBlbGVtZW50LjwvbGk+Ci0gICAgICogPGxpPiBJdGVyYXRvciBvciBFbnVtZXJhdGlvbiAtLSB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlCi0gICAgICogICAgICA8Y29kZT5pbmRleDwvY29kZT4tdGggb2JqZWN0IGluIHRoZSBJdGVyYXRvci9FbnVtZXJhdGlvbiwgaWYgdGhlcmUKLSAgICAgKiAgICAgIGlzIHN1Y2ggYW4gZWxlbWVudC4gIFRoZSBJdGVyYXRvci9FbnVtZXJhdGlvbiBpcyBhZHZhbmNlZCB0byAKLSAgICAgKiAgICAgIDxjb2RlPmluZGV4PC9jb2RlPiAob3IgdG8gdGhlIGVuZCwgaWYgPGNvZGU+aW5kZXg8L2NvZGU+IGV4Y2VlZHMgdGhlIAotICAgICAqICAgICAgbnVtYmVyIG9mIGVudHJpZXMpIGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBtZXRob2QuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gZ2V0IGEgdmFsdWUgZnJvbQotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGdldAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCB0eXBlIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleCBjYW5ub3QgYmUgbmVnYXRpdmU6ICIgKyBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG9iamVjdDsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXQoaXRlcmF0b3IsIGluZGV4KTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChMaXN0KSBvYmplY3QpLmdldChpbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIHJldHVybiAoKE9iamVjdFtdKSBvYmplY3QpW2luZGV4XTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVyYXRvcikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoSXRlcmF0b3IpIG9iamVjdDsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiRW50cnkgZG9lcyBub3QgZXhpc3Q6ICIgKyBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIG9iamVjdCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXQoaXRlcmF0b3IsIGluZGV4KTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbnVtZXJhdGlvbikgewotICAgICAgICAgICAgRW51bWVyYXRpb24gaXQgPSAoRW51bWVyYXRpb24pIG9iamVjdDsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0Lm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkVudHJ5IGRvZXMgbm90IGV4aXN0OiAiICsgaW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBvYmplY3QgdHlwZTogbnVsbCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZ2V0KG9iamVjdCwgaW5kZXgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGU6ICIgKyBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uL2l0ZXJhdG9yIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gaGFuZGxlcyBvYmplY3RzIGFzIGZvbGxvd3MKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkNvbGxlY3Rpb24gLSB0aGUgY29sbGVjdGlvbiBzaXplCi0gICAgICogPGxpPk1hcCAtIHRoZSBtYXAgc2l6ZQotICAgICAqIDxsaT5BcnJheSAtIHRoZSBhcnJheSBzaXplCi0gICAgICogPGxpPkl0ZXJhdG9yIC0gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGl0ZXJhdG9yCi0gICAgICogPGxpPkVudW1lcmF0aW9uIC0gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGVudW1lcmF0aW9uCi0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGdldCB0aGUgc2l6ZSBvZgotICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdGhyb3duIGlmIG9iamVjdCBpcyBub3QgcmVjb2duaXNlZCBvciBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIHRvdGFsID0gKChNYXApIG9iamVjdCkuc2l6ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIHRvdGFsID0gKChDb2xsZWN0aW9uKSBvYmplY3QpLnNpemUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgdG90YWwgPSAoKE9iamVjdFtdKSBvYmplY3QpLmxlbmd0aDsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVyYXRvcikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoSXRlcmF0b3IpIG9iamVjdDsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB0b3RhbCsrOwotICAgICAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbnVtZXJhdGlvbikgewotICAgICAgICAgICAgRW51bWVyYXRpb24gaXQgPSAoRW51bWVyYXRpb24pIG9iamVjdDsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHRvdGFsKys7Ci0gICAgICAgICAgICAgICAgaXQubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGU6IG51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG90YWwgPSBBcnJheS5nZXRMZW5ndGgob2JqZWN0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIG9iamVjdCB0eXBlOiAiICsgb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24vYXJyYXkvaXRlcmF0b3IgaXMgZW1wdHkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGhhbmRsZXMgb2JqZWN0cyBhcyBmb2xsb3dzCi0gICAgICogPHVsPgotICAgICAqIDxsaT5Db2xsZWN0aW9uIC0gdmlhIGNvbGxlY3Rpb24gaXNFbXB0eQotICAgICAqIDxsaT5NYXAgLSB2aWEgbWFwIGlzRW1wdHkKLSAgICAgKiA8bGk+QXJyYXkgLSB1c2luZyBhcnJheSBzaXplCi0gICAgICogPGxpPkl0ZXJhdG9yIC0gdmlhIGhhc05leHQKLSAgICAgKiA8bGk+RW51bWVyYXRpb24gLSB2aWEgaGFzTW9yZUVsZW1lbnRzCi0gICAgICogPC91bD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBuYW1lZCB0byBhdm9pZCBjbGFzaGluZyB3aXRoCi0gICAgICoge0BsaW5rICNpc0VtcHR5KENvbGxlY3Rpb24pfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGdldCB0aGUgc2l6ZSBvZiwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZW1wdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0aHJvd24gaWYgb2JqZWN0IGlzIG5vdCByZWNvZ25pc2VkIG9yIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2l6ZUlzRW1wdHkoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbikgb2JqZWN0KS5pc0VtcHR5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNYXApIG9iamVjdCkuaXNFbXB0eSgpOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChPYmplY3RbXSkgb2JqZWN0KS5sZW5ndGggPT0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVyYXRvcikgewotICAgICAgICAgICAgcmV0dXJuICgoSXRlcmF0b3IpIG9iamVjdCkuaGFzTmV4dCgpID09IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFbnVtZXJhdGlvbikgb2JqZWN0KS5oYXNNb3JlRWxlbWVudHMoKSA9PSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGU6IG51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmdldExlbmd0aChvYmplY3QpID09IDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBvYmplY3QgdHlwZTogIiArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogTnVsbC1zYWZlIGNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBlbXB0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIHJldHVybnMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2ssIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVtcHR5IG9yIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIChjb2xsID09IG51bGwgfHwgY29sbC5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE51bGwtc2FmZSBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaXMgbm90IGVtcHR5LgotICAgICAqIDxwPgotICAgICAqIE51bGwgcmV0dXJucyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2ssIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vbi1udWxsIGFuZCBub24tZW1wdHkKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOb3RFbXB0eShDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuICFDb2xsZWN0aW9uVXRpbHMuaXNFbXB0eShjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBnaXZlbiBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byByZXZlcnNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJldmVyc2VBcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBqID0gYXJyYXkubGVuZ3RoIC0gMTsKLSAgICAgICAgT2JqZWN0IHRtcDsKLQotICAgICAgICB3aGlsZSAoaiA+IGkpIHsKLSAgICAgICAgICAgIHRtcCA9IGFycmF5W2pdOwotICAgICAgICAgICAgYXJyYXlbal0gPSBhcnJheVtpXTsKLSAgICAgICAgICAgIGFycmF5W2ldID0gdG1wOwotICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldEZyZXEoZmluYWwgT2JqZWN0IG9iaiwgZmluYWwgTWFwIGZyZXFNYXApIHsKLSAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBmcmVxTWFwLmdldChvYmopOwotICAgICAgICBpZiAoY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50LmludFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIG5vIG1vcmUgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBDb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHtAbGluayBCb3VuZGVkQ29sbGVjdGlvbn0gaW50ZXJmYWNlIHRvIGRldGVybWluZSB0aGUKLSAgICAgKiBmdWxsIHN0YXR1cy4gSWYgdGhlIGNvbGxlY3Rpb24gZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRoZW4KLSAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sbGVjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KLSAgICAgKiBJZiB0aGUgY29sbGVjdGlvbiBoYXMgYmVlbiBkZWNvcmF0ZWQgdXNpbmcgdGhlIGRlY29yYXRvcnMgc3VicGFja2FnZQotICAgICAqIHRoZW4gdGhlc2Ugd2lsbCBiZSByZW1vdmVkIHRvIGFjY2VzcyB0aGUgQm91bmRlZENvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEJvdW5kZWRDb2xsZWN0aW9uIGlzIGZ1bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGdWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBjb2xsZWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sbCBpbnN0YW5jZW9mIEJvdW5kZWRDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChCb3VuZGVkQ29sbGVjdGlvbikgY29sbCkuaXNGdWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJvdW5kZWRDb2xsZWN0aW9uIGJjb2xsID0gVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24uZGVjb3JhdGVVc2luZyhjb2xsKTsKLSAgICAgICAgICAgIHJldHVybiBiY29sbC5pc0Z1bGwoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgQ29sbGVjdGlvbiBjYW4gY29udGFpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSB7QGxpbmsgQm91bmRlZENvbGxlY3Rpb259IGludGVyZmFjZSB0byBkZXRlcm1pbmUgdGhlCi0gICAgICogbWF4aW11bSBzaXplLiBJZiB0aGUgY29sbGVjdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdGhlbgotICAgICAqIC0xIGlzIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjb2xsZWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGRlY29yYXRlZCB1c2luZyB0aGUgZGVjb3JhdG9ycyBzdWJwYWNrYWdlCi0gICAgICogdGhlbiB0aGVzZSB3aWxsIGJlIHJlbW92ZWQgdG8gYWNjZXNzIHRoZSBCb3VuZGVkQ29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBjaGVjawotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgQm91bmRlZENvbGxlY3Rpb24sIC0xIGlmIG5vIG1heGltdW0gc2l6ZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IG1heFNpemUoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIGNvbGxlY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb2xsIGluc3RhbmNlb2YgQm91bmRlZENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvdW5kZWRDb2xsZWN0aW9uKSBjb2xsKS5tYXhTaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJvdW5kZWRDb2xsZWN0aW9uIGJjb2xsID0gVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24uZGVjb3JhdGVVc2luZyhjb2xsKTsKLSAgICAgICAgICAgIHJldHVybiBiY29sbC5tYXhTaXplKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+Ci0gICAgICogdGhhdCBhcmUgYWxzbyBpbiA8Y29kZT5yZXRhaW48L2NvZGU+LiBUaGUgY2FyZGluYWxpdHkgb2YgYW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBjYXJkaW5hbGl0eSBvZiA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+IHVubGVzcyA8Y29kZT5yZXRhaW48L2NvZGU+IGRvZXMgbm90IGNvbnRhaW4gPGNvZGU+ZTwvY29kZT4sIGluIHdoaWNoCi0gICAgICogY2FzZSB0aGUgY2FyZGluYWxpdHkgaXMgemVyby4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGlmIHlvdSBkbyBub3Qgd2lzaCB0byBtb2RpZnkKLSAgICAgKiB0aGUgY29sbGVjdGlvbiA8Y29kZT5jPC9jb2RlPiBhbmQgdGh1cyBjYW5ub3QgY2FsbCA8Y29kZT5jLnJldGFpbkFsbChyZXRhaW4pOzwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHdob3NlIGNvbnRlbnRzIGFyZSB0aGUgdGFyZ2V0IG9mIHRoZSAjcmV0YWlsQWxsIG9wZXJhdGlvbgotICAgICAqIEBwYXJhbSByZXRhaW4gIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIHRvIGJlIHJldGFpbmVkIGluIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBvZiA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPgotICAgICAqIHRoYXQgb2NjdXIgYXQgbGVhc3Qgb25jZSBpbiA8Y29kZT5yZXRhaW48L2NvZGU+LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENvbGxlY3Rpb24gcmV0YWluKSB7Ci0gICAgICAgIHJldHVybiBMaXN0VXRpbHMucmV0YWluQWxsKGNvbGxlY3Rpb24sIHJldGFpbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudHMgaW4gPGNvZGU+cmVtb3ZlPC9jb2RlPiBmcm9tIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+LiBUaGF0IGlzLCB0aGlzCi0gICAgICogbWV0aG9kIHJldHVybnMgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiA8Y29kZT5jPC9jb2RlPgotICAgICAqIHRoYXQgYXJlIG5vdCBpbiA8Y29kZT5yZW1vdmU8L2NvZGU+LiBUaGUgY2FyZGluYWxpdHkgb2YgYW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBjYXJkaW5hbGl0eSBvZiA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+IHVubGVzcyA8Y29kZT5yZW1vdmU8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPmU8L2NvZGU+LCBpbiB3aGljaAotICAgICAqIGNhc2UgdGhlIGNhcmRpbmFsaXR5IGlzIHplcm8uIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3UgZG8gbm90IHdpc2ggdG8gbW9kaWZ5Ci0gICAgICogdGhlIGNvbGxlY3Rpb24gPGNvZGU+YzwvY29kZT4gYW5kIHRodXMgY2Fubm90IGNhbGwgPGNvZGU+Y29sbGVjdGlvbi5yZW1vdmVBbGwocmVtb3ZlKTs8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiBmcm9tIHdoaWNoIGl0ZW1zIGFyZSByZW1vdmVkIChpbiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbikKLSAgICAgKiBAcGFyYW0gcmVtb3ZlICB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXR1cm5lZCA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+Y29sbGVjdGlvbjwvY29kZT4gZXhjZXB0Ci0gICAgICogYW55IGVsZW1lbnRzIHRoYXQgYWxzbyBvY2N1ciBpbiA8Y29kZT5yZW1vdmU8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENvbGxlY3Rpb24gcmVtb3ZlKSB7Ci0gICAgICAgIHJldHVybiBMaXN0VXRpbHMucmV0YWluQWxsKGNvbGxlY3Rpb24sIHJlbW92ZSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgY29sbGVjdGlvbiBiYWNrZWQgYnkgdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogWW91IG11c3QgbWFudWFsbHkgc3luY2hyb25pemUgb24gdGhlIHJldHVybmVkIGJ1ZmZlcidzIGl0ZXJhdG9yIHRvIAotICAgICAqIGF2b2lkIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yOgotICAgICAqICAKLSAgICAgKiA8cHJlPgotICAgICAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25VdGlscy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKG15Q29sbGVjdGlvbik7Ci0gICAgICogc3luY2hyb25pemVkIChjKSB7Ci0gICAgICogICAgIEl0ZXJhdG9yIGkgPSBjLml0ZXJhdG9yKCk7Ci0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgcHJvY2VzcyAoaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIHN5bmNocm9uaXplLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHN5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBTeW5jaHJvbml6ZWRDb2xsZWN0aW9uLmRlY29yYXRlKGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gYmFja2VkIGJ5IHRoZSBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gbWFrZSB1bm1vZGlmaWFibGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHVubW9kaWZpYWJsZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVDb2xsZWN0aW9uLmRlY29yYXRlKGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGluIHRoZSBnaXZlbiBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotICAgICAqIFRyeWluZyB0byBhZGQgYW4gaW52YWxpZCBvYmplY3QgcmVzdWx0cyBpbiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0gICAgICogSXQgaXMgaW1wb3J0YW50IG5vdCB0byB1c2UgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsCi0gICAgICogYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIGludmFsaWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIGZvciB0aGUgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBwcmVkaWNhdGVkIGNvbGxlY3Rpb24gYmFja2VkIGJ5IHRoZSBnaXZlbiBjb2xsZWN0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBDb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcHJlZGljYXRlZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBQcmVkaWNhdGVkQ29sbGVjdGlvbi5kZWNvcmF0ZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0eXBlZCBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gbGltaXQgdG8gYSBzcGVjaWZpYyB0eXBlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIG9mIG9iamVjdHMgd2hpY2ggbWF5IGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICogQHJldHVybiBhIHR5cGVkIGNvbGxlY3Rpb24gYmFja2VkIGJ5IHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiB0eXBlZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBUeXBlZENvbGxlY3Rpb24uZGVjb3JhdGUoY29sbGVjdGlvbiwgdHlwZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0cmFuc2Zvcm1lZCBiYWcgYmFja2VkIGJ5IHRoZSBnaXZlbiBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggb2JqZWN0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1lciBhcyBpdCBpcyBhZGRlZCB0byB0aGUKLSAgICAgKiBDb2xsZWN0aW9uLiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiBhZnRlciBpbnZva2luZyB0aGlzIAotICAgICAqIG1ldGhvZCwgYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIHVudHJhbnNmb3JtZWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciBmb3IgdGhlIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgdHJhbnNmb3JtZWQgY29sbGVjdGlvbiBiYWNrZWQgYnkgdGhlIGdpdmVuIGNvbGxlY3Rpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIENvbGxlY3Rpb24gb3IgVHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiB0cmFuc2Zvcm1lZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZWRDb2xsZWN0aW9uLmRlY29yYXRlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db21wYXJhdG9yVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Db21wYXJhdG9yVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTgyZjA3Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ29tcGFyYXRvclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzLkJvb2xlYW5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb21wYXJhdG9ycy5Db21wYXJhYmxlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29tcGFyYXRvcnMuQ29tcGFyYXRvckNoYWluOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb21wYXJhdG9ycy5OdWxsQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29tcGFyYXRvcnMuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzLlRyYW5zZm9ybWluZ0NvbXBhcmF0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgY29udmVuaWVudCBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGZvciA8Q29kZT5Db21wYXJhdG9yPC9Db2RlPgotICogb2JqZWN0cy4KLSAqIDxwPgotICogTW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIGNsYXNzIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSAKLSAqIDxjb2RlPmNvbXBhcmF0b3JzPC9jb2RlPiBwYWNrYWdlLiBUaGlzIGNsYXNzIG1lcmVseSBwcm92aWRlcyBhIAotICogY29udmVuaWVudCBjZW50cmFsIHBsYWNlIGlmIHlvdSBoYXZlIHVzZSBmb3IgbW9yZSB0aGFuIG9uZSBjbGFzcwotICogaW4gdGhlIDxjb2RlPmNvbXBhcmF0b3JzPC9jb2RlPiBzdWJwYWNrYWdlLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyYXRvclV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIENvbXBhcmF0b3JVdGlscyBzaG91bGQgbm90IG5vcm1hbGx5IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFyYXRvclV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmF0b3IgZm9yIG5hdHVyYWwgc29ydCBvcmRlci4KLSAgICAgKgotICAgICAqIEBzZWUgQ29tcGFyYWJsZUNvbXBhcmF0b3IjZ2V0SW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgTkFUVVJBTF9DT01QQVJBVE9SID0gQ29tcGFyYWJsZUNvbXBhcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb21wYXJhdG9yIHRoYXQgdXNlcyB0aGUgbmF0dXJhbCBvcmRlciBvZiB0aGUgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIGEgY29tcGFyYXRvciB3aGljaCB1c2VzIG5hdHVyYWwgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgbmF0dXJhbENvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBOQVRVUkFMX0NPTVBBUkFUT1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyB1c2luZyB0d28ge0BsaW5rIENvbXBhcmF0b3J9cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2Vjb25kIGNvbXBhcmF0b3IgaXMgdXNlZCBpZiB0aGUgZmlyc3QgY29tcGFyYXRvciByZXR1cm5zIGVxdWFsLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IxICB0aGUgZmlyc3QgY29tcGFyYXRvciB0byB1c2UsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IyICB0aGUgZmlyc3QgY29tcGFyYXRvciB0byB1c2UsIG5vdCBudWxsCi0gICAgICogQHJldHVybiBhIHtAbGluayBDb21wYXJhdG9yQ2hhaW59IGZvcm1lZCBmcm9tIHRoZSB0d28gY29tcGFyYXRvcnMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBjb21wYXJhdG9yIGlzIG51bGwKLSAgICAgKiBAc2VlIENvbXBhcmF0b3JDaGFpbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBjaGFpbmVkQ29tcGFyYXRvcihDb21wYXJhdG9yIGNvbXBhcmF0b3IxLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IyKSB7Ci0gICAgICAgIHJldHVybiBjaGFpbmVkQ29tcGFyYXRvcihuZXcgQ29tcGFyYXRvcltdIHtjb21wYXJhdG9yMSwgY29tcGFyYXRvcjJ9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY29tcGFyYXRvciB0aGF0IGNvbXBhcmVzIHVzaW5nIGFuIGFycmF5IG9mIHtAbGluayBDb21wYXJhdG9yfXMsIGFwcGxpZWQKLSAgICAgKiBpbiBzZXF1ZW5jZSB1bnRpbCBvbmUgcmV0dXJucyBub3QgZXF1YWwgb3IgdGhlIGFycmF5IGlzIGV4aGF1c3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9ycyAgdGhlIGNvbXBhcmF0b3JzIHRvIHVzZSwgbm90IG51bGwgb3IgZW1wdHkgb3IgY29udGFpbmluZyBudWxscwotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgQ29tcGFyYXRvckNoYWlufSBmb3JtZWQgZnJvbSB0aGUgaW5wdXQgY29tcGFyYXRvcnMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNvbXBhcmF0b3JzIGFycmF5IGlzIG51bGwgb3IgY29udGFpbnMgYSBudWxsCi0gICAgICogQHNlZSBDb21wYXJhdG9yQ2hhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgY2hhaW5lZENvbXBhcmF0b3IoQ29tcGFyYXRvcltdIGNvbXBhcmF0b3JzKSB7Ci0gICAgICAgIENvbXBhcmF0b3JDaGFpbiBjaGFpbiA9IG5ldyBDb21wYXJhdG9yQ2hhaW4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJhdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3JzW2ldID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBhcmF0b3IgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYWluLmFkZENvbXBhcmF0b3IoY29tcGFyYXRvcnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY29tcGFyYXRvciB0aGF0IGNvbXBhcmVzIHVzaW5nIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQ29tcGFyYXRvcn1zLAotICAgICAqIGFwcGxpZWQgaW4gKGRlZmF1bHQgaXRlcmF0b3IpIHNlcXVlbmNlIHVudGlsIG9uZSByZXR1cm5zIG5vdCBlcXVhbCBvciB0aGUgCi0gICAgICogY29sbGVjdGlvbiBpcyBleGhhdXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvcnMgIHRoZSBjb21wYXJhdG9ycyB0byB1c2UsIG5vdCBudWxsIG9yIGVtcHR5IG9yIGNvbnRhaW5pbmcgbnVsbHMKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIENvbXBhcmF0b3JDaGFpbn0gZm9ybWVkIGZyb20gdGhlIGlucHV0IGNvbXBhcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBjb21wYXJhdG9ycyBjb2xsZWN0aW9uIGlzIG51bGwgb3IgY29udGFpbnMgYSBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNvbXBhcmF0b3JzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHdyb25nIG9iamVjdCB0eXBlCi0gICAgICogQHNlZSBDb21wYXJhdG9yQ2hhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgY2hhaW5lZENvbXBhcmF0b3IoQ29sbGVjdGlvbiBjb21wYXJhdG9ycykgewotICAgICAgICByZXR1cm4gY2hhaW5lZENvbXBhcmF0b3IoCi0gICAgICAgICAgICAoQ29tcGFyYXRvcltdKSBjb21wYXJhdG9ycy50b0FycmF5KG5ldyBDb21wYXJhdG9yW2NvbXBhcmF0b3JzLnNpemUoKV0pCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGNvbXBhcmF0b3IgdGhhdCByZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGdpdmVuIGNvbXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdG8gcmV2ZXJzZQotICAgICAqIEByZXR1cm4gIGEgY29tcGFyYXRvciB0aGF0IHJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgaW5wdXQgY29tcGFyYXRvcgotICAgICAqIEBzZWUgUmV2ZXJzZUNvbXBhcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgcmV2ZXJzZWRDb21wYXJhdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICBpZiAoY29tcGFyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wYXJhdG9yID0gTkFUVVJBTF9DT01QQVJBVE9SOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmV2ZXJzZUNvbXBhcmF0b3IoY29tcGFyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIENvbXBhcmF0b3IgdGhhdCBjYW4gc29ydCBCb29sZWFuIG9iamVjdHMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0cnVlIG9yIGZhbHNlIGlzIHNvcnRlZCBmaXJzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29tcGFyYXRvciB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYSBudWxsIHZhbHVlIGlzIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cnVlRmlyc3QgIHdoZW4gPGNvZGU+dHJ1ZTwvY29kZT4sIHNvcnQgCi0gICAgICogICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHtAbGluayBCb29sZWFufXMgYmVmb3JlCi0gICAgICogICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiB7QGxpbmsgQm9vbGVhbn1zLgotICAgICAqIEByZXR1cm4gIGEgY29tcGFyYXRvciB0aGF0IHNvcnRzIGJvb2xlYW5zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGJvb2xlYW5Db21wYXJhdG9yKGJvb2xlYW4gdHJ1ZUZpcnN0KSB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuQ29tcGFyYXRvci5nZXRCb29sZWFuQ29tcGFyYXRvcih0cnVlRmlyc3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgQ29tcGFyYXRvciB0aGF0IGNvbnRyb2xzIHRoZSBjb21wYXJpc29uIG9mIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQgY29tcGFyYXRvciB3aWxsIGNvbnNpZGVyIGEgbnVsbCB2YWx1ZSB0byBiZSBsZXNzIHRoYW4KLSAgICAgKiBhbnkgbm9ubnVsbCB2YWx1ZSwgYW5kIGVxdWFsIHRvIGFueSBvdGhlciBudWxsIHZhbHVlLiAgVHdvIG5vbm51bGwKLSAgICAgKiB2YWx1ZXMgd2lsbCBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcGFyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIHRoYXQgd2FudHMgdG8gYWxsb3cgbnVsbHMKLSAgICAgKiBAcmV0dXJuICBhIHZlcnNpb24gb2YgdGhhdCBjb21wYXJhdG9yIHRoYXQgYWxsb3dzIG51bGxzCi0gICAgICogQHNlZSBOdWxsQ29tcGFyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBudWxsTG93Q29tcGFyYXRvcihDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGFyYXRvciA9IE5BVFVSQUxfQ09NUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE51bGxDb21wYXJhdG9yKGNvbXBhcmF0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgQ29tcGFyYXRvciB0aGF0IGNvbnRyb2xzIHRoZSBjb21wYXJpc29uIG9mIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQgY29tcGFyYXRvciB3aWxsIGNvbnNpZGVyIGEgbnVsbCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4KLSAgICAgKiBhbnkgbm9ubnVsbCB2YWx1ZSwgYW5kIGVxdWFsIHRvIGFueSBvdGhlciBudWxsIHZhbHVlLiAgVHdvIG5vbm51bGwKLSAgICAgKiB2YWx1ZXMgd2lsbCBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcGFyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIHRoYXQgd2FudHMgdG8gYWxsb3cgbnVsbHMKLSAgICAgKiBAcmV0dXJuICBhIHZlcnNpb24gb2YgdGhhdCBjb21wYXJhdG9yIHRoYXQgYWxsb3dzIG51bGxzCi0gICAgICogQHNlZSBOdWxsQ29tcGFyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBudWxsSGlnaENvbXBhcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBhcmF0b3IgPSBOQVRVUkFMX0NPTVBBUkFUT1I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ29tcGFyYXRvcihjb21wYXJhdG9yLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgQ29tcGFyYXRvciB0aGF0IHBhc3NlcyB0cmFuc2Zvcm1lZCBvYmplY3RzIHRvIHRoZSBnaXZlbiBjb21wYXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIE9iamVjdHMgcGFzc2VkIHRvIHRoZSByZXR1cm5lZCBjb21wYXJhdG9yIHdpbGwgZmlyc3QgYmUgdHJhbnNmb3JtZWQKLSAgICAgKiBieSB0aGUgZ2l2ZW4gdHJhbnNmb3JtZXIgYmVmb3JlIHRoZXkgYXJlIGNvbXBhcmVkIGJ5IHRoZSBnaXZlbgotICAgICAqIGNvbXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIHNvcnQgb3JkZXIgdG8gdXNlCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlCi0gICAgICogQHJldHVybiAgYSBjb21wYXJhdG9yIHRoYXQgdHJhbnNmb3JtcyBpdHMgaW5wdXQgb2JqZWN0cyBiZWZvcmUgY29tcGFyaW5nIHRoZW0KLSAgICAgKiBAc2VlICBUcmFuc2Zvcm1pbmdDb21wYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIHRyYW5zZm9ybWVkQ29tcGFyYXRvcihDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBhcmF0b3IgPSBOQVRVUkFMX0NPTVBBUkFUT1I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1pbmdDb21wYXJhdG9yKHRyYW5zZm9ybWVyLCBjb21wYXJhdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc21hbGxlciBvZiB0aGUgZ2l2ZW4gb2JqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIAotICAgICAqICBjb21wYXJhdG9yLCByZXR1cm5pbmcgdGhlIHNlY29uZCBvYmplY3QgaWYgdGhlIGNvbXBhcmF0b3IKLSAgICAgKiAgcmV0dXJucyBlcXVhbC4KLSAgICAgKiAKLSAgICAgKiAgQHBhcmFtIG8xICB0aGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiAgQHBhcmFtIG8yICB0aGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogIEBwYXJhbSBjb21wYXJhdG9yICB0aGUgc29ydCBvcmRlciB0byB1c2UKLSAgICAgKiAgQHJldHVybiAgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWluKE9iamVjdCBvMSwgT2JqZWN0IG8yLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGFyYXRvciA9IE5BVFVSQUxfQ09NUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICBpbnQgYyA9IGNvbXBhcmF0b3IuY29tcGFyZShvMSwgbzIpOwotICAgICAgICByZXR1cm4gKGMgPCAwKSA/IG8xIDogbzI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdGhlIGxhcmdlciBvZiB0aGUgZ2l2ZW4gb2JqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIAotICAgICAqICBjb21wYXJhdG9yLCByZXR1cm5pbmcgdGhlIHNlY29uZCBvYmplY3QgaWYgdGhlIGNvbXBhcmF0b3IgCi0gICAgICogIHJldHVybnMgZXF1YWwuCi0gICAgICogCi0gICAgICogIEBwYXJhbSBvMSAgdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgICogIEBwYXJhbSBvMiAgdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQotICAgICAqICBAcGFyYW0gY29tcGFyYXRvciAgdGhlIHNvcnQgb3JkZXIgdG8gdXNlCi0gICAgICogIEByZXR1cm4gIHRoZSBsYXJnZXIgb2YgdGhlIHR3byBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWF4KE9iamVjdCBvMSwgT2JqZWN0IG8yLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGFyYXRvciA9IE5BVFVSQUxfQ09NUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICBpbnQgYyA9IGNvbXBhcmF0b3IuY29tcGFyZShvMSwgbzIpOwotICAgICAgICByZXR1cm4gKGMgPiAwKSA/IG8xIDogbzI7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0N1cnNvcmFibGVMaW5rZWRMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA4Mzk5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvQ3Vyc29yYWJsZUxpbmtlZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NjcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBBIGRvdWJseS1saW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIExpc3R9IGludGVyZmFjZSwKLSAqIHN1cHBvcnRpbmcgYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSB0aGF0IGFsbG93cyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMKLSAqIHRvIHRoZSB1bmRlcmx5aW5nIGxpc3QuCi0gKiA8cD4KLSAqIEltcGxlbWVudHMgYWxsIG9mIHRoZSBvcHRpb25hbCB7QGxpbmsgTGlzdH0gb3BlcmF0aW9ucywgdGhlCi0gKiBzdGFjay9xdWV1ZS9kZXF1ZXVlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGluIHtAbGluayBqYXZhLnV0aWwuTGlua2VkTGlzdH0KLSAqIGFuZCBzdXBwb3J0cyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IHRoYXQgYWxsb3dzIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucwotICogdG8gdGhlIHVuZGVybHlpbmcgbGlzdCAoc2VlIHtAbGluayAjY3Vyc29yfSkuCi0gKiA8cD4KLSAqIDxiPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9iPgotICoKLSAqIEBkZXByZWNhdGVkIFVzZSBuZXcgdmVyc2lvbiBpbiBsaXN0IHN1YnBhY2thZ2UsIHdoaWNoIGhhcyBiZWVuIHJld3JpdHRlbgotICogIGFuZCBub3cgcmV0dXJucyB0aGUgY3Vyc29yIGZyb20gdGhlIGxpc3RJdGVyYXRvciBtZXRob2QuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wCi0gKiBAc2VlIGphdmEudXRpbC5MaW5rZWRMaXN0Ci0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQGF1dGhvciBKYW5layBCb2d1Y2tpCi0gKiBAYXV0aG9yIFNpbW9uIEtpdGNoaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXJzb3JhYmxlTGlua2VkTGlzdCBpbXBsZW1lbnRzIExpc3QsIFNlcmlhbGl6YWJsZSB7Ci0gICAgLyoqIEVuc3VyZSBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgKi8gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODgzNjM5MzA5ODUxOTQxMTM5M0w7Ci0KLSAgICAvLy0tLSBwdWJsaWMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG8gZWxlbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0gICAgICAgIGluc2VydExpc3RhYmxlKF9oZWFkLnByZXYoKSxudWxsLG8pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KLSAgICAgKiBTaGlmdHMgdGhlIGVsZW1lbnQgY3VycmVudGx5IGF0IHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50Ci0gICAgICogIGVsZW1lbnRzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggYXQgd2hpY2ggdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIHRvIGJlIGluc2VydGVkLgotICAgICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gICAgICogCQkgIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgYWRkZWQgdG8gdGhpcyBsaXN0LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKgkJICAgICBlbGVtZW50IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgYWRkZWQgdG8gdGhpcyBsaXN0LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAgICoJCSAgICAgKGluZGV4ICZsdDsgMCB8fCBpbmRleCAmZ3Q7IHNpemUoKSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYoaW5kZXggPT0gX3NpemUpIHsKLSAgICAgICAgICAgIGFkZChlbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGluZGV4IDwgMCB8fCBpbmRleCA+IF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoaW5kZXgpICsgIiA8IDAgb3IgIiArIFN0cmluZy52YWx1ZU9mKGluZGV4KSArICIgPiAiICsgX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdGFibGUgc3VjYyA9IChpc0VtcHR5KCkgPyBudWxsIDogZ2V0TGlzdGFibGVBdChpbmRleCkpOwotICAgICAgICAgICAgTGlzdGFibGUgcHJlZCA9IChudWxsID09IHN1Y2MgPyBudWxsIDogc3VjYy5wcmV2KCkpOwotICAgICAgICAgICAgaW5zZXJ0TGlzdGFibGUocHJlZCxzdWNjLGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0byB0aGUgZW5kIG9mCi0gICAgICogdGhpcyBsaXN0LCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICoge0BsaW5rIENvbGxlY3Rpb259J3Mge0BsaW5rIEl0ZXJhdG9yfS4gIFRoZSBiZWhhdmlvciBvZiB0aGlzIG9wZXJhdGlvbiBpcwotICAgICAqIHVuc3BlY2lmaWVkIGlmIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyBtb2RpZmllZCB3aGlsZQotICAgICAqIHRoZSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuICAoTm90ZSB0aGF0IHRoaXMgd2lsbCBvY2N1ciBpZiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBpcyB0aGlzIGxpc3QsIGFuZCBpdCdzIG5vbmVtcHR5LikKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGFkZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgYW4gZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogCSAgICAgY29sbGVjdGlvbiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzb21lIGFzcGVjdCBvZiBhbiBlbGVtZW50IGluIHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIGNvbGxlY3Rpb24gcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzCi0gICAgICogICAgICAgICBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgaWYoYy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBpdCA9IGMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpbnNlcnRMaXN0YWJsZShfaGVhZC5wcmV2KCksbnVsbCxpdC5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaW50byB0aGlzCi0gICAgICogbGlzdCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgU2hpZnRzIHRoZSBlbGVtZW50IGN1cnJlbnRseSBhdAotICAgICAqIHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50IGVsZW1lbnRzIHRvIHRoZSByaWdodAotICAgICAqIChpbmNyZWFzZXMgdGhlaXIgaW5kaWNlcykuICBUaGUgbmV3IGVsZW1lbnRzIHdpbGwgYXBwZWFyIGluIHRoaXMKLSAgICAgKiBsaXN0IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQKLSAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB7QGxpbmsgSXRlcmF0b3J9LiAgVGhlIGJlaGF2aW9yIG9mIHRoaXMgb3BlcmF0aW9uIGlzCi0gICAgICogdW5zcGVjaWZpZWQgaWYgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGlzIG1vZGlmaWVkIHdoaWxlIHRoZQotICAgICAqIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4gIChOb3RlIHRoYXQgdGhpcyB3aWxsIG9jY3VyIGlmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjb2xsZWN0aW9uIGlzIHRoaXMgbGlzdCwgYW5kIGl0J3Mgbm9uZW1wdHkuKQotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCBmaXJzdCBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZAotICAgICAqCSAgICAgICAgICAgIGNvbGxlY3Rpb24uCi0gICAgICogQHBhcmFtIGMgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGlzIGxpc3QuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsLgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIG9uZSBvZiBlbGVtZW50cyBvZiB0aGUKLSAgICAgKiAJCSAgIHNwZWNpZmllZCBjb2xsZWN0aW9uIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgYWRkZWQgdG8gdGhpcwotICAgICAqIAkJICAgbGlzdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzb21lIGFzcGVjdCBvZiBvbmUgb2YgZWxlbWVudHMgb2YKLSAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvCi0gICAgICogICAgICAgICB0aGlzIGxpc3QuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKGluZGV4Ci0gICAgICoJICAgICAgJmx0OyAwIHx8IGluZGV4ICZndDsgc2l6ZSgpKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgaWYoYy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmKF9zaXplID09IGluZGV4IHx8IF9zaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRBbGwoYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0YWJsZSBzdWNjID0gZ2V0TGlzdGFibGVBdChpbmRleCk7Ci0gICAgICAgICAgICBMaXN0YWJsZSBwcmVkID0gKG51bGwgPT0gc3VjYykgPyBudWxsIDogc3VjYy5wcmV2KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHByZWQgPSBpbnNlcnRMaXN0YWJsZShwcmVkLHN1Y2MsaXQubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGxpc3QuCi0gICAgICogKEVxdWl2YWxlbnQgdG8ge0BsaW5rICNhZGQoaW50LGphdmEubGFuZy5PYmplY3QpIDx0dD5hZGQoMCxvKTwvdHQ+fSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBlbGVtZW50IHRvIGJlIHByZXBlbmRlZCB0byB0aGlzIGxpc3QuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkRmlyc3QoT2JqZWN0IG8pIHsKLSAgICAgICAgaW5zZXJ0TGlzdGFibGUobnVsbCxfaGVhZC5uZXh0KCksbyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBsaXN0LgotICAgICAqIChFcXVpdmFsZW50IHRvIHtAbGluayAjYWRkKGphdmEubGFuZy5PYmplY3QpfSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBlbGVtZW50IHRvIGJlIGFwcGVuZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRMYXN0KE9iamVjdCBvKSB7Ci0gICAgICAgIGluc2VydExpc3RhYmxlKF9oZWFkLnByZXYoKSxudWxsLG8pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIGxpc3QuICBUaGlzCi0gICAgICogbGlzdCB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zICh1bmxlc3MKLSAgICAgKiBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgLyoKLSAgICAgICAgLy8gdGhpcyBpcyB0aGUgcXVpY2sgd2F5LCBidXQgd291bGQgZm9yY2UgdXMKLSAgICAgICAgLy8gdG8gYnJlYWsgYWxsIHRoZSBjdXJzb3JzCi0gICAgICAgIF9tb2RDb3VudCsrOwotICAgICAgICBfaGVhZC5zZXROZXh0KG51bGwpOwotICAgICAgICBfaGVhZC5zZXRQcmV2KG51bGwpOwotICAgICAgICBfc2l6ZSA9IDA7Ci0gICAgICAgICovCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIGxpc3QgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotICAgICAqIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZiB0aGlzIGxpc3QgY29udGFpbnMKLSAgICAgKiBhdCBsZWFzdCBvbmUgZWxlbWVudCA8dHQ+ZTwvdHQ+IHN1Y2ggdGhhdAotICAgICAqIDx0dD4obz09bnVsbCZuYnNwOz8mbmJzcDtlPT1udWxsJm5ic3A7OiZuYnNwO28uZXF1YWxzKGUpKTwvdHQ+LgotICAgICAqCi0gICAgICogQHBhcmFtIG8gZWxlbWVudCB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGxpc3QgaXMgdG8gYmUgdGVzdGVkLgotICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIGxpc3QgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgIGZvcihMaXN0YWJsZSBlbHQgPSBfaGVhZC5uZXh0KCksIHBhc3QgPSBudWxsOyBudWxsICE9IGVsdCAmJiBwYXN0ICE9IF9oZWFkLnByZXYoKTsgZWx0ID0gKHBhc3QgPSBlbHQpLm5leHQoKSkgewotICAgICAgICAgICAgaWYoKG51bGwgPT0gbyAmJiBudWxsID09IGVsdC52YWx1ZSgpKSB8fCAKLSAgICAgICAgICAgICAgIChvICE9IG51bGwgJiYgby5lcXVhbHMoZWx0LnZhbHVlKCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBsaXN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBjb2xsZWN0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIGNvbnRhaW5tZW50IGluIHRoaXMgbGlzdC4KLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBsaXN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYoIXRoaXMuY29udGFpbnMoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3RJdGVyYXRvcn0gZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZQotICAgICAqIGVsZW1lbnRzIG9mIHRoaXMgbGlzdC4gVW5saWtlIHtAbGluayAjaXRlcmF0b3J9LCBhIGN1cnNvcgotICAgICAqIGlzIG5vdCBib3RoZXJlZCBieSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgdG8gdGhlCi0gICAgICogdW5kZXJseWluZyBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFNwZWNpZmljYWxseSwgd2hlbiBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yCi0gICAgICogYWZ0ZXIgdGhlIGN1cnNvciwgdGhlIGN1cnNvciBzaW1wbHkgcGlja3MgdGhlbSB1cCBhdXRvbWF0aWNhbGx5LgotICAgICAqIFdoZW4gdGhlICJjdXJyZW50IiAoaS5lLiwgbGFzdCByZXR1cm5lZCBieSB7QGxpbmsgTGlzdEl0ZXJhdG9yI25leHR9Ci0gICAgICogb3Ige0BsaW5rIExpc3RJdGVyYXRvciNwcmV2aW91c30pIGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgcmVtb3ZlZCwKLSAgICAgKiB0aGUgY3Vyc29yIGF1dG9tYXRpY2FsbHkgYWRqdXN0cyB0byB0aGUgY2hhbmdlIChpbnZhbGlkYXRpbmcgdGhlCi0gICAgICogbGFzdCByZXR1cm5lZCB2YWx1ZS0taS5lLiwgaXQgY2Fubm90IGJlIHJlbW92ZWQpLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQge0BsaW5rIExpc3RJdGVyYXRvcn0gZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAgICAgKiB7QGxpbmsgTGlzdEl0ZXJhdG9yI25leHRJbmRleH0gYW5kIHtAbGluayBMaXN0SXRlcmF0b3IjcHJldmlvdXNJbmRleH0KLSAgICAgKiBtZXRob2RzICh0aGV5IHRocm93IHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbiBpbnZva2VkLgotICAgICAqIDxwPgotICAgICAqIEhpc3RvcmljYWwgTm90ZTogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBjbGFzcywgdGhlIG9iamVjdCAKLSAgICAgKiByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdhcyByZXF1aXJlZCB0byBiZSBleHBsaWNpdGx5IGNsb3NlZC4gVGhpcyAKLSAgICAgKiBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgotICAgICAqCi0gICAgICogQHNlZSAjY3Vyc29yKGludCkKLSAgICAgKiBAc2VlICNsaXN0SXRlcmF0b3IKLSAgICAgKiBAc2VlIEN1cnNvcmFibGVMaW5rZWRMaXN0LkN1cnNvcgotICAgICAqLwotICAgIHB1YmxpYyBDdXJzb3JhYmxlTGlua2VkTGlzdC5DdXJzb3IgY3Vyc29yKCkgewotICAgICAgICByZXR1cm4gbmV3IEN1cnNvcigwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3RJdGVyYXRvcn0gZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZQotICAgICAqIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCwgaW5pdGlhbGl6ZWQgc3VjaCB0aGF0Ci0gICAgICoge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0fSB3aWxsIHJldHVybiB0aGUgZWxlbWVudCBhdAotICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXggKGlmIGFueSkgYW5kIHtAbGluayBMaXN0SXRlcmF0b3IjcHJldmlvdXN9Ci0gICAgICogd2lsbCByZXR1cm4gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGl0IChpZiBhbnkpLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2l0ZXJhdG9yfSwgYSBjdXJzb3IKLSAgICAgKiBpcyBub3QgYm90aGVyZWQgYnkgY29uY3VycmVudCBtb2RpZmljYXRpb25zIHRvIHRoZQotICAgICAqIHVuZGVybHlpbmcgbGlzdC4KLSAgICAgKgotICAgICAqIEBzZWUgI2N1cnNvcgotICAgICAqIEBzZWUgI2xpc3RJdGVyYXRvcihpbnQpCi0gICAgICogQHNlZSBDdXJzb3JhYmxlTGlua2VkTGlzdC5DdXJzb3IKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSAoaW5kZXgKLSAgICAgKgkgICAgICAgICZsdDsgMCB8fCBpbmRleCAmZ3Q7IHNpemUoKSkuCi0gICAgICovCi0gICAgcHVibGljIEN1cnNvcmFibGVMaW5rZWRMaXN0LkN1cnNvciBjdXJzb3IoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGxpc3QgZm9yIGVxdWFsaXR5LiAgUmV0dXJucwotICAgICAqIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYWxzbyBhIGxpc3QsIGJvdGgKLSAgICAgKiBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbgotICAgICAqIHRoZSB0d28gbGlzdHMgYXJlIDxpPmVxdWFsPC9pPi4gIChUd28gZWxlbWVudHMgPHR0PmUxPC90dD4gYW5kCi0gICAgICogPHR0PmUyPC90dD4gYXJlIDxpPmVxdWFsPC9pPiBpZiA8dHQ+KGUxPT1udWxsID8gZTI9PW51bGwgOgotICAgICAqIGUxLmVxdWFscyhlMikpPC90dD4uKSAgSW4gb3RoZXIgd29yZHMsIHR3byBsaXN0cyBhcmUgZGVmaW5lZCB0byBiZQotICAgICAqIGVxdWFsIGlmIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4gIFRoaXMKLSAgICAgKiBkZWZpbml0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZXF1YWxzIG1ldGhvZCB3b3JrcyBwcm9wZXJseSBhY3Jvc3MKLSAgICAgKiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSA8dHQ+TGlzdDwvdHQ+IGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBsaXN0LgotICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmKG8gPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZighKG8gaW5zdGFuY2VvZiBMaXN0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gKChMaXN0KW8pLmxpc3RJdGVyYXRvcigpOwotICAgICAgICBmb3IoTGlzdGFibGUgZWx0ID0gX2hlYWQubmV4dCgpLCBwYXN0ID0gbnVsbDsgbnVsbCAhPSBlbHQgJiYgcGFzdCAhPSBfaGVhZC5wcmV2KCk7IGVsdCA9IChwYXN0ID0gZWx0KS5uZXh0KCkpIHsKLSAgICAgICAgICAgIGlmKCFpdC5oYXNOZXh0KCkgfHwgKG51bGwgPT0gZWx0LnZhbHVlKCkgPyBudWxsICE9IGl0Lm5leHQoKSA6ICEoZWx0LnZhbHVlKCkuZXF1YWxzKGl0Lm5leHQoKSkpKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFpdC5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBlbGVtZW50IHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKGluZGV4Ci0gICAgICogCQkgICZsdDsgMCB8fCBpbmRleCAmZ3Q7PSBzaXplKCkpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdGFibGVBdChpbmRleCkudmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Rmlyc3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gX2hlYWQubmV4dCgpLnZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRMYXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIF9oZWFkLnByZXYoKS52YWx1ZSgpOwotICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbGlzdC4gIFRoZSBoYXNoIGNvZGUgb2YgYSBsaXN0Ci0gICAgICogaXMgZGVmaW5lZCB0byBiZSB0aGUgcmVzdWx0IG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb246Ci0gICAgICogPHByZT4KLSAgICAgKiAgaGFzaENvZGUgPSAxOwotICAgICAqICBJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAqICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgKiAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgKiAgICAgIGhhc2hDb2RlID0gMzEqaGFzaENvZGUgKyAob2JqPT1udWxsID8gMCA6IG9iai5oYXNoQ29kZSgpKTsKLSAgICAgKiAgfQotICAgICAqIDwvcHJlPgotICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IDx0dD5saXN0MS5lcXVhbHMobGlzdDIpPC90dD4gaW1wbGllcyB0aGF0Ci0gICAgICogPHR0Pmxpc3QxLmhhc2hDb2RlKCk9PWxpc3QyLmhhc2hDb2RlKCk8L3R0PiBmb3IgYW55IHR3byBsaXN0cywKLSAgICAgKiA8dHQ+bGlzdDE8L3R0PiBhbmQgPHR0Pmxpc3QyPC90dD4sIGFzIHJlcXVpcmVkIGJ5IHRoZSBnZW5lcmFsCi0gICAgICogY29udHJhY3Qgb2YgPHR0Pk9iamVjdC5oYXNoQ29kZTwvdHQ+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGxpc3QuCi0gICAgICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotICAgICAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0gICAgICogQHNlZSAjZXF1YWxzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgIGZvcihMaXN0YWJsZSBlbHQgPSBfaGVhZC5uZXh0KCksIHBhc3QgPSBudWxsOyBudWxsICE9IGVsdCAmJiBwYXN0ICE9IF9oZWFkLnByZXYoKTsgZWx0ID0gKHBhc3QgPSBlbHQpLm5leHQoKSkgewotICAgICAgICAgICAgaGFzaCA9IDMxKmhhc2ggKyAobnVsbCA9PSBlbHQudmFsdWUoKSA/IDAgOiBlbHQudmFsdWUoKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGlzIGxpc3Qgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGVsZW1lbnQsIG9yIC0xIGlmIHRoaXMgbGlzdCBkb2VzIG5vdCBjb250YWluIHRoaXMgZWxlbWVudC4KLSAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIHRoZSBsb3dlc3QgaW5kZXggPHR0Pmk8L3R0PiBzdWNoIHRoYXQKLSAgICAgKiA8dHQ+KG89PW51bGwgPyBnZXQoaSk9PW51bGwgOiBvLmVxdWFscyhnZXQoaSkpKTwvdHQ+LAotICAgICAqIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBlbGVtZW50IHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggaW4gdGhpcyBsaXN0IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgIGVsZW1lbnQsIG9yIC0xIGlmIHRoaXMgbGlzdCBkb2VzIG5vdCBjb250YWluIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IG5keCA9IDA7Ci0KLSAgICAgICAgLy8gcGVyZm9ybSB0aGUgbnVsbCBjaGVjayBvdXRzaWRlIG9mIHRoZSBsb29wIHRvIHNhdmUgY2hlY2tpbmcgZXZlcnkKLSAgICAgICAgLy8gc2luZ2xlIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4KLSAgICAgICAgaWYgKG51bGwgPT0gbykgewotICAgICAgICAgICAgZm9yKExpc3RhYmxlIGVsdCA9IF9oZWFkLm5leHQoKSwgcGFzdCA9IG51bGw7IG51bGwgIT0gZWx0ICYmIHBhc3QgIT0gX2hlYWQucHJldigpOyBlbHQgPSAocGFzdCA9IGVsdCkubmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZWx0LnZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5keDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmR4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGZvcihMaXN0YWJsZSBlbHQgPSBfaGVhZC5uZXh0KCksIHBhc3QgPSBudWxsOyBudWxsICE9IGVsdCAmJiBwYXN0ICE9IF9oZWFkLnByZXYoKTsgZWx0ID0gKHBhc3QgPSBlbHQpLm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChvLmVxdWFscyhlbHQudmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5keDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmR4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIGxpc3QgY29udGFpbnMgbm8gZWxlbWVudHMuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbGlzdCBjb250YWlucyBubyBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4oMCA9PSBfc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZhaWwtZmFzdCBpdGVyYXRvci4KLSAgICAgKiBAc2VlIExpc3QjaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhpcyBsaXN0IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGVsZW1lbnQsIG9yIC0xIGlmIHRoaXMgbGlzdCBkb2VzIG5vdCBjb250YWluIHRoaXMgZWxlbWVudC4KLSAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIHRoZSBoaWdoZXN0IGluZGV4IDx0dD5pPC90dD4gc3VjaCB0aGF0Ci0gICAgICogPHR0PihvPT1udWxsID8gZ2V0KGkpPT1udWxsIDogby5lcXVhbHMoZ2V0KGkpKSk8L3R0PiwKLSAgICAgKiBvciAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotICAgICAqCi0gICAgICogQHBhcmFtIG8gZWxlbWVudCB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGluIHRoaXMgbGlzdCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAJICAgICAgIGVsZW1lbnQsIG9yIC0xIGlmIHRoaXMgbGlzdCBkb2VzIG5vdCBjb250YWluIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0gICAgICAgIGludCBuZHggPSBfc2l6ZS0xOwotCi0gICAgICAgIC8vIHBlcmZvcm0gdGhlIG51bGwgY2hlY2sgb3V0c2lkZSBvZiB0aGUgbG9vcCB0byBzYXZlIGNoZWNraW5nIGV2ZXJ5Ci0gICAgICAgIC8vIHNpbmdsZSB0aW1lIHRocm91Z2ggdGhlIGxvb3AuCi0gICAgICAgIGlmIChudWxsID09IG8pIHsKLSAgICAgICAgICAgIGZvcihMaXN0YWJsZSBlbHQgPSBfaGVhZC5wcmV2KCksIHBhc3QgPSBudWxsOyBudWxsICE9IGVsdCAmJiBwYXN0ICE9IF9oZWFkLm5leHQoKTsgZWx0ID0gKHBhc3QgPSBlbHQpLnByZXYoKSkgewotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVsdC52YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5keC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yKExpc3RhYmxlIGVsdCA9IF9oZWFkLnByZXYoKSwgcGFzdCA9IG51bGw7IG51bGwgIT0gZWx0ICYmIHBhc3QgIT0gX2hlYWQubmV4dCgpOyBlbHQgPSAocGFzdCA9IGVsdCkucHJldigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8uZXF1YWxzKGVsdC52YWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmR4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZHgtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZhaWwtZmFzdCBMaXN0SXRlcmF0b3IuCi0gICAgICogQHNlZSBMaXN0I2xpc3RJdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmYWlsLWZhc3QgTGlzdEl0ZXJhdG9yLgotICAgICAqIEBzZWUgTGlzdCNsaXN0SXRlcmF0b3IoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotICAgICAgICBpZihpbmRleDwwIHx8IGluZGV4ID4gX3NpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4ICsgIiA8IDAgb3IgPiAiICsgX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXIoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhpcyBsaXN0IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLSAgICAgKiBJZiB0aGlzIGxpc3QgZG9lcyBub3QgY29udGFpbiB0aGUgZWxlbWVudCwgaXQgaXMKLSAgICAgKiB1bmNoYW5nZWQuICBNb3JlIGZvcm1hbGx5LCByZW1vdmVzIHRoZSBlbGVtZW50IHdpdGggdGhlIGxvd2VzdCBpbmRleCBpCi0gICAgICogc3VjaCB0aGF0IDx0dD4obz09bnVsbCA/IGdldChpKT09bnVsbCA6IG8uZXF1YWxzKGdldChpKSkpPC90dD4gKGlmCi0gICAgICogc3VjaCBhbiBlbGVtZW50IGV4aXN0cykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBlbGVtZW50IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGxpc3QsIGlmIHByZXNlbnQuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbGlzdCBjb250YWluZWQgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICBmb3IoTGlzdGFibGUgZWx0ID0gX2hlYWQubmV4dCgpLCBwYXN0ID0gbnVsbDsgbnVsbCAhPSBlbHQgJiYgcGFzdCAhPSBfaGVhZC5wcmV2KCk7IGVsdCA9IChwYXN0ID0gZWx0KS5uZXh0KCkpIHsKLSAgICAgICAgICAgIGlmKG51bGwgPT0gbyAmJiBudWxsID09IGVsdC52YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGFibGUoZWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihvICE9IG51bGwgJiYgby5lcXVhbHMoZWx0LnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGFibGUoZWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdCAob3B0aW9uYWwKLSAgICAgKiBvcGVyYXRpb24pLiAgU2hpZnRzIGFueSBzdWJzZXF1ZW50IGVsZW1lbnRzIHRvIHRoZSBsZWZ0IChzdWJ0cmFjdHMgb25lCi0gICAgICogZnJvbSB0aGVpciBpbmRpY2VzKS4gIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZQotICAgICAqIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZWQuCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBwcmV2aW91c2x5IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSAoaW5kZXgKLSAgICAgKiAgICAgICAgICAgICZsdDsgMCB8fCBpbmRleCAmZ3Q7PSBzaXplKCkpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICBMaXN0YWJsZSBlbHQgPSBnZXRMaXN0YWJsZUF0KGluZGV4KTsKLSAgICAgICAgT2JqZWN0IHJldCA9IGVsdC52YWx1ZSgpOwotICAgICAgICByZW1vdmVMaXN0YWJsZShlbHQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgZnJvbSB0aGlzIGxpc3QgYWxsIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBjb2xsZWN0aW9uIHRoYXQgZGVmaW5lcyB3aGljaCBlbGVtZW50cyB3aWxsIGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgIHRoaXMgbGlzdC4KLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotICAgICAgICBpZigwID09IGMuc2l6ZSgpIHx8IDAgPT0gX3NpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYoYy5jb250YWlucyhpdC5uZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBsaXN0LCBpZiBhbnkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmVGaXJzdCgpIHsKLSAgICAgICAgaWYoX2hlYWQubmV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSBfaGVhZC5uZXh0KCkudmFsdWUoKTsKLSAgICAgICAgICAgIHJlbW92ZUxpc3RhYmxlKF9oZWFkLm5leHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIGxpc3QsIGlmIGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUxhc3QoKSB7Ci0gICAgICAgIGlmKF9oZWFkLnByZXYoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsID0gX2hlYWQucHJldigpLnZhbHVlKCk7Ci0gICAgICAgICAgICByZW1vdmVMaXN0YWJsZShfaGVhZC5wcmV2KCkpOwotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRhaW5zIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uICBJbiBvdGhlciB3b3JkcywgcmVtb3ZlcwotICAgICAqIGZyb20gdGhpcyBsaXN0IGFsbCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIGNvbGxlY3Rpb24gdGhhdCBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHRoaXMgc2V0IHdpbGwgcmV0YWluLgotICAgICAqCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZighYy5jb250YWlucyhpdC5uZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3Qgd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBlbGVtZW50IHRvIHJlcGxhY2UuCi0gICAgICogQHBhcmFtIGVsZW1lbnQgZWxlbWVudCB0byBiZSBzdG9yZWQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHByZXZpb3VzbHkgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAgICAgKiAJCSAgcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzIGxpc3QuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZAotICAgICAqCSAgICAgICAgZWxlbWVudCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgbGlzdC4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgICAqCQkgICAgIChpbmRleCAmbHQ7IDAgfHwgaW5kZXggJmd0Oz0gc2l6ZSgpKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIExpc3RhYmxlIGVsdCA9IGdldExpc3RhYmxlQXQoaW5kZXgpOwotICAgICAgICBPYmplY3QgdmFsID0gZWx0LnNldFZhbHVlKGVsZW1lbnQpOwotICAgICAgICBicm9hZGNhc3RMaXN0YWJsZUNoYW5nZWQoZWx0KTsKLSAgICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBsaXN0LgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gX3NpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHByb3BlcgotICAgICAqIHNlcXVlbmNlLiAgT2JleXMgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlIHtAbGluayBDb2xsZWN0aW9uI3RvQXJyYXl9IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIKLSAgICAgKiAgICAgICAgIHNlcXVlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IG5ldyBPYmplY3RbX3NpemVdOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvcihMaXN0YWJsZSBlbHQgPSBfaGVhZC5uZXh0KCksIHBhc3QgPSBudWxsOyBudWxsICE9IGVsdCAmJiBwYXN0ICE9IF9oZWFkLnByZXYoKTsgZWx0ID0gKHBhc3QgPSBlbHQpLm5leHQoKSkgewotICAgICAgICAgICAgYXJyYXlbaSsrXSA9IGVsdC52YWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QgaW4gcHJvcGVyCi0gICAgICogc2VxdWVuY2U7IHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlCi0gICAgICogc3BlY2lmaWVkIGFycmF5LiBPYmV5cyB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiB0aGUKLSAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbiN0b0FycmF5fSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYSAgICAgIHRoZSBhcnJheSBpbnRvIHdoaWNoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgYXJlIHRvCi0gICAgICogICAgICAgICAgICAgICBiZSBzdG9yZWQsIGlmIGl0IGlzIGJpZyBlbm91Z2g7IG90aGVyd2lzZSwgYSBuZXcgYXJyYXkgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgICBzYW1lIHJ1bnRpbWUgdHlwZSBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdC4KLSAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICBpZiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKLSAgICAgKiAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBzdXBlcnR5cGUgb2YgdGhlIHJ1bnRpbWUgdHlwZSBvZiBldmVyeSBlbGVtZW50IGluCi0gICAgICogICAgICAgICAgICAgICAgICAgdGhpcyBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdCBhW10pIHsKLSAgICAgICAgaWYoYS5sZW5ndGggPCBfc2l6ZSkgewotICAgICAgICAgICAgYSA9IChPYmplY3RbXSlBcnJheS5uZXdJbnN0YW5jZShhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IoTGlzdGFibGUgZWx0ID0gX2hlYWQubmV4dCgpLCBwYXN0ID0gbnVsbDsgbnVsbCAhPSBlbHQgJiYgcGFzdCAhPSBfaGVhZC5wcmV2KCk7IGVsdCA9IChwYXN0ID0gZWx0KS5uZXh0KCkpIHsKLSAgICAgICAgICAgIGFbaSsrXSA9IGVsdC52YWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGEubGVuZ3RoID4gX3NpemUpIHsKLSAgICAgICAgICAgIGFbX3NpemVdID0gbnVsbDsgLy8gc2hvdWxkIHdlIG51bGwgb3V0IHRoZSByZXN0IG9mIHRoZSBhcnJheSBhbHNvPyBqYXZhLnV0aWwuTGlua2VkTGlzdCBkb2Vzbid0Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbGlzdCwgc3VpdGFibGUgZm9yIGRlYnVnZ2luZy4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsaXN0LCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlsiKTsKLSAgICAgICAgZm9yKExpc3RhYmxlIGVsdCA9IF9oZWFkLm5leHQoKSwgcGFzdCA9IG51bGw7IG51bGwgIT0gZWx0ICYmIHBhc3QgIT0gX2hlYWQucHJldigpOyBlbHQgPSAocGFzdCA9IGVsdCkubmV4dCgpKSB7Ci0gICAgICAgICAgICBpZihfaGVhZC5uZXh0KCkgIT0gZWx0KSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZWx0LnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmYWlsLWZhc3Qgc3VibGlzdC4KLSAgICAgKiBAc2VlIExpc3Qjc3ViTGlzdChpbnQsaW50KQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGksIGludCBqKSB7Ci0gICAgICAgIGlmKGkgPCAwIHx8IGogPiBfc2l6ZSB8fCBpID4gaikgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmKGkgPT0gMCAmJiBqID09IF9zaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yYWJsZVN1Ykxpc3QodGhpcyxpLGopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IDxpPnZhbHVlPC9pPiBpbnRvIG15Ci0gICAgICogbGlzdCwgYWZ0ZXIgdGhlIHNwZWNpZmllZCA8aT5iZWZvcmU8L2k+IGVsZW1lbnQsIGFuZCBiZWZvcmUgdGhlCi0gICAgICogc3BlY2lmaWVkIDxpPmFmdGVyPC9pPiBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ3Vyc29yYWJsZUxpbmtlZExpc3QuTGlzdGFibGV9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RhYmxlIGluc2VydExpc3RhYmxlKExpc3RhYmxlIGJlZm9yZSwgTGlzdGFibGUgYWZ0ZXIsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBfbW9kQ291bnQrKzsKLSAgICAgICAgX3NpemUrKzsKLSAgICAgICAgTGlzdGFibGUgZWx0ID0gbmV3IExpc3RhYmxlKGJlZm9yZSxhZnRlcix2YWx1ZSk7Ci0gICAgICAgIGlmKG51bGwgIT0gYmVmb3JlKSB7Ci0gICAgICAgICAgICBiZWZvcmUuc2V0TmV4dChlbHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hlYWQuc2V0TmV4dChlbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobnVsbCAhPSBhZnRlcikgewotICAgICAgICAgICAgYWZ0ZXIuc2V0UHJldihlbHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hlYWQuc2V0UHJldihlbHQpOwotICAgICAgICB9Ci0gICAgICAgIGJyb2FkY2FzdExpc3RhYmxlSW5zZXJ0ZWQoZWx0KTsKLSAgICAgICAgcmV0dXJuIGVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiAKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkN1cnNvcmFibGVMaW5rZWRMaXN0Lkxpc3RhYmxlfSAKLSAgICAgKiBmcm9tIG15IGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGFibGUoTGlzdGFibGUgZWx0KSB7Ci0gICAgICAgIF9tb2RDb3VudCsrOwotICAgICAgICBfc2l6ZS0tOwotICAgICAgICBpZihfaGVhZC5uZXh0KCkgPT0gZWx0KSB7Ci0gICAgICAgICAgICBfaGVhZC5zZXROZXh0KGVsdC5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKG51bGwgIT0gZWx0Lm5leHQoKSkgewotICAgICAgICAgICAgZWx0Lm5leHQoKS5zZXRQcmV2KGVsdC5wcmV2KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKF9oZWFkLnByZXYoKSA9PSBlbHQpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldFByZXYoZWx0LnByZXYoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobnVsbCAhPSBlbHQucHJldigpKSB7Ci0gICAgICAgICAgICBlbHQucHJldigpLnNldE5leHQoZWx0Lm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJvYWRjYXN0TGlzdGFibGVSZW1vdmVkKGVsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5DdXJzb3JhYmxlTGlua2VkTGlzdC5MaXN0YWJsZX0gCi0gICAgICogYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBsZXNzIHRoYW4gemVybyBvcgotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdGFibGUgZ2V0TGlzdGFibGVBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYoaW5kZXggPCAwIHx8IGluZGV4ID49IF9zaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkgKyAiIDwgMCBvciAiICsgU3RyaW5nLnZhbHVlT2YoaW5kZXgpICsgIiA+PSAiICsgX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGluZGV4IDw9X3NpemUvMikgewotICAgICAgICAgICAgTGlzdGFibGUgZWx0ID0gX2hlYWQubmV4dCgpOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBlbHQgPSBlbHQubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVsdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3RhYmxlIGVsdCA9IF9oZWFkLnByZXYoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IChfc2l6ZS0xKTsgaSA+IGluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICBlbHQgPSBlbHQucHJldigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIHtAbGluayBDdXJzb3JhYmxlTGlua2VkTGlzdC5DdXJzb3J9IHRvIGJlIG5vdGlmaWVkCi0gICAgICogb2YgY2hhbmdlcyB0byB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDdXJzb3IoQ3Vyc29yIGN1cikgewotICAgICAgICAvLyBXZSB0YWtlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdGhlIF9jdXJzb3JzIGxpc3QKLSAgICAgICAgLy8gb2YgV2Vha1JlZmVyZW5jZSBvYmplY3RzIHRvIGdhcmJhZ2UtY29sbGVjdGVkIGN1cnNvcnMuCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfY3Vyc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSAoV2Vha1JlZmVyZW5jZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlZi5nZXQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIF9jdXJzb3JzLmFkZCggbmV3IFdlYWtSZWZlcmVuY2UoY3VyKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSB7QGxpbmsgQ3Vyc29yYWJsZUxpbmtlZExpc3QuQ3Vyc29yfSBmcm9tCi0gICAgICogdGhlIHNldCBvZiBjdXJzb3JzIHRvIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhpcyBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJDdXJzb3IoQ3Vyc29yIGN1cikgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gX2N1cnNvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFdlYWtSZWZlcmVuY2UgcmVmID0gKFdlYWtSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSAoQ3Vyc29yKSByZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBzb21lIG90aGVyIHVucmVsYXRlZCBjdXJzb3Igb2JqZWN0IGhhcyBiZWVuIAotICAgICAgICAgICAgICAgIC8vIGdhcmJhZ2UtY29sbGVjdGVkOyBsZXQncyB0YWtlIHRoZSBvcHBvcnR1bml0eSB0bwotICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIHRoZSBjdXJzb3JzIGxpc3QgYW55d2F5Li4KLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yID09IGN1cikgewotICAgICAgICAgICAgICAgIHJlZi5jbGVhcigpOwotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyBhbGwgb2YgbXkgcmVnaXN0ZXJlZCBjdXJzb3JzIHRoYXQgdGhleSBhcmUgbm93Ci0gICAgICogaW52YWxpZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZhbGlkYXRlQ3Vyc29ycygpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBfY3Vyc29ycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHJlZiA9IChXZWFrUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gKEN1cnNvcikgcmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3Vyc29yIGlzIG51bGwgaWYgb2JqZWN0IGhhcyBiZWVuIGdhcmJhZ2UtY29sbGVjdGVkCi0gICAgICAgICAgICAgICAgY3Vyc29yLmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICByZWYuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyBhbGwgb2YgbXkgcmVnaXN0ZXJlZCBjdXJzb3JzIHRoYXQgdGhlIHNwZWNpZmllZAotICAgICAqIGVsZW1lbnQgd2FzIGNoYW5nZWQuCi0gICAgICogQHNlZSAjc2V0KGludCxqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJyb2FkY2FzdExpc3RhYmxlQ2hhbmdlZChMaXN0YWJsZSBlbHQpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBfY3Vyc29ycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHJlZiA9IChXZWFrUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gKEN1cnNvcikgcmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7IC8vIGNsZWFuIHVwIGxpc3QKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmxpc3RhYmxlQ2hhbmdlZChlbHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyBhbGwgb2YgbXkgcmVnaXN0ZXJlZCBjdXJzb3JzIHRoYXQgdGhlIHNwZWNpZmllZAotICAgICAqIGVsZW1lbnQgd2FzIGp1c3QgcmVtb3ZlZCBmcm9tIG15IGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0TGlzdGFibGVSZW1vdmVkKExpc3RhYmxlIGVsdCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IF9jdXJzb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFdlYWtSZWZlcmVuY2UgcmVmID0gKFdlYWtSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSAoQ3Vyc29yKSByZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsgLy8gY2xlYW4gdXAgbGlzdAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJzb3IubGlzdGFibGVSZW1vdmVkKGVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIGFsbCBvZiBteSByZWdpc3RlcmVkIGN1cnNvcnMgdGhhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogZWxlbWVudCB3YXMganVzdCBhZGRlZCB0byBteSBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJyb2FkY2FzdExpc3RhYmxlSW5zZXJ0ZWQoTGlzdGFibGUgZWx0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gX2N1cnNvcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSAoV2Vha1JlZmVyZW5jZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IChDdXJzb3IpIHJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOyAgLy8gY2xlYW4gdXAgbGlzdAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJzb3IubGlzdGFibGVJbnNlcnRlZChlbHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlSW50KF9zaXplKTsKLSAgICAgICAgTGlzdGFibGUgY3VyID0gX2hlYWQubmV4dCgpOwotICAgICAgICB3aGlsZSAoY3VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChjdXIudmFsdWUoKSk7Ci0gICAgICAgICAgICBjdXIgPSBjdXIubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIF9zaXplID0gMDsKLSAgICAgICAgX21vZENvdW50ID0gMDsKLSAgICAgICAgX2N1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIF9oZWFkID0gbmV3IExpc3RhYmxlKG51bGwsbnVsbCxudWxsKTsKLSAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHNpemU7aSsrKSB7Ci0gICAgICAgICAgICB0aGlzLmFkZChpbi5yZWFkT2JqZWN0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0gcHJvdGVjdGVkIGF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtZS4gKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBfc2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBIHNlbnRyeSBub2RlLgotICAgICAqIDxwPgotICAgICAqIDx0dD5faGVhZC5uZXh0KCk8L3R0PiBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpc3QsCi0gICAgICogPHR0Pl9oZWFkLnByZXYoKTwvdHQ+IHRvIHRoZSBsYXN0LiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yCi0gICAgICogPHR0Pl9oZWFkLm5leHQoKS5wcmV2KCk8L3R0PiBhbmQgPHR0Pl9oZWFkLnByZXYoKS5uZXh0KCk8L3R0PiB0byBiZQotICAgICAqIG5vbi1udWxsLCBhcyB3aGVuIEkgYW0gYSBzdWJsaXN0IGZvciBzb21lIGxhcmdlciBsaXN0LgotICAgICAqIFVzZSA8dHQ+PT0gX2hlYWQubmV4dCgpPC90dD4gYW5kIDx0dD49PSBfaGVhZC5wcmV2KCk8L3R0PiB0byBkZXRlcm1pbmUKLSAgICAgKiBpZiBhIGdpdmVuIAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ3Vyc29yYWJsZUxpbmtlZExpc3QuTGlzdGFibGV9IAotICAgICAqIGlzIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgaW4gdGhlIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0YWJsZSBfaGVhZCA9IG5ldyBMaXN0YWJsZShudWxsLG51bGwsbnVsbCk7Ci0KLSAgICAvKiogVHJhY2tzIHRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBtb2RpZmljYXRpb25zIHRvIG1lLiAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IF9tb2RDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSB7QGxpbmsgQ3Vyc29yYWJsZUxpbmtlZExpc3QuQ3Vyc29yfXMgY3VycmVudGx5Ci0gICAgICogb3BlbiBpbiB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0IF9jdXJzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8tLS0gaW5uZXIgY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBzdGF0aWMgY2xhc3MgTGlzdGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgICAgICBwcml2YXRlIExpc3RhYmxlIF9wcmV2ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBMaXN0YWJsZSBfbmV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IF92YWwgPSBudWxsOwotCi0gICAgICAgIExpc3RhYmxlKExpc3RhYmxlIHByZXYsIExpc3RhYmxlIG5leHQsIE9iamVjdCB2YWwpIHsKLSAgICAgICAgICAgIF9wcmV2ID0gcHJldjsKLSAgICAgICAgICAgIF9uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIF92YWwgPSB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0YWJsZSBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIF9uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdGFibGUgcHJldigpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJldjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfdmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXROZXh0KExpc3RhYmxlIG5leHQpIHsKLSAgICAgICAgICAgIF9uZXh0ID0gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UHJldihMaXN0YWJsZSBwcmV2KSB7Ci0gICAgICAgICAgICBfcHJldiA9IHByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbCkgewotICAgICAgICAgICAgT2JqZWN0IHRlbXAgPSBfdmFsOwotICAgICAgICAgICAgX3ZhbCA9IHZhbDsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTGlzdEl0ZXIgaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IgewotICAgICAgICBMaXN0YWJsZSBfY3VyID0gbnVsbDsKLSAgICAgICAgTGlzdGFibGUgX2xhc3RSZXR1cm5lZCA9IG51bGw7Ci0gICAgICAgIGludCBfZXhwZWN0ZWRNb2RDb3VudCA9IF9tb2RDb3VudDsKLSAgICAgICAgaW50IF9uZXh0SW5kZXggPSAwOwotCi0gICAgICAgIExpc3RJdGVyKGludCBpbmRleCkgewotICAgICAgICAgICAgaWYoaW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgIF9jdXIgPSBuZXcgTGlzdGFibGUobnVsbCxfaGVhZC5uZXh0KCksbnVsbCk7Ci0gICAgICAgICAgICAgICAgX25leHRJbmRleCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoaW5kZXggPT0gX3NpemUpIHsKLSAgICAgICAgICAgICAgICBfY3VyID0gbmV3IExpc3RhYmxlKF9oZWFkLnByZXYoKSxudWxsLG51bGwpOwotICAgICAgICAgICAgICAgIF9uZXh0SW5kZXggPSBfc2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGlzdGFibGUgdGVtcCA9IGdldExpc3RhYmxlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIF9jdXIgPSBuZXcgTGlzdGFibGUodGVtcC5wcmV2KCksdGVtcCxudWxsKTsKLSAgICAgICAgICAgICAgICBfbmV4dEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICAgICAgaWYoIWhhc1ByZXZpb3VzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgcmV0ID0gX2N1ci5wcmV2KCkudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBfbGFzdFJldHVybmVkID0gX2N1ci5wcmV2KCk7Ci0gICAgICAgICAgICAgICAgX2N1ci5zZXROZXh0KF9jdXIucHJldigpKTsKLSAgICAgICAgICAgICAgICBfY3VyLnNldFByZXYoX2N1ci5wcmV2KCkucHJldigpKTsKLSAgICAgICAgICAgICAgICBfbmV4dEluZGV4LS07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgICAgICByZXR1cm4obnVsbCAhPSBfY3VyLm5leHQoKSAmJiBfY3VyLnByZXYoKSAhPSBfaGVhZC5wcmV2KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICAgICAgaWYoIWhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9iamVjdCByZXQgPSBfY3VyLm5leHQoKS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIF9sYXN0UmV0dXJuZWQgPSBfY3VyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBfY3VyLnNldFByZXYoX2N1ci5uZXh0KCkpOwotICAgICAgICAgICAgICAgIF9jdXIuc2V0TmV4dChfY3VyLm5leHQoKS5uZXh0KCkpOwotICAgICAgICAgICAgICAgIF9uZXh0SW5kZXgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICAgICAgaWYoIWhhc1ByZXZpb3VzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX25leHRJbmRleC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgICAgICByZXR1cm4obnVsbCAhPSBfY3VyLnByZXYoKSAmJiBfY3VyLm5leHQoKSAhPSBfaGVhZC5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIF9sYXN0UmV0dXJuZWQuc2V0VmFsdWUobyk7Ci0gICAgICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgICAgIGlmKCFoYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9uZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgICAgICBpZihudWxsID09IF9sYXN0UmV0dXJuZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9jdXIuc2V0TmV4dChfbGFzdFJldHVybmVkID09IF9oZWFkLnByZXYoKSA/IG51bGwgOiBfbGFzdFJldHVybmVkLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgX2N1ci5zZXRQcmV2KF9sYXN0UmV0dXJuZWQgPT0gX2hlYWQubmV4dCgpID8gbnVsbCA6IF9sYXN0UmV0dXJuZWQucHJldigpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVMaXN0YWJsZShfbGFzdFJldHVybmVkKTsKLSAgICAgICAgICAgICAgICBfbGFzdFJldHVybmVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfbmV4dEluZGV4LS07Ci0gICAgICAgICAgICAgICAgX2V4cGVjdGVkTW9kQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICAgICAgX2N1ci5zZXRQcmV2KGluc2VydExpc3RhYmxlKF9jdXIucHJldigpLF9jdXIubmV4dCgpLG8pKTsKLSAgICAgICAgICAgIF9sYXN0UmV0dXJuZWQgPSBudWxsOwotICAgICAgICAgICAgX25leHRJbmRleCsrOwotICAgICAgICAgICAgX2V4cGVjdGVkTW9kQ291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrRm9yQ29tb2QoKSB7Ci0gICAgICAgICAgICBpZihfZXhwZWN0ZWRNb2RDb3VudCAhPSBfbW9kQ291bnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEN1cnNvciBleHRlbmRzIExpc3RJdGVyIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKLSAgICAgICAgYm9vbGVhbiBfdmFsaWQgPSBmYWxzZTsKLQotICAgICAgICBDdXJzb3IoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBzdXBlcihpbmRleCk7Ci0gICAgICAgICAgICBfdmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgcmVnaXN0ZXJDdXJzb3IodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgICAgIExpc3RhYmxlIGVsdCA9IGluc2VydExpc3RhYmxlKF9jdXIucHJldigpLF9jdXIubmV4dCgpLG8pOwotICAgICAgICAgICAgX2N1ci5zZXRQcmV2KGVsdCk7Ci0gICAgICAgICAgICBfY3VyLnNldE5leHQoZWx0Lm5leHQoKSk7Ci0gICAgICAgICAgICBfbGFzdFJldHVybmVkID0gbnVsbDsKLSAgICAgICAgICAgIF9uZXh0SW5kZXgrKzsKLSAgICAgICAgICAgIF9leHBlY3RlZE1vZENvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0YWJsZVJlbW92ZWQoTGlzdGFibGUgZWx0KSB7Ci0gICAgICAgICAgICBpZihudWxsID09IF9oZWFkLnByZXYoKSkgewotICAgICAgICAgICAgICAgIF9jdXIuc2V0TmV4dChudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihfY3VyLm5leHQoKSA9PSBlbHQpIHsKLSAgICAgICAgICAgICAgICBfY3VyLnNldE5leHQoZWx0Lm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihudWxsID09IF9oZWFkLm5leHQoKSkgewotICAgICAgICAgICAgICAgIF9jdXIuc2V0UHJldihudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihfY3VyLnByZXYoKSA9PSBlbHQpIHsKLSAgICAgICAgICAgICAgICBfY3VyLnNldFByZXYoZWx0LnByZXYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihfbGFzdFJldHVybmVkID09IGVsdCkgewotICAgICAgICAgICAgICAgIF9sYXN0UmV0dXJuZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgbGlzdGFibGVJbnNlcnRlZChMaXN0YWJsZSBlbHQpIHsKLSAgICAgICAgICAgIGlmKG51bGwgPT0gX2N1ci5uZXh0KCkgJiYgbnVsbCA9PSBfY3VyLnByZXYoKSkgewotICAgICAgICAgICAgICAgIF9jdXIuc2V0TmV4dChlbHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmKF9jdXIucHJldigpID09IGVsdC5wcmV2KCkpIHsKLSAgICAgICAgICAgICAgICBfY3VyLnNldE5leHQoZWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKF9jdXIubmV4dCgpID09IGVsdC5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBfY3VyLnNldFByZXYoZWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKF9sYXN0UmV0dXJuZWQgPT0gZWx0KSB7Ci0gICAgICAgICAgICAgICAgX2xhc3RSZXR1cm5lZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0YWJsZUNoYW5nZWQoTGlzdGFibGUgZWx0KSB7Ci0gICAgICAgICAgICBpZihfbGFzdFJldHVybmVkID09IGVsdCkgewotICAgICAgICAgICAgICAgIF9sYXN0UmV0dXJuZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JDb21vZCgpIHsKLSAgICAgICAgICAgIGlmKCFfdmFsaWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW52YWxpZGF0ZSgpIHsKLSAgICAgICAgICAgIF92YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1hcmsgdGhpcyBjdXJzb3IgYXMgbm8gbG9uZ2VyIGJlaW5nIG5lZWRlZC4gQW55IHJlc291cmNlcwotICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3IgYXJlIGltbWVkaWF0ZWx5IHJlbGVhc2VkLgotICAgICAgICAgKiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNsYXNzLCBpdCB3YXMgbWFuZGF0b3J5IHRvIGNsb3NlCi0gICAgICAgICAqIGFsbCBjdXJzb3Igb2JqZWN0cyB0byBhdm9pZCBtZW1vcnkgbGVha3MuIEl0IGlzIDxpPm5vIGxvbmdlcjwvaT4KLSAgICAgICAgICogbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBjbG9zZSBtZXRob2Q7IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgICogY2FuIG5vdyBiZSB0cmVhdGVkIGV4YWN0bHkgbGlrZSBhIG5vcm1hbCBpdGVyYXRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgaWYoX3ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgX3ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdW5yZWdpc3RlckN1cnNvcih0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBuZXcgdmVyc2lvbiBpbiBsaXN0IHN1YnBhY2thZ2UsIHdoaWNoIGhhcyBiZWVuIHJld3JpdHRlbgotICogIGFuZCBub3cgcmV0dXJucyB0aGUgY3Vyc29yIGZyb20gdGhlIGxpc3RJdGVyYXRvciBtZXRob2QuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wCi0gKi8KLWNsYXNzIEN1cnNvcmFibGVTdWJMaXN0IGV4dGVuZHMgQ3Vyc29yYWJsZUxpbmtlZExpc3QgaW1wbGVtZW50cyBMaXN0IHsKLQotICAgIC8vLS0tIGNvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQ3Vyc29yYWJsZVN1Ykxpc3QoQ3Vyc29yYWJsZUxpbmtlZExpc3QgbGlzdCwgaW50IGZyb20sIGludCB0bykgewotICAgICAgICBpZigwID4gZnJvbSB8fCBsaXN0LnNpemUoKSA8IHRvKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYoZnJvbSA+IHRvKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgX2xpc3QgPSBsaXN0OwotICAgICAgICBpZihmcm9tIDwgbGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldE5leHQoX2xpc3QuZ2V0TGlzdGFibGVBdChmcm9tKSk7Ci0gICAgICAgICAgICBfcHJlID0gKG51bGwgPT0gX2hlYWQubmV4dCgpKSA/IG51bGwgOiBfaGVhZC5uZXh0KCkucHJldigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX3ByZSA9IF9saXN0LmdldExpc3RhYmxlQXQoZnJvbS0xKTsKLSAgICAgICAgfQotICAgICAgICBpZihmcm9tID09IHRvKSB7Ci0gICAgICAgICAgICBfaGVhZC5zZXROZXh0KG51bGwpOwotICAgICAgICAgICAgX2hlYWQuc2V0UHJldihudWxsKTsKLSAgICAgICAgICAgIGlmKHRvIDwgbGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBfcG9zdCA9IF9saXN0LmdldExpc3RhYmxlQXQodG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfcG9zdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfaGVhZC5zZXRQcmV2KF9saXN0LmdldExpc3RhYmxlQXQodG8tMSkpOwotICAgICAgICAgICAgX3Bvc3QgPSBfaGVhZC5wcmV2KCkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIF9zaXplID0gdG8gLSBmcm9tOwotICAgICAgICBfbW9kQ291bnQgPSBfbGlzdC5fbW9kQ291bnQ7Ci0gICAgfQotCi0gICAgLy8tLS0gcHVibGljIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0IGFbXSkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci50b0FycmF5KGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmVGaXJzdCgpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlRmlyc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUxhc3QoKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxhc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuYWRkKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEZpcnN0KE9iamVjdCBvKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEZpcnN0KG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZExhc3QoT2JqZWN0IG8pIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuYWRkTGFzdChvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChpbmRleCxjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIucmV0YWluQWxsKGMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuc2V0KGluZGV4LGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRGaXJzdCgpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Rmlyc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldExhc3QoKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHN1cGVyLmFkZChpbmRleCxlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIubGlzdEl0ZXJhdG9yKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLSAgICAgICAgY2hlY2tGb3JDb21vZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuaW5kZXhPZihvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmxhc3RJbmRleE9mKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICBjaGVja0ZvckNvbW9kKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5saXN0SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0gICAgICAgIGNoZWNrRm9yQ29tb2QoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnN1Ykxpc3QoZnJvbUluZGV4LHRvSW5kZXgpOwotICAgIH0KLQotICAgIC8vLS0tIHByb3RlY3RlZCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBhIG5ldyA8aT52YWx1ZTwvaT4gaW50byBteQotICAgICAqIGxpc3QsIGFmdGVyIHRoZSBzcGVjaWZpZWQgPGk+YmVmb3JlPC9pPiBlbGVtZW50LCBhbmQgYmVmb3JlIHRoZQotICAgICAqIHNwZWNpZmllZCA8aT5hZnRlcjwvaT4gZWxlbWVudAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgQ3Vyc29yYWJsZUxpbmtlZExpc3QuTGlzdGFibGV9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RhYmxlIGluc2VydExpc3RhYmxlKExpc3RhYmxlIGJlZm9yZSwgTGlzdGFibGUgYWZ0ZXIsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBfbW9kQ291bnQrKzsKLSAgICAgICAgX3NpemUrKzsKLSAgICAgICAgTGlzdGFibGUgZWx0ID0gX2xpc3QuaW5zZXJ0TGlzdGFibGUoKG51bGwgPT0gYmVmb3JlID8gX3ByZSA6IGJlZm9yZSksIChudWxsID09IGFmdGVyID8gX3Bvc3QgOiBhZnRlciksdmFsdWUpOwotICAgICAgICBpZihudWxsID09IF9oZWFkLm5leHQoKSkgewotICAgICAgICAgICAgX2hlYWQuc2V0TmV4dChlbHQpOwotICAgICAgICAgICAgX2hlYWQuc2V0UHJldihlbHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGJlZm9yZSA9PSBfaGVhZC5wcmV2KCkpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldFByZXYoZWx0KTsKLSAgICAgICAgfQotICAgICAgICBpZihhZnRlciA9PSBfaGVhZC5uZXh0KCkpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldE5leHQoZWx0KTsKLSAgICAgICAgfQotICAgICAgICBicm9hZGNhc3RMaXN0YWJsZUluc2VydGVkKGVsdCk7Ci0gICAgICAgIHJldHVybiBlbHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcmFibGVMaW5rZWRMaXN0Lkxpc3RhYmxlfSBmcm9tIG15IGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGFibGUoTGlzdGFibGUgZWx0KSB7Ci0gICAgICAgIF9tb2RDb3VudCsrOwotICAgICAgICBfc2l6ZS0tOwotICAgICAgICBpZihfaGVhZC5uZXh0KCkgPT0gZWx0ICYmIF9oZWFkLnByZXYoKSA9PSBlbHQpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldE5leHQobnVsbCk7Ci0gICAgICAgICAgICBfaGVhZC5zZXRQcmV2KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmKF9oZWFkLm5leHQoKSA9PSBlbHQpIHsKLSAgICAgICAgICAgIF9oZWFkLnNldE5leHQoZWx0Lm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoX2hlYWQucHJldigpID09IGVsdCkgewotICAgICAgICAgICAgX2hlYWQuc2V0UHJldihlbHQucHJldigpKTsKLSAgICAgICAgfQotICAgICAgICBfbGlzdC5yZW1vdmVMaXN0YWJsZShlbHQpOwotICAgICAgICBicm9hZGNhc3RMaXN0YWJsZVJlbW92ZWQoZWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIHNlZSBpZiBteSB1bmRlcmx5aW5nIGxpc3QgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgKiBieSBzb21lIG90aGVyIHByb2Nlc3MuICBJZiBpdCBoYXMsIHRocm93cyBhCi0gICAgICoge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LCBvdGhlcndpc2UKLSAgICAgKiBxdWlldGx5IHJldHVybnMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckNvbW9kKCkgdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZihfbW9kQ291bnQgIT0gX2xpc3QuX21vZENvdW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0gcHJvdGVjdGVkIGF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogTXkgdW5kZXJseWluZyBsaXN0ICovCi0gICAgcHJvdGVjdGVkIEN1cnNvcmFibGVMaW5rZWRMaXN0IF9saXN0ID0gbnVsbDsKLQotICAgIC8qKiBUaGUgZWxlbWVudCBpbiBteSB1bmRlcmx5aW5nIGxpc3QgcHJlY2VkaW5nIHRoZSBmaXJzdCBlbGVtZW50IGluIG15IGxpc3QuICovCi0gICAgcHJvdGVjdGVkIExpc3RhYmxlIF9wcmUgPSBudWxsOwotCi0gICAgLyoqIFRoZSBlbGVtZW50IGluIG15IHVuZGVybHlpbmcgbGlzdCBmb2xsb3dpbmcgdGhlIGxhc3QgZWxlbWVudCBpbiBteSBsaXN0LiAqLwotICAgIHByb3RlY3RlZCBMaXN0YWJsZSBfcG9zdCA9IG51bGw7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9EZWZhdWx0TWFwQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRGVmYXVsdE1hcEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzAxZjlkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9EZWZhdWx0TWFwQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVW5tb2RpZmlhYmxlU2V0OwotCi0vKioKLSAqIEEgc2tlbGV0YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBCYWd9Ci0gKiBpbnRlcmZhY2UgdG8gbWluaW1pemUgdGhlIGVmZm9ydCByZXF1aXJlZCBmb3IgdGFyZ2V0IGltcGxlbWVudGF0aW9ucy4KLSAqIFN1YmNsYXNzZXMgbmVlZCBvbmx5IHRvIGNhbGwgPGNvZGU+c2V0TWFwKE1hcCk8L2NvZGU+IGluIHRoZWlyIGNvbnN0cnVjdG9yIAotICogKG9yIGludm9rZSB0aGUgTWFwIGNvbnN0cnVjdG9yKSBzcGVjaWZ5aW5nIGEgbWFwIGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkCi0gKiB0byBzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIGJhZy4KLSAqIDxwPgotICogVGhlIG1hcCB3aWxsIGJlIHVzZWQgdG8gbWFwIGJhZyBlbGVtZW50cyB0byBhIG51bWJlcjsgdGhlIG51bWJlciByZXByZXNlbnRzCi0gKiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoYXQgZWxlbWVudCBpbiB0aGUgYmFnLgotICoKLSAqIEBkZXByZWNhdGVkIE1vdmVkIHRvIGJhZyBzdWJwYWNrYWdlIGFzIEFic3RyYWN0TWFwQmFnLiBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBDaHVjayBCdXJkaWNrCi0gKiBAYXV0aG9yIE1pY2hhZWwgQS4gU21pdGgKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIEphbmVrIEJvZ3Vja2kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRNYXBCYWcgaW1wbGVtZW50cyBCYWcgewotICAgIHByaXZhdGUgTWFwIF9tYXAgPSBudWxsOwotICAgIHByaXZhdGUgaW50IF90b3RhbCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgX21vZHMgPSAwOwotCi0gICAgLyoqCi0gICAgICogTm8tYXJndW1lbnQgY29uc3RydWN0b3IuICAKLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbnZva2UgPGNvZGU+c2V0TWFwKE1hcCk8L2NvZGU+IGluCi0gICAgICogdGhlaXIgY29uc3RydWN0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0TWFwQmFnKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgYXNzaWducyB0aGUgc3BlY2lmaWVkIE1hcCBhcyB0aGUgYmFja2luZyBzdG9yZS4KLSAgICAgKiBUaGUgbWFwIG11c3QgYmUgZW1wdHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBhc3NpZ24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdE1hcEJhZyhNYXAgbWFwKSB7Ci0gICAgICAgIHNldE1hcChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0byB0aGUgYmFnIGJ5IGluY3JlbWVudGluZyBpdHMgY291bnQgaW4gdGhlIAotICAgICAqIHVuZGVybHlpbmcgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3Qgd2FzIG5vdCBhbHJlYWR5IGluIHRoZSA8Y29kZT51bmlxdWVTZXQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZChvYmplY3QsIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0byB0aGUgYmFnIGJ5IGluY3JlbWVudGluZyBpdHMgY291bnQgaW4gdGhlIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEBwYXJhbSBuQ29waWVzICB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byBhZGQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3Qgd2FzIG5vdCBhbHJlYWR5IGluIHRoZSA8Y29kZT51bmlxdWVTZXQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QsIGludCBuQ29waWVzKSB7Ci0gICAgICAgIF9tb2RzKys7Ci0gICAgICAgIGlmIChuQ29waWVzID4gMCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gKG5Db3BpZXMgKyBnZXRDb3VudChvYmplY3QpKTsKLSAgICAgICAgICAgIF9tYXAucHV0KG9iamVjdCwgbmV3IEludGVnZXIoY291bnQpKTsKLSAgICAgICAgICAgIF90b3RhbCArPSBuQ29waWVzOwotICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSBuQ29waWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMge0BsaW5rICNhZGQoT2JqZWN0KX0gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBhZGQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2FsbCBjaGFuZ2VkIHRoZSBiYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpID0gY29sbC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBhZGQoaS5uZXh0KCkpOwotICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgYWRkZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBiYWcgYnkgY2xlYXJpbmcgdGhlIHVuZGVybHlpbmcgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBfbW9kcysrOwotICAgICAgICBfbWFwLmNsZWFyKCk7Ci0gICAgICAgIF90b3RhbCA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgYmFnIGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50IGJ5IGNoZWNraW5nIGlmIHRoZQotICAgICAqIHVuZGVybHlpbmcgbWFwIGNvbnRhaW5zIHRoZSBlbGVtZW50IGFzIGEga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBiYWcgY29udGFpbnMgdGhlIGdpdmVuIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBfbWFwLmNvbnRhaW5zS2V5KG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgYmFnIGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2sgYWdhaW5zdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEJhZyBjb250YWlucyBhbGwgdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zQWxsKG5ldyBIYXNoQmFnKGNvbGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBiYWcgY29udGFpbnMgYWxsIGVsZW1lbnRzIGluCi0gICAgICogdGhlIGdpdmVuIGNvbGxlY3Rpb24sIHJlc3BlY3RpbmcgY2FyZGluYWxpdHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG90aGVyICB0aGUgYmFnIHRvIGNoZWNrIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBCYWcgY29udGFpbnMgYWxsIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQmFnIG90aGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IG90aGVyLnVuaXF1ZVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnMgPSBnZXRDb3VudChjdXJyZW50KSA+PSBvdGhlci5nZXRDb3VudChjdXJyZW50KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBjb250YWluczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBudWxsLCBoYXMgdGhlIHByZWNpc2UgdHlwZSAKLSAgICAgKiBvZiB0aGlzIGJhZywgYW5kIGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBhbGwgdGhlCi0gICAgICogc2FtZSBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gdGVzdCBmb3IgZXF1YWxpdHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhhdCBvYmplY3QgZXF1YWxzIHRoaXMgYmFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQmFnID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQmFnIG90aGVyID0gKEJhZykgb2JqZWN0OwotICAgICAgICBpZiAob3RoZXIuc2l6ZSgpICE9IHNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKG90aGVyLmdldENvdW50KGVsZW1lbnQpICE9IGdldENvdW50KGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgdW5kZXJseWluZyBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhlIHVuZGVybHlpbmcgbWFwCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIF9tYXAuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgbWFwIGlzIGVtcHR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGlzIGJhZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBfbWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmFnSXRlcmF0b3IodGhpcywgZXh0cmFjdExpc3QoKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQmFnSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgICAgIHByaXZhdGUgRGVmYXVsdE1hcEJhZyBfcGFyZW50ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBfc3VwcG9ydCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IF9jdXJyZW50ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX21vZHMgPSAwOwotCi0gICAgICAgIHB1YmxpYyBCYWdJdGVyYXRvcihEZWZhdWx0TWFwQmFnIHBhcmVudCwgSXRlcmF0b3Igc3VwcG9ydCkgewotICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIF9zdXBwb3J0ID0gc3VwcG9ydDsKLSAgICAgICAgICAgIF9jdXJyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIF9tb2RzID0gcGFyZW50Lm1vZENvdW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIF9zdXBwb3J0Lmhhc05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGlmIChfcGFyZW50Lm1vZENvdW50KCkgIT0gX21vZHMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2N1cnJlbnQgPSBfc3VwcG9ydC5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAoX3BhcmVudC5tb2RDb3VudCgpICE9IF9tb2RzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9zdXBwb3J0LnJlbW92ZSgpOwotICAgICAgICAgICAgX3BhcmVudC5yZW1vdmUoX2N1cnJlbnQsIDEpOwotICAgICAgICAgICAgX21vZHMrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiByZW1vdmUob2JqZWN0LCBnZXRDb3VudChvYmplY3QpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCwgaW50IG5Db3BpZXMpIHsKLSAgICAgICAgX21vZHMrKzsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaW50IGNvdW50ID0gZ2V0Q291bnQob2JqZWN0KTsKLSAgICAgICAgaWYgKG5Db3BpZXMgPD0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPiBuQ29waWVzKSB7Ci0gICAgICAgICAgICBfbWFwLnB1dChvYmplY3QsIG5ldyBJbnRlZ2VyKGNvdW50IC0gbkNvcGllcykpOwotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIF90b3RhbCAtPSBuQ29waWVzOwotICAgICAgICB9IGVsc2UgeyAvLyBjb3VudCA+IDAgJiYgY291bnQgPD0gaSAgCi0gICAgICAgICAgICAvLyBuZWVkIHRvIHJlbW92ZSBhbGwKLSAgICAgICAgICAgIHJlc3VsdCA9IChfbWFwLnJlbW92ZShvYmplY3QpICE9IG51bGwpOwotICAgICAgICAgICAgX3RvdGFsIC09IGNvdW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBpZiAoY29sbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gY29sbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gcmVtb3ZlKGkubmV4dCgpLCAxKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgY2hhbmdlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbnkgbWVtYmVycyBvZiB0aGUgYmFnIHRoYXQgYXJlIG5vdCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiBiYWcsIHJlc3BlY3RpbmcgY2FyZGluYWxpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gcmV0YWluCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCBjaGFuZ2VkIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gcmV0YWluQWxsKG5ldyBIYXNoQmFnKGNvbGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYW55IG1lbWJlcnMgb2YgdGhlIGJhZyB0aGF0IGFyZSBub3QgaW4gdGhlIGdpdmVuCi0gICAgICogYmFnLCByZXNwZWN0aW5nIGNhcmRpbmFsaXR5LgotICAgICAqIEBzZWUgI3JldGFpbkFsbChDb2xsZWN0aW9uKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvdGhlciAgdGhlIGJhZyB0byByZXRhaW4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2FsbCBjaGFuZ2VkIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKEJhZyBvdGhlcikgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBCYWcgZXhjZXNzID0gbmV3IEhhc2hCYWcoKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHVuaXF1ZVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGludCBteUNvdW50ID0gZ2V0Q291bnQoY3VycmVudCk7Ci0gICAgICAgICAgICBpbnQgb3RoZXJDb3VudCA9IG90aGVyLmdldENvdW50KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKDEgPD0gb3RoZXJDb3VudCAmJiBvdGhlckNvdW50IDw9IG15Q291bnQpIHsKLSAgICAgICAgICAgICAgICBleGNlc3MuYWRkKGN1cnJlbnQsIG15Q291bnQgLSBvdGhlckNvdW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhjZXNzLmFkZChjdXJyZW50LCBteUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2Vzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlbW92ZUFsbChleGNlc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgb2YgdGhpcyBiYWcncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RMaXN0KCkudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBwb3B1bGF0ZQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICByZXR1cm4gZXh0cmFjdExpc3QoKS50b0FycmF5KGFycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGlzIGJhZwotICAgICAqIGJ5IGxvb2tpbmcgdXAgaXRzIGNvdW50IGluIHRoZSB1bmRlcmx5aW5nIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgb2JqZWN0LCB6ZXJvIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgSW50ZWdlciBjb3VudCA9IE1hcFV0aWxzLmdldEludGVnZXIoX21hcCwgb2JqZWN0KTsKLSAgICAgICAgaWYgKGNvdW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvdW50LmludFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSB1bmRlcmx5aW5nIG1hcCdzIGtleSBzZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoaXMgYmFnCi0gICAgICovCi0gICAgcHVibGljIFNldCB1bmlxdWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoX21hcC5rZXlTZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmFnLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmFnCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gX3RvdGFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdHVhbGx5IHdhbGtzIHRoZSBiYWcgdG8gbWFrZSBzdXJlIHRoZSBjb3VudCBpcyBjb3JyZWN0IGFuZAotICAgICAqIHJlc2V0cyB0aGUgcnVubmluZyB0b3RhbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdG90YWwgc2l6ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY2FsY1RvdGFsU2l6ZSgpIHsKLSAgICAgICAgX3RvdGFsID0gZXh0cmFjdExpc3QoKS5zaXplKCk7Ci0gICAgICAgIHJldHVybiBfdG90YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgZm9yIGltcGxlbWVudGF0aW9ucyB0byBzZXQgdGhlIG1hcCB0aGF0IGJhY2tzCi0gICAgICogdGhpcyBiYWcuIE5vdCBpbnRlbmRlZCBmb3IgaW50ZXJhY3RpdmUgdXNlIG91dHNpZGUgb2YKLSAgICAgKiBzdWJjbGFzc2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1hcChNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbWFwIG11c3QgYmUgbm9uLW51bGwgYW5kIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgX21hcCA9IG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgaW1wbGVtZW50YXRpb25zIHRvIGFjY2VzcyB0aGUgbWFwIHRoYXQgYmFja3MKLSAgICAgKiB0aGlzIGJhZy4gTm90IGludGVuZGVkIGZvciBpbnRlcmFjdGl2ZSB1c2Ugb3V0c2lkZSBvZgotICAgICAqIHN1YmNsYXNzZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRNYXAoKSB7Ci0gICAgICAgIHJldHVybiBfbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGxpc3QgZm9yIHVzZSBpbiBpdGVyYXRpb24sIGV0Yy4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZXh0cmFjdExpc3QoKSB7Ci0gICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpID0gdW5pcXVlU2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudCA9IGkubmV4dCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSBnZXRDb3VudChjdXJyZW50KTsgaW5kZXggPiAwOyBpbmRleC0tKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBudW1iZXIgb2YgbW9kaWZpY2F0aW9ucyBmb3IgaXRlcmF0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpY2F0aW9uIGNvdW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbW9kQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBfbW9kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgYSB0b1N0cmluZygpIG1ldGhvZCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBkZWJ1Z2dpbmcgdG9TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWYuYXBwZW5kKCJbIik7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB1bmlxdWVTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50ID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBnZXRDb3VudChjdXJyZW50KTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY291bnQpOwotICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChjdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKCJdIik7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRGVmYXVsdE1hcEVudHJ5LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRGVmYXVsdE1hcEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2NGEyOWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0RlZmF1bHRNYXBFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeX0KLSAqCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHZlcnNpb24gaW4gdGhlIGtleXZhbHVlIHN1YnBhY2thZ2UuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIE1pY2hhZWwgQS4gU21pdGgKLSAqIEBhdXRob3IgTmVpbCBPJ1Rvb2xlCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1hcEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5LCBLZXlWYWx1ZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBrZXkgKi8KLSAgICBwcml2YXRlIE9iamVjdCBrZXk7Ci0gICAgLyoqIFRoZSB2YWx1ZSAqLwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGVmYXVsdE1hcEVudHJ5PC9jb2RlPiB3aXRoIGEgbnVsbCBrZXkKLSAgICAgKiBhbmQgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdE1hcEVudHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGVmYXVsdE1hcEVudHJ5PC9jb2RlPiB3aXRoIHRoZSBnaXZlbgotICAgICAqIGtleSBhbmQgZ2l2ZW4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBjb3B5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0TWFwRW50cnkoTWFwLkVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMua2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RGVmYXVsdE1hcEVudHJ5PC9jb2RlPiB3aXRoIHRoZSBnaXZlbgotICAgICAqIGtleSBhbmQgZ2l2ZW4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IGZvciB0aGUgZW50cnksIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgZm9yIHRoZSBlbnRyeSwgbWF5IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdE1hcEVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vIE1hcC5FbnRyeSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkgZnJvbSB0aGUgTWFwIEVudHJ5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUga2V5IAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGtleSBzdG9yZWQgaW4gdGhpcyBNYXAgRW50cnkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBNYXAgRW50cnkgaXMgbm90IGNvbm5lY3RlZCB0byBhIE1hcCwgc28gb25seSB0aGUgbG9jYWwgZGF0YSBpcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIG5ldyBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgTWFwIEVudHJ5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGlzIE1hcCBFbnRyeS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIE1hcCBFbnRyeSBpcyBub3QgY29ubmVjdGVkIHRvIGEgTWFwLCBzbyBvbmx5IHRoZSBsb2NhbCBkYXRhIGlzIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSB0aGlzLnZhbHVlOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLy8gQmFzaWNzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgTWFwIEVudHJ5IHdpdGggYW5vdGhlciBNYXAgRW50cnkuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50ZWQgcGVyIEFQSSBkb2N1bWVudGF0aW9uIG9mIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5I2VxdWFscyhPYmplY3QpfQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0bwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCBrZXkgYW5kIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwLkVudHJ5IG90aGVyID0gKE1hcC5FbnRyeSkgb2JqOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChnZXRLZXkoKSA9PSBudWxsID8gb3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCA6IGdldEtleSgpLmVxdWFscyhvdGhlci5nZXRLZXkoKSkpICYmCi0gICAgICAgICAgICAoZ2V0VmFsdWUoKSA9PSBudWxsID8gb3RoZXIuZ2V0VmFsdWUoKSA9PSBudWxsIDogZ2V0VmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0VmFsdWUoKSkpOwotICAgIH0KLSAgICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGhhc2hDb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgZXF1YWxzIG1ldGhvZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRlZCBwZXIgQVBJIGRvY3VtZW50YXRpb24gb2Yge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkjaGFzaENvZGUoKX0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3VpdGFibGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRLZXkoKSA9PSBudWxsID8gMCA6IGdldEtleSgpLmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG51bGwgPyAwIDogZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdHRlbiB0byBtYXRjaCB0aGUgb3V0cHV0IG9mIHRoZSBNYXAuRW50cnkncyB1c2VkIGluIAotICAgICAqIGEge0BsaW5rIGphdmEudXRpbC5IYXNoTWFwfS4gCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiIitnZXRLZXkoKSsiPSIrZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRG91YmxlT3JkZXJlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjczNjY4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Eb3VibGVPcmRlcmVkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTk0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBSZWQtQmxhY2sgdHJlZS1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBNYXAuIFRoaXMgY2xhc3MgZ3VhcmFudGVlcwotICogdGhhdCB0aGUgbWFwIHdpbGwgYmUgaW4gYm90aCBhc2NlbmRpbmcga2V5IG9yZGVyIGFuZCBhc2NlbmRpbmcKLSAqIHZhbHVlIG9yZGVyLCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBuYXR1cmFsIG9yZGVyIGZvciB0aGUga2V5J3MKLSAqIGFuZCB2YWx1ZSdzIGNsYXNzZXMuCi0gKiA8cD4KLSAqIFRoaXMgTWFwIGlzIGludGVuZGVkIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gbG9vawotICogdXAgYSBrZXktdmFsdWUgcGFpcmluZyBieSBlaXRoZXIga2V5IG9yIHZhbHVlLCBhbmQgbmVlZCB0byBkbyBzbwotICogd2l0aCBlcXVhbCBlZmZpY2llbmN5LgotICogPHA+Ci0gKiBXaGlsZSB0aGF0IGdvYWwgY291bGQgYmUgYWNjb21wbGlzaGVkIGJ5IHRha2luZyBhIHBhaXIgb2YgVHJlZU1hcHMKLSAqIGFuZCByZWRpcmVjdGluZyByZXF1ZXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgVHJlZU1hcCAoZS5nLiwKLSAqIGNvbnRhaW5zS2V5IHdvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBUcmVlTWFwIHRoYXQgbWFwcyB2YWx1ZXMgdG8KLSAqIGtleXMsIGNvbnRhaW5zVmFsdWUgd291bGQgYmUgZGlyZWN0ZWQgdG8gdGhlIFRyZWVNYXAgdGhhdCBtYXBzIGtleXMKLSAqIHRvIHZhbHVlcyksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoYXQgaW1wbGVtZW50YXRpb24sCi0gKiBwYXJ0aWN1bGFybHkgd2hlbiB0cnlpbmcgdG8ga2VlcCB0aGUgdHdvIFRyZWVNYXBzIHN5bmNocm9uaXplZCB3aXRoCi0gKiBlYWNoIG90aGVyLiBBbmQgaWYgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUcmVlTWFwcyBpcyBsYXJnZSwgdGhlCi0gKiBjb3N0IG9mIHJlZHVuZGFudCBzdG9yYWdlIGJlY29tZXMgc2lnbmlmaWNhbnQuIChTZWUgYWxzbyB0aGUgbmV3Ci0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXAuRHVhbFRyZWVCaWRpTWFwIER1YWxUcmVlQmlkaU1hcH0gYW5kCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXAuRHVhbEhhc2hCaWRpTWFwIER1YWxIYXNoQmlkaU1hcH0KLSAqIGltcGxlbWVudGF0aW9ucy4pCi0gKiA8cD4KLSAqIFRoaXMgc29sdXRpb24ga2VlcHMgdGhlIGRhdGEgcHJvcGVybHkgc3luY2hyb25pemVkIGFuZCBtaW5pbWl6ZXMKLSAqIHRoZSBkYXRhIHN0b3JhZ2UuIFRoZSByZWQtYmxhY2sgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIFRyZWVNYXAncywKLSAqIGJ1dCBoYXMgYmVlbiBtb2RpZmllZCB0byBzaW11bHRhbmVvdXNseSBtYXAgYSB0cmVlIG5vZGUgYnkga2V5IGFuZAotICogYnkgdmFsdWUuIFRoaXMgZG91YmxlcyB0aGUgY29zdCBvZiBwdXQgb3BlcmF0aW9ucyAoYnV0IHNvIGRvZXMKLSAqIHVzaW5nIHR3byBUcmVlTWFwcyksIGFuZCBuZWFybHkgZG91YmxlcyB0aGUgY29zdCBvZiByZW1vdmUKLSAqIG9wZXJhdGlvbnMgKHRoZXJlIGlzIGEgc2F2aW5ncyBpbiB0aGF0IHRoZSBsb29rdXAgb2YgdGhlIG5vZGUgdG8gYmUKLSAqIHJlbW92ZWQgb25seSBoYXMgdG8gYmUgcGVyZm9ybWVkIG9uY2UpLiBBbmQgc2luY2Ugb25seSBvbmUgbm9kZQotICogY29udGFpbnMgdGhlIGtleSBhbmQgdmFsdWUsIHN0b3JhZ2UgaXMgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gdGhhdAotICogcmVxdWlyZWQgYnkgdHdvIFRyZWVNYXBzLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgc29tZSBsaW1pdGF0aW9ucyBwbGFjZWQgb24gZGF0YSBrZXB0IGluIHRoaXMgTWFwLiBUaGUKLSAqIGJpZ2dlc3Qgb25lIGlzIHRoaXM6Ci0gKiA8cD4KLSAqIFdoZW4gcGVyZm9ybWluZyBhIHB1dCBvcGVyYXRpb24sIG5laXRoZXIgdGhlIGtleSBub3IgdGhlIHZhbHVlIG1heQotICogYWxyZWFkeSBleGlzdCBpbiB0aGUgTWFwLiBJbiB0aGUgamF2YS51dGlsIE1hcCBpbXBsZW1lbnRhdGlvbnMKLSAqIChIYXNoTWFwLCBUcmVlTWFwKSwgeW91IGNhbiBwZXJmb3JtIGEgcHV0IHdpdGggYW4gYWxyZWFkeSBtYXBwZWQKLSAqIGtleSwgYW5kIG5laXRoZXIgY2FyZXMgYWJvdXQgZHVwbGljYXRlIHZhbHVlcyBhdCBhbGwgLi4uIGJ1dCB0aGlzCi0gKiBpbXBsZW1lbnRhdGlvbidzIHB1dCBtZXRob2Qgd2l0aCB0aHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAqIGlmIGVpdGhlciB0aGUga2V5IG9yIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBNYXAuCi0gKiA8cD4KLSAqIE9idmlvdXNseSwgdGhhdCBzYW1lIHJlc3RyaWN0aW9uIChhbmQgY29uc2VxdWVuY2Ugb2YgZmFpbGluZyB0bwotICogaGVlZCB0aGF0IHJlc3RyaWN0aW9uKSBhcHBsaWVzIHRvIHRoZSBwdXRBbGwgbWV0aG9kLgotICogPHA+Ci0gKiBUaGUgTWFwLkVudHJ5IGluc3RhbmNlcyByZXR1cm5lZCBieSB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kcyB3aWxsCi0gKiBub3QgYWxsb3cgc2V0VmFsdWUoKSBhbmQgd2lsbCB0aHJvdyBhbgotICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gb24gYXR0ZW1wdHMgdG8gY2FsbCB0aGF0IG1ldGhvZC4KLSAqIDxwPgotICogTmV3IG1ldGhvZHMgYXJlIGFkZGVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdmFsdWVzIGFyZQotICoga2VwdCBzb3J0ZWQgaW5kZXBlbmRlbnRseSBvZiB0aGVpciBrZXlzOgotICogPHA+Ci0gKiBPYmplY3QgZ2V0S2V5Rm9yVmFsdWUoT2JqZWN0IHZhbHVlKSBpcyB0aGUgb3Bwb3NpdGUgb2YgZ2V0OyBpdAotICogdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBpdHMga2V5LCBpZiBhbnkuCi0gKiA8cD4KLSAqIE9iamVjdCByZW1vdmVWYWx1ZShPYmplY3QgdmFsdWUpIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQKLSAqIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBub3cgdW4tdXNlZCBrZXkuCi0gKiA8cD4KLSAqIFNldCBlbnRyeVNldEJ5VmFsdWUoKSByZXR1cm5zIHRoZSBNYXAuRW50cnkncyBpbiBhIFNldCB3aG9zZQotICogaXRlcmF0b3Igd2lsbCBpdGVyYXRlIG92ZXIgdGhlIE1hcC5FbnRyeSdzIGluIGFzY2VuZGluZyBvcmRlciBieQotICogdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuCi0gKiA8cD4KLSAqIFNldCBrZXlTZXRCeVZhbHVlKCkgcmV0dXJucyB0aGUga2V5cyBpbiBhIFNldCB3aG9zZSBpdGVyYXRvciB3aWxsCi0gKiBpdGVyYXRlIG92ZXIgdGhlIGtleXMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAqIHZhbHVlcy4KLSAqIDxwPgotICogQ29sbGVjdGlvbiB2YWx1ZXNCeVZhbHVlKCkgcmV0dXJucyB0aGUgdmFsdWVzIGluIGEgQ29sbGVjdGlvbiB3aG9zZQotICogaXRlcmF0b3Igd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gKgotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgVHJlZUJpZGlNYXAgaW4gYmlkaW1hcCBzdWJwYWNrYWdlLiBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNlZSBCaWRpTWFwCi0gKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iaWRpbWFwLkR1YWxUcmVlQmlkaU1hcAotICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmlkaW1hcC5EdWFsSGFzaEJpZGlNYXAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgTWFyYyBKb2huc29uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEb3VibGVPcmRlcmVkTWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAgewotLy8gIGZpbmFsIGZvciBwZXJmb3JtYW5jZQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VNX09GX0lORElDRVMgPSBLRVkgKyBWQUxVRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfSU5ERVggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfT0ZfSU5ESUNFUyA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGF0YU5hbWUgPSBuZXcgU3RyaW5nW10geyAia2V5IiwgInZhbHVlIiB9OwotICAgIAotICAgIHByaXZhdGUgTm9kZVtdIHJvb3ROb2RlID0gbmV3IE5vZGVbXSB7IG51bGwsIG51bGwgfTsKLSAgICBwcml2YXRlIGludCBub2RlQ291bnQgPSAwOwotICAgIHByaXZhdGUgaW50IG1vZGlmaWNhdGlvbnMgPSAwOwotICAgIHByaXZhdGUgU2V0W10gc2V0T2ZLZXlzID0gbmV3IFNldFtdIHsgbnVsbCwgbnVsbCB9OwotICAgIHByaXZhdGUgU2V0W10gc2V0T2ZFbnRyaWVzID0gbmV3IFNldFtdIHsgbnVsbCwgbnVsbCB9OwotICAgIHByaXZhdGUgQ29sbGVjdGlvbltdIGNvbGxlY3Rpb25PZlZhbHVlcyA9IG5ldyBDb2xsZWN0aW9uW10geyBudWxsLCBudWxsIH07Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRG91YmxlT3JkZXJlZE1hcAotICAgICAqLwotICAgIHB1YmxpYyBEb3VibGVPcmRlcmVkTWFwKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRG91YmxlT3JkZXJlZE1hcCBmcm9tIGFuIGV4aXN0aW5nIE1hcCwgd2l0aCBrZXlzIGFuZAotICAgICAqIHZhbHVlcyBzb3J0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleXMgaW4gdGhlIG1hcCBhcmUgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyYWJsZSwgb3IgYXJlIG5vdCBtdXR1YWxseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFibGU7IGFsc28gaWYgdGhlIHZhbHVlcyBpbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXAgYXJlIG5vdCBDb21wYXJhYmxlLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgbXV0dWFsbHkgQ29tcGFyYWJsZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYW55IGtleSBvciB2YWx1ZSBpbiB0aGUgbWFwCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBrZXlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZHVwbGljYXRlIHZhbHVlcyBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgRG91YmxlT3JkZXJlZE1hcChmaW5hbCBNYXAgbWFwKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIGFzc29jaWF0ZWQga2V5IGlzIHRvIGJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUga2V5IHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCB2YWx1ZSwgb3IKLSAgICAgKiAgICAgICAgIG51bGwgaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIHZhbHVlLgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG9mIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5hcHByb3ByaWF0ZSB0eXBlIGZvciB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXlGb3JWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb0dldCgoQ29tcGFyYWJsZSkgdmFsdWUsIFZBTFVFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGZvciB0aGlzIHZhbHVlIGZyb20gdGhpcyBtYXAgaWYgcHJlc2VudAotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIGtleSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIHZhbHVlLCBvciBudWxsCi0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmVWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGRvUmVtb3ZlKChDb21wYXJhYmxlKSB2YWx1ZSwgVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiBFYWNoCi0gICAgICogZWxlbWVudCBpbiB0aGUgcmV0dXJuZWQgc2V0IGlzIGEgTWFwLkVudHJ5LiBUaGUgc2V0IGlzIGJhY2tlZAotICAgICAqIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoZSBzZXQsIGFuZAotICAgICAqIHZpY2UtdmVyc2EuICBJZiB0aGUgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIGFuIGl0ZXJhdGlvbiBvdmVyIHRoZQotICAgICAqIHNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YgdGhlIGl0ZXJhdGlvbiBhcmUKLSAgICAgKiB1bmRlZmluZWQuIFRoZSBzZXQgc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZQotICAgICAqIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUgSXRlcmF0b3IucmVtb3ZlLAotICAgICAqIFNldC5yZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsIGFuZCBjbGVhciBvcGVyYXRpb25zLiAgSXQgZG9lcwotICAgICAqIG5vdCBzdXBwb3J0IHRoZSBhZGQgb3IgYWRkQWxsIG9wZXJhdGlvbnMuPHA+Ci0gICAgICoKLSAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCBlbnRyeVNldCBpcyB0aGF0Ci0gICAgICogZW50cnlTZXQncyBpdGVyYXRvcigpIG1ldGhvZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMKLSAgICAgKiBvdmVyIHRoZSBtYXBwaW5ncyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LiBUaGlzIG1ldGhvZCdzCi0gICAgICogaXRlcmF0b3IgbWV0aG9kIGl0ZXJhdGVzIG92ZXIgdGhlIG1hcHBpbmdzIGluIGFzY2VuZGluZyBvcmRlcgotICAgICAqIGJ5IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldEJ5VmFsdWUoKSB7Ci0KLSAgICAgICAgaWYgKHNldE9mRW50cmllc1tWQUxVRV0gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T2ZFbnRyaWVzW1ZBTFVFXSA9IG5ldyBBYnN0cmFjdFNldCgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZU9yZGVyZWRNYXBJdGVyYXRvcihWQUxVRSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0TmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJldHVybmVkTm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAga2V5ICAgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSAgICAgIG5vZGUgID0gbG9va3VwKChDb21wYXJhYmxlKSBlbnRyeS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobm9kZSAhPSBudWxsKSAmJiBub2RlLmdldERhdGEoS0VZKS5lcXVhbHMoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgbzsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICAgIGtleSAgID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGUgICAgICBub2RlICA9IGxvb2t1cCgoQ29tcGFyYWJsZSkgZW50cnkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5vZGUgIT0gbnVsbCkgJiYgbm9kZS5nZXREYXRhKEtFWSkuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVkQmxhY2tEZWxldGUobm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZU9yZGVyZWRNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvdWJsZU9yZGVyZWRNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2V0T2ZFbnRyaWVzW1ZBTFVFXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgVGhlIHNldAotICAgICAqIGlzIGJhY2tlZCBieSB0aGUgbWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBtYXAgYXJlIHJlZmxlY3RlZCBpbgotICAgICAqIHRoZSBzZXQsIGFuZCB2aWNlLXZlcnNhLiBJZiB0aGUgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIGFuCi0gICAgICogaXRlcmF0aW9uIG92ZXIgdGhlIHNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YgdGhlCi0gICAgICogaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuIFRoZSBzZXQgc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLAotICAgICAqIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUKLSAgICAgKiBJdGVyYXRvci5yZW1vdmUsIFNldC5yZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsLCBhbmQgY2xlYXIKLSAgICAgKiBvcGVyYXRpb25zLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhZGQgb3IgYWRkQWxsCi0gICAgICogb3BlcmF0aW9ucy48cD4KLSAgICAgKgotICAgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIGtleVNldCBpcyB0aGF0IGtleVNldCdzCi0gICAgICogaXRlcmF0b3IoKSBtZXRob2QgcmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlCi0gICAgICoga2V5cyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LiBUaGlzIG1ldGhvZCdzIGl0ZXJhdG9yIG1ldGhvZAotICAgICAqIGl0ZXJhdGVzIG92ZXIgdGhlIGtleXMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldEJ5VmFsdWUoKSB7Ci0KLSAgICAgICAgaWYgKHNldE9mS2V5c1tWQUxVRV0gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T2ZLZXlzW1ZBTFVFXSA9IG5ldyBBYnN0cmFjdFNldCgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZU9yZGVyZWRNYXBJdGVyYXRvcihWQUxVRSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0TmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJldHVybmVkTm9kZS5nZXREYXRhKEtFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlT3JkZXJlZE1hcC50aGlzLnNpemUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNLZXkobyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZG5vZGVDb3VudCA9IG5vZGVDb3VudDsKLQotICAgICAgICAgICAgICAgICAgICBEb3VibGVPcmRlcmVkTWFwLnRoaXMucmVtb3ZlKG8pOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlQ291bnQgIT0gb2xkbm9kZUNvdW50OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgICAgICBEb3VibGVPcmRlcmVkTWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNldE9mS2V5c1tWQUxVRV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzCi0gICAgICogbWFwLiBUaGUgY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwCi0gICAgICogYXJlIHJlZmxlY3RlZCBpbiB0aGUgY29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuIElmIHRoZSBtYXAgaXMKLSAgICAgKiBtb2RpZmllZCB3aGlsZSBhbiBpdGVyYXRpb24gb3ZlciB0aGUgY29sbGVjdGlvbiBpcyBpbiBwcm9ncmVzcywKLSAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuIFRoZSBjb2xsZWN0aW9uCi0gICAgICogc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUgSXRlcmF0b3IucmVtb3ZlLAotICAgICAqIENvbGxlY3Rpb24ucmVtb3ZlLCByZW1vdmVBbGwsIHJldGFpbkFsbCBhbmQgY2xlYXIgb3BlcmF0aW9ucy4KLSAgICAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhZGQgb3IgYWRkQWxsIG9wZXJhdGlvbnMuPHA+Ci0gICAgICoKLSAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB2YWx1ZXMgaXMgdGhhdCB2YWx1ZXMncwotICAgICAqIGl0ZXJhdG9yKCkgbWV0aG9kIHJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZQotICAgICAqIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LiBUaGlzIG1ldGhvZCdzIGl0ZXJhdG9yIG1ldGhvZAotICAgICAqIGl0ZXJhdGVzIG92ZXIgdGhlIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgotICAgICAqCi0gICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXNCeVZhbHVlKCkgewotCi0gICAgICAgIGlmIChjb2xsZWN0aW9uT2ZWYWx1ZXNbVkFMVUVdID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25PZlZhbHVlc1tWQUxVRV0gPSBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uKCkgewotCi0gICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlT3JkZXJlZE1hcEl0ZXJhdG9yKFZBTFVFKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXROZXh0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWROb2RlLmdldERhdGEoVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZU9yZGVyZWRNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVmFsdWUobyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZG5vZGVDb3VudCA9IG5vZGVDb3VudDsKLQotICAgICAgICAgICAgICAgICAgICByZW1vdmVWYWx1ZShvKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZUNvdW50ICE9IG9sZG5vZGVDb3VudDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiAgbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciAgICAgPSBjLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlVmFsdWUoaXRlci5uZXh0KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvdWJsZU9yZGVyZWRNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mVmFsdWVzW1ZBTFVFXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb21tb24gcmVtb3ZlIGxvZ2ljIChyZW1vdmUgYnkga2V5IG9yIHJlbW92ZSBieSB2YWx1ZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBvIHRoZSBrZXksIG9yIHZhbHVlLCB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUga2V5LCBpZiByZW1vdmUgYnkgdmFsdWUsIG9yIHRoZSB2YWx1ZSwgaWYgcmVtb3ZlIGJ5Ci0gICAgICogICAgICAgICBrZXkuIG51bGwgaWYgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGRvUmVtb3ZlKGZpbmFsIENvbXBhcmFibGUgbywgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgTm9kZSAgIG5vZGUgPSBsb29rdXAobywgaW5kZXgpOwotICAgICAgICBPYmplY3QgcnZhbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcnZhbCA9IG5vZGUuZ2V0RGF0YShvcHBvc2l0ZUluZGV4KGluZGV4KSk7Ci0KLSAgICAgICAgICAgIGRvUmVkQmxhY2tEZWxldGUobm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb21tb24gZ2V0IGxvZ2ljLCB1c2VkIHRvIGdldCBieSBrZXkgb3IgZ2V0IGJ5IHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyB0aGUga2V5IG9yIHZhbHVlIHRoYXQgd2UncmUgbG9va2luZyBmb3IKLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgKGlmIHRoZSB2YWx1ZSB3YXMgbWFwcGVkKSBvciB0aGUgdmFsdWUgKGlmIHRoZQotICAgICAqICAgICAgICAga2V5IHdhcyBtYXBwZWQpOyBudWxsIGlmIHdlIGNvdWxkbid0IGZpbmQgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZG9HZXQoZmluYWwgQ29tcGFyYWJsZSBvLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICBjaGVja05vbk51bGxDb21wYXJhYmxlKG8sIGluZGV4KTsKLQotICAgICAgICBOb2RlIG5vZGUgPSBsb29rdXAobywgaW5kZXgpOwotCi0gICAgICAgIHJldHVybiAoKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG5vZGUuZ2V0RGF0YShvcHBvc2l0ZUluZGV4KGluZGV4KSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3Bwb3NpdGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqCi0gICAgICogQHJldHVybiBWQUxVRSAoaWYgS0VZIHdhcyBzcGVjaWZpZWQpLCBlbHNlIEtFWQotICAgICAqLwotICAgIHByaXZhdGUgaW50IG9wcG9zaXRlSW5kZXgoZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgLy8gb2xkIHRyaWNrIC4uLiB0byBmaW5kIHRoZSBvcHBvc2l0ZSBvZiBhIHZhbHVlLCBtIG9yIG4sCi0gICAgICAgIC8vIHN1YnRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdW0gb2YgdGhlIHR3byBwb3NzaWJsZQotICAgICAgICAvLyB2YWx1ZXMuIChtICsgbikgLSBtID0gbjsgKG0gKyBuKSAtIG4gPSBtCi0gICAgICAgIHJldHVybiBTVU1fT0ZfSU5ESUNFUyAtIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRvIHRoZSBhY3R1YWwgbG9va3VwIG9mIGEgcGllY2Ugb2YgZGF0YQotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGtleSBvciB2YWx1ZSB0byBiZSBsb29rZWQgdXAKLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIE5vZGUsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWFwcGluZyBvZiB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCBkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb2RlIGxvb2t1cChmaW5hbCBDb21wYXJhYmxlIGRhdGEsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIE5vZGUgcnZhbCA9IG51bGw7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHJvb3ROb2RlW2luZGV4XTsKLQotICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgY21wID0gY29tcGFyZShkYXRhLCBub2RlLmdldERhdGEoaW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcnZhbCA9IG5vZGU7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IChjbXAgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICA/IG5vZGUuZ2V0TGVmdChpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgOiBub2RlLmdldFJpZ2h0KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdHdvIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSB0aGUgZmlyc3Qgb2JqZWN0Ci0gICAgICogQHBhcmFtIG8yIHRoZSBzZWNvbmQgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5lZ2F0aXZlIHZhbHVlIGlmIG8xIDwgbzI7IDAgaWYgbzEgPT0gbzI7IHBvc2l0aXZlCi0gICAgICogICAgICAgICB2YWx1ZSBpZiBvMSA+IG8yCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmUoZmluYWwgQ29tcGFyYWJsZSBvMSwgZmluYWwgQ29tcGFyYWJsZSBvMikgewotICAgICAgICByZXR1cm4gbzEuY29tcGFyZVRvKG8yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmaW5kIHRoZSBsZWFzdCBub2RlIGZyb20gYSBnaXZlbiBub2RlLiB2ZXJ5IHVzZWZ1bCBmb3Igc3RhcnRpbmcKLSAgICAgKiBhIHNvcnRpbmcgaXRlcmF0b3IgLi4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBmcm9tIHdoaWNoIHdlIHdpbGwgc3RhcnQgc2VhcmNoaW5nCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc21hbGxlc3Qgbm9kZSwgZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUsIGluIHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIG1hcHBpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGxlYXN0Tm9kZShmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIE5vZGUgcnZhbCA9IG5vZGU7Ci0KLSAgICAgICAgaWYgKHJ2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKHJ2YWwuZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ2YWwgPSBydmFsLmdldExlZnQoaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJ2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBuZXh0IGxhcmdlciBub2RlIGZyb20gdGhlIHNwZWNpZmllZCBub2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCBmcm9tCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3BlY2lmaWVkIG5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIE5vZGUgbmV4dEdyZWF0ZXIoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICBOb2RlIHJ2YWwgPSBudWxsOwotCi0gICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJ2YWwgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0UmlnaHQoaW5kZXgpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB0byB0aGUgbm9kZSdzIHJpZ2h0IGlzIGxhcmdlci4gVGhlIGxlYXN0IG9mCi0gICAgICAgICAgICAvLyB0aGUgcmlnaHQgbm9kZSdzIGRlc2NlbmRhbnRzIGlzIHRoZSBuZXh0IGxhcmdlciBub2RlCi0gICAgICAgICAgICBydmFsID0gbGVhc3ROb2RlKG5vZGUuZ2V0UmlnaHQoaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIHRyYXZlcnNlIHVwIG91ciBhbmNlc3RyeSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHRoYXQKLSAgICAgICAgICAgIC8vIGlzIG51bGwgb3Igb25lIHdob3NlIGxlZnQgY2hpbGQgaXMgb3VyIGFuY2VzdG9yLiBJZiB3ZQotICAgICAgICAgICAgLy8gZmluZCBhIG51bGwsIHRoZW4gdGhpcyBub2RlIElTIHRoZSBsYXJnZXN0IG5vZGUgaW4gdGhlCi0gICAgICAgICAgICAvLyB0cmVlLCBhbmQgdGhlcmUgaXMgbm8gZ3JlYXRlciBub2RlLiBPdGhlcndpc2UsIHdlIGFyZQotICAgICAgICAgICAgLy8gdGhlIGxhcmdlc3Qgbm9kZSBpbiB0aGUgc3VidHJlZSBvbiB0aGF0IGFuY2VzdG9yJ3MgbGVmdAotICAgICAgICAgICAgLy8gLi4uIGFuZCB0aGF0IGFuY2VzdG9yIGlzIHRoZSBuZXh0IGdyZWF0ZXN0IG5vZGUKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoaW5kZXgpOwotICAgICAgICAgICAgTm9kZSBjaGlsZCAgPSBub2RlOwotCi0gICAgICAgICAgICB3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAoY2hpbGQgPT0gcGFyZW50LmdldFJpZ2h0KGluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCAgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudChpbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJ2YWwgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb3B5IHRoZSBjb2xvciBmcm9tIG9uZSBub2RlIHRvIGFub3RoZXIsIGRlYWxpbmcgd2l0aCB0aGUgZmFjdAotICAgICAqIHRoYXQgb25lIG9yIGJvdGggbm9kZXMgbWF5LCBpbiBmYWN0LCBiZSBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbSB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBjb3B5aW5nOyBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0byB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBjaGFuZ2luZzsgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5Q29sb3IoZmluYWwgTm9kZSBmcm9tLCBmaW5hbCBOb2RlIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIGlmICh0byAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBtYWtlIGl0IGJsYWNrCi0gICAgICAgICAgICAgICAgdG8uc2V0QmxhY2soaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0by5jb3B5Q29sb3IoZnJvbSwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaXMgdGhlIHNwZWNpZmllZCBub2RlIHJlZD8gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIG5vLCBpdCdzCi0gICAgICogYmxhY2ssIHRoYW5rIHlvdQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCBLRVkgb3IgVkFMVUUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgcmV0dXJuICgobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gZmFsc2UKLSAgICAgICAgICAgICAgICA6IG5vZGUuaXNSZWQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGUgc3BlY2lmaWVkIGJsYWNrIHJlZD8gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHN1cmUsCi0gICAgICogaXQncyBibGFjaywgdGhhbmsgeW91Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCbGFjayhmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIHJldHVybiAoKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgICAgICA6IG5vZGUuaXNCbGFjayhpbmRleCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGZvcmNlIGEgbm9kZSAoaWYgaXQgZXhpc3RzKSByZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlUmVkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbm9kZS5zZXRSZWQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZm9yY2UgYSBub2RlIChpZiBpdCBleGlzdHMpIGJsYWNrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFrZUJsYWNrKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbm9kZS5zZXRCbGFjayhpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYSBub2RlJ3MgZ3JhbmRwYXJlbnQuIG1pbmQgeW91LCB0aGUgbm9kZSwgaXRzIHBhcmVudCwgb3IKLSAgICAgKiBpdHMgZ3JhbmRwYXJlbnQgbWF5IG5vdCBleGlzdC4gbm8gcHJvYmxlbQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCBLRVkgb3IgVkFMVUUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGdldEdyYW5kUGFyZW50KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnQoZ2V0UGFyZW50KG5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIG5vZGUncyBwYXJlbnQuIG1pbmQgeW91LCB0aGUgbm9kZSwgb3IgaXRzIHBhcmVudCwgbWF5IG5vdAotICAgICAqIGV4aXN0LiBubyBwcm9ibGVtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0UGFyZW50KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgcmV0dXJuICgobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgIDogbm9kZS5nZXRQYXJlbnQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYSBub2RlJ3MgcmlnaHQgY2hpbGQuIG1pbmQgeW91LCB0aGUgbm9kZSBtYXkgbm90IGV4aXN0LiBubwotICAgICAqIHByb2JsZW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRSaWdodENoaWxkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgcmV0dXJuIChub2RlID09IG51bGwpCi0gICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgIDogbm9kZS5nZXRSaWdodChpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IGEgbm9kZSdzIGxlZnQgY2hpbGQuIG1pbmQgeW91LCB0aGUgbm9kZSBtYXkgbm90IGV4aXN0LiBubwotICAgICAqIHByb2JsZW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRMZWZ0Q2hpbGQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgOiBub2RlLmdldExlZnQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgbm9kZSBpdHMgcGFyZW50J3MgbGVmdCBjaGlsZD8gbWluZCB5b3UsIHRoZSBub2RlLCBvcgotICAgICAqIGl0cyBwYXJlbnQsIG1heSBub3QgZXhpc3QuIG5vIHByb2JsZW0uIGlmIHRoZSBub2RlIGRvZXNuJ3QKLSAgICAgKiBleGlzdCAuLi4gaXQncyBpdHMgbm9uLWV4aXN0ZW50IHBhcmVudCdzIGxlZnQgY2hpbGQuIElmIHRoZQotICAgICAqIG5vZGUgZG9lcyBleGlzdCBidXQgaGFzIG5vIHBhcmVudCAuLi4gbm8sIHdlJ3JlIG5vdCB0aGUKLSAgICAgKiBub24tZXhpc3RlbnQgcGFyZW50J3MgbGVmdCBjaGlsZC4gT3RoZXJ3aXNlIChib3RoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBub2RlIEFORCBpdHMgcGFyZW50IGV4aXN0KSwgY2hlY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMZWZ0Q2hpbGQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgID8gdHJ1ZQotICAgICAgICAgICAgICAgOiAoKG5vZGUuZ2V0UGFyZW50KGluZGV4KSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgPyBmYWxzZQotICAgICAgICAgICAgICAgICAgOiAobm9kZSA9PSBub2RlLmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIG5vZGUgaXRzIHBhcmVudCdzIHJpZ2h0IGNoaWxkPyBtaW5kIHlvdSwgdGhlIG5vZGUsIG9yCi0gICAgICogaXRzIHBhcmVudCwgbWF5IG5vdCBleGlzdC4gbm8gcHJvYmxlbS4gaWYgdGhlIG5vZGUgZG9lc24ndAotICAgICAqIGV4aXN0IC4uLiBpdCdzIGl0cyBub24tZXhpc3RlbnQgcGFyZW50J3MgcmlnaHQgY2hpbGQuIElmIHRoZQotICAgICAqIG5vZGUgZG9lcyBleGlzdCBidXQgaGFzIG5vIHBhcmVudCAuLi4gbm8sIHdlJ3JlIG5vdCB0aGUKLSAgICAgKiBub24tZXhpc3RlbnQgcGFyZW50J3MgcmlnaHQgY2hpbGQuIE90aGVyd2lzZSAoYm90aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbm9kZSBBTkQgaXRzIHBhcmVudCBleGlzdCksIGNoZWNrLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCBLRVkgb3IgVkFMVUUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmlnaHRDaGlsZChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIHJldHVybiAobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgPyB0cnVlCi0gICAgICAgICAgICAgICA6ICgobm9kZS5nZXRQYXJlbnQoaW5kZXgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICA/IGZhbHNlCi0gICAgICAgICAgICAgICAgICA6IChub2RlID09IG5vZGUuZ2V0UGFyZW50KGluZGV4KS5nZXRSaWdodChpbmRleCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkbyBhIHJvdGF0ZSBsZWZ0LiBzdGFuZGFyZCBmYXJlIGluIHRoZSB3b3JsZCBvZiBiYWxhbmNlZCB0cmVlcwotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYmUgcm90YXRlZAotICAgICAqIEBwYXJhbSBpbmRleCBLRVkgb3IgVkFMVUUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcm90YXRlTGVmdChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIE5vZGUgcmlnaHRDaGlsZCA9IG5vZGUuZ2V0UmlnaHQoaW5kZXgpOwotCi0gICAgICAgIG5vZGUuc2V0UmlnaHQocmlnaHRDaGlsZC5nZXRMZWZ0KGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgIGlmIChyaWdodENoaWxkLmdldExlZnQoaW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJpZ2h0Q2hpbGQuZ2V0TGVmdChpbmRleCkuc2V0UGFyZW50KG5vZGUsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJpZ2h0Q2hpbGQuc2V0UGFyZW50KG5vZGUuZ2V0UGFyZW50KGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgIGlmIChub2RlLmdldFBhcmVudChpbmRleCkgPT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBub2RlIHdhcyB0aGUgcm9vdCAuLi4gbm93IGl0cyByaWdodCBjaGlsZCBpcyB0aGUgcm9vdAotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0gcmlnaHRDaGlsZDsKLSAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkgPT0gbm9kZSkgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldExlZnQocmlnaHRDaGlsZCwgaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldFJpZ2h0KHJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJpZ2h0Q2hpbGQuc2V0TGVmdChub2RlLCBpbmRleCk7Ci0gICAgICAgIG5vZGUuc2V0UGFyZW50KHJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkbyBhIHJvdGF0ZSByaWdodC4gc3RhbmRhcmQgZmFyZSBpbiB0aGUgd29ybGQgb2YgYmFsYW5jZWQgdHJlZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGJlIHJvdGF0ZWQKLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZVJpZ2h0KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgTm9kZSBsZWZ0Q2hpbGQgPSBub2RlLmdldExlZnQoaW5kZXgpOwotCi0gICAgICAgIG5vZGUuc2V0TGVmdChsZWZ0Q2hpbGQuZ2V0UmlnaHQoaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgaWYgKGxlZnRDaGlsZC5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbGVmdENoaWxkLmdldFJpZ2h0KGluZGV4KS5zZXRQYXJlbnQobm9kZSwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVmdENoaWxkLnNldFBhcmVudChub2RlLmdldFBhcmVudChpbmRleCksIGluZGV4KTsKLQotICAgICAgICBpZiAobm9kZS5nZXRQYXJlbnQoaW5kZXgpID09IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gbm9kZSB3YXMgdGhlIHJvb3QgLi4uIG5vdyBpdHMgbGVmdCBjaGlsZCBpcyB0aGUgcm9vdAotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0gbGVmdENoaWxkOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0UGFyZW50KGluZGV4KS5nZXRSaWdodChpbmRleCkgPT0gbm9kZSkgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldFJpZ2h0KGxlZnRDaGlsZCwgaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldExlZnQobGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZWZ0Q2hpbGQuc2V0UmlnaHQobm9kZSwgaW5kZXgpOwotICAgICAgICBub2RlLnNldFBhcmVudChsZWZ0Q2hpbGQsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb21wbGljYXRlZCByZWQtYmxhY2sgaW5zZXJ0IHN0dWZmLiBCYXNlZCBvbiBTdW4ncyBUcmVlTWFwCi0gICAgICogaW1wbGVtZW50YXRpb24sIHRob3VnaCBpdCdzIGJhcmVseSByZWNvZ25pemFibGUgYW55IG1vcmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnNlcnRlZE5vZGUgdGhlIG5vZGUgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvUmVkQmxhY2tJbnNlcnQoZmluYWwgTm9kZSBpbnNlcnRlZE5vZGUsIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBpbnNlcnRlZE5vZGU7Ci0KLSAgICAgICAgbWFrZVJlZChjdXJyZW50Tm9kZSwgaW5kZXgpOwotCi0gICAgICAgIHdoaWxlICgoY3VycmVudE5vZGUgIT0gbnVsbCkgJiYgKGN1cnJlbnROb2RlICE9IHJvb3ROb2RlW2luZGV4XSkKLSAgICAgICAgICAgICAgICAmJiAoaXNSZWQoY3VycmVudE5vZGUuZ2V0UGFyZW50KGluZGV4KSwgaW5kZXgpKSkgewotICAgICAgICAgICAgaWYgKGlzTGVmdENoaWxkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOb2RlIHkgPSBnZXRSaWdodENoaWxkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWQoeSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soeSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmlnaHRDaGlsZChjdXJyZW50Tm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoZ2V0R3JhbmRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBqdXN0IGxpa2UgY2xhdXNlIGFib3ZlLCBleGNlcHQgc3dhcCBsZWZ0IGZvciByaWdodAotICAgICAgICAgICAgICAgIE5vZGUgeSA9IGdldExlZnRDaGlsZChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWQoeSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soeSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGVmdENoaWxkKGN1cnJlbnROb2RlLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYWtlQmxhY2socm9vdE5vZGVbaW5kZXhdLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29tcGxpY2F0ZWQgcmVkLWJsYWNrIGRlbGV0ZSBzdHVmZi4gQmFzZWQgb24gU3VuJ3MgVHJlZU1hcAotICAgICAqIGltcGxlbWVudGF0aW9uLCB0aG91Z2ggaXQncyBiYXJlbHkgcmVjb2duaXphYmxlIGFueSBtb3JlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsZXRlZE5vZGUgdGhlIG5vZGUgdG8gYmUgZGVsZXRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1JlZEJsYWNrRGVsZXRlKGZpbmFsIE5vZGUgZGVsZXRlZE5vZGUpIHsKLQotICAgICAgICBmb3IgKGludCBpbmRleCA9IEZJUlNUX0lOREVYOyBpbmRleCA8IE5VTUJFUl9PRl9JTkRJQ0VTOyBpbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIGlmIGRlbGV0ZWQgbm9kZSBoYXMgYm90aCBsZWZ0IGFuZCBjaGlsZHJlbiwgc3dhcCB3aXRoCi0gICAgICAgICAgICAvLyB0aGUgbmV4dCBncmVhdGVyIG5vZGUKLSAgICAgICAgICAgIGlmICgoZGVsZXRlZE5vZGUuZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGRlbGV0ZWROb2RlLmdldFJpZ2h0KGluZGV4KSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHN3YXBQb3NpdGlvbihuZXh0R3JlYXRlcihkZWxldGVkTm9kZSwgaW5kZXgpLCBkZWxldGVkTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBOb2RlIHJlcGxhY2VtZW50ID0gKChkZWxldGVkTm9kZS5nZXRMZWZ0KGluZGV4KSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlbGV0ZWROb2RlLmdldExlZnQoaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVsZXRlZE5vZGUuZ2V0UmlnaHQoaW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRQYXJlbnQoZGVsZXRlZE5vZGUuZ2V0UGFyZW50KGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByb290Tm9kZVtpbmRleF0gPSByZXBsYWNlbWVudDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbGV0ZWROb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpLmdldExlZnQoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkuc2V0TGVmdChyZXBsYWNlbWVudCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkuc2V0UmlnaHQocmVwbGFjZW1lbnQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5zZXRMZWZ0KG51bGwsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5zZXRSaWdodChudWxsLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlZE5vZGUuc2V0UGFyZW50KG51bGwsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0JsYWNrKGRlbGV0ZWROb2RlLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9SZWRCbGFja0RlbGV0ZUZpeHVwKHJlcGxhY2VtZW50LCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50IGlzIG51bGwKLSAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZE5vZGUuZ2V0UGFyZW50KGluZGV4KSA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgdHJlZQotICAgICAgICAgICAgICAgICAgICByb290Tm9kZVtpbmRleF0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCBub2RlIGhhZCBubyBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbGFjayhkZWxldGVkTm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrRGVsZXRlRml4dXAoZGVsZXRlZE5vZGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVkTm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGVmdChpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldExlZnQobnVsbCwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldFJpZ2h0KG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZE5vZGUuc2V0UGFyZW50KG51bGwsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNocmluaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbXBsaWNhdGVkIHJlZC1ibGFjayBkZWxldGUgc3R1ZmYuIEJhc2VkIG9uIFN1bidzIFRyZWVNYXAKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoIGl0J3MgYmFyZWx5IHJlY29nbml6YWJsZSBhbnkgbW9yZS4gVGhpcwotICAgICAqIHJlYmFsYW5jZXMgdGhlIHRyZWUgKHNvbWV3aGF0LCBhcyByZWQtYmxhY2sgdHJlZXMgYXJlIG5vdAotICAgICAqIHBlcmZlY3RseSBiYWxhbmNlZCAtLSBwZXJmZWN0IGJhbGFuY2luZyB0YWtlcyBsb25nZXIpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnROb2RlIHRoZSBub2RlIGJlaW5nIHJlcGxhY2VkCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1JlZEJsYWNrRGVsZXRlRml4dXAoZmluYWwgTm9kZSByZXBsYWNlbWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICBOb2RlIGN1cnJlbnROb2RlID0gcmVwbGFjZW1lbnROb2RlOwotCi0gICAgICAgIHdoaWxlICgoY3VycmVudE5vZGUgIT0gcm9vdE5vZGVbaW5kZXhdKQotICAgICAgICAgICAgICAgICYmIChpc0JsYWNrKGN1cnJlbnROb2RlLCBpbmRleCkpKSB7Ci0gICAgICAgICAgICBpZiAoaXNMZWZ0Q2hpbGQoY3VycmVudE5vZGUsIGluZGV4KSkgewotICAgICAgICAgICAgICAgIE5vZGUgc2libGluZ05vZGUgPQotICAgICAgICAgICAgICAgICAgICBnZXRSaWdodENoaWxkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWQoc2libGluZ05vZGUsIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soc2libGluZ05vZGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2libGluZ05vZGUgPSBnZXRSaWdodENoaWxkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzQmxhY2soZ2V0TGVmdENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNCbGFjayhnZXRSaWdodENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKHNpYmxpbmdOb2RlLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbGFjayhnZXRSaWdodENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldExlZnRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKHNpYmxpbmdOb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmlnaHRDaGlsZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29weUNvbG9yKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBzaWJsaW5nTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRSaWdodENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcm9vdE5vZGVbaW5kZXhdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBzaWJsaW5nTm9kZSA9IGdldExlZnRDaGlsZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzUmVkKHNpYmxpbmdOb2RlLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKHNpYmxpbmdOb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VSZWQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9IGdldExlZnRDaGlsZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0JsYWNrKGdldFJpZ2h0Q2hpbGQoc2libGluZ05vZGUsIGluZGV4KSwgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0JsYWNrKGdldExlZnRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhY2soZ2V0TGVmdENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldFJpZ2h0Q2hpbGQoc2libGluZ05vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGVmdENoaWxkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb3B5Q29sb3IoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIHNpYmxpbmdOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldExlZnRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSByb290Tm9kZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWFrZUJsYWNrKGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3dhcCB0d28gbm9kZXMgKGV4Y2VwdCBmb3IgdGhlaXIgY29udGVudCksIHRha2luZyBjYXJlIG9mCi0gICAgICogc3BlY2lhbCBjYXNlcyB3aGVyZSBvbmUgaXMgdGhlIG90aGVyJ3MgcGFyZW50IC4uLiBoZXksIGl0Ci0gICAgICogaGFwcGVucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4IG9uZSBub2RlCi0gICAgICogQHBhcmFtIHkgYW5vdGhlciBub2RlCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzd2FwUG9zaXRpb24oZmluYWwgTm9kZSB4LCBmaW5hbCBOb2RlIHksIGZpbmFsIGludCBpbmRleCkgewotCi0gICAgICAgIC8vIFNhdmUgaW5pdGlhbCB2YWx1ZXMuCi0gICAgICAgIE5vZGUgICAgeEZvcm1lclBhcmVudCAgICAgPSB4LmdldFBhcmVudChpbmRleCk7Ci0gICAgICAgIE5vZGUgICAgeEZvcm1lckxlZnRDaGlsZCAgPSB4LmdldExlZnQoaW5kZXgpOwotICAgICAgICBOb2RlICAgIHhGb3JtZXJSaWdodENoaWxkID0geC5nZXRSaWdodChpbmRleCk7Ci0gICAgICAgIE5vZGUgICAgeUZvcm1lclBhcmVudCAgICAgPSB5LmdldFBhcmVudChpbmRleCk7Ci0gICAgICAgIE5vZGUgICAgeUZvcm1lckxlZnRDaGlsZCAgPSB5LmdldExlZnQoaW5kZXgpOwotICAgICAgICBOb2RlICAgIHlGb3JtZXJSaWdodENoaWxkID0geS5nZXRSaWdodChpbmRleCk7Ci0gICAgICAgIGJvb2xlYW4geFdhc0xlZnRDaGlsZCAgICAgPQotICAgICAgICAgICAgKHguZ2V0UGFyZW50KGluZGV4KSAhPSBudWxsKQotICAgICAgICAgICAgJiYgKHggPT0geC5nZXRQYXJlbnQoaW5kZXgpLmdldExlZnQoaW5kZXgpKTsKLSAgICAgICAgYm9vbGVhbiB5V2FzTGVmdENoaWxkICAgICA9Ci0gICAgICAgICAgICAoeS5nZXRQYXJlbnQoaW5kZXgpICE9IG51bGwpCi0gICAgICAgICAgICAmJiAoeSA9PSB5LmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkpOwotCi0gICAgICAgIC8vIFN3YXAsIGhhbmRsaW5nIHNwZWNpYWwgY2FzZXMgb2Ygb25lIGJlaW5nIHRoZSBvdGhlcidzIHBhcmVudC4KLSAgICAgICAgaWYgKHggPT0geUZvcm1lclBhcmVudCkgeyAgICAvLyB4IHdhcyB5J3MgcGFyZW50Ci0gICAgICAgICAgICB4LnNldFBhcmVudCh5LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh5V2FzTGVmdENoaWxkKSB7Ci0gICAgICAgICAgICAgICAgeS5zZXRMZWZ0KHgsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB5LnNldFJpZ2h0KHhGb3JtZXJSaWdodENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHkuc2V0UmlnaHQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHkuc2V0TGVmdCh4Rm9ybWVyTGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4LnNldFBhcmVudCh5Rm9ybWVyUGFyZW50LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh5Rm9ybWVyUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoeVdhc0xlZnRDaGlsZCkgewotICAgICAgICAgICAgICAgICAgICB5Rm9ybWVyUGFyZW50LnNldExlZnQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHlGb3JtZXJQYXJlbnQuc2V0UmlnaHQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeS5zZXRMZWZ0KHhGb3JtZXJMZWZ0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgICAgIHkuc2V0UmlnaHQoeEZvcm1lclJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh5ID09IHhGb3JtZXJQYXJlbnQpIHsgICAgLy8geSB3YXMgeCdzIHBhcmVudAotICAgICAgICAgICAgeS5zZXRQYXJlbnQoeCwgaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAoeFdhc0xlZnRDaGlsZCkgewotICAgICAgICAgICAgICAgIHguc2V0TGVmdCh5LCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgeC5zZXRSaWdodCh5Rm9ybWVyUmlnaHRDaGlsZCwgaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4LnNldFJpZ2h0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB4LnNldExlZnQoeUZvcm1lckxlZnRDaGlsZCwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeS5zZXRQYXJlbnQoeEZvcm1lclBhcmVudCwgaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAoeEZvcm1lclBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHhXYXNMZWZ0Q2hpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgeEZvcm1lclBhcmVudC5zZXRMZWZ0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4Rm9ybWVyUGFyZW50LnNldFJpZ2h0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHguc2V0TGVmdCh5Rm9ybWVyTGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB4LnNldFJpZ2h0KHlGb3JtZXJSaWdodENoaWxkLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaXggY2hpbGRyZW4ncyBwYXJlbnQgcG9pbnRlcnMKLSAgICAgICAgaWYgKHguZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgeC5nZXRMZWZ0KGluZGV4KS5zZXRQYXJlbnQoeCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHguZ2V0UmlnaHQoaW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHguZ2V0UmlnaHQoaW5kZXgpLnNldFBhcmVudCh4LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeS5nZXRMZWZ0KGluZGV4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB5LmdldExlZnQoaW5kZXgpLnNldFBhcmVudCh5LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeS5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgeS5nZXRSaWdodChpbmRleCkuc2V0UGFyZW50KHksIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHguc3dhcENvbG9ycyh5LCBpbmRleCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgcm9vdCBjaGFuZ2VkCi0gICAgICAgIGlmIChyb290Tm9kZVtpbmRleF0gPT0geCkgewotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0geTsKLSAgICAgICAgfSBlbHNlIGlmIChyb290Tm9kZVtpbmRleF0gPT0geSkgewotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0geDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBmaXQgdG8gYmUgcHJvcGVyIGlucHV0IC4uLiBoYXMgdG8gYmUKLSAgICAgKiBDb21wYXJhYmxlIGFuZCBub24tbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIG8gdGhlIG9iamVjdCBiZWluZyBjaGVja2VkCi0gICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRSAodXNlZCB0byBwdXQgdGhlIHJpZ2h0IHdvcmQgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgIGV4Y2VwdGlvbiBtZXNzYWdlKQotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBvIGlzIG5vdCBDb21wYXJhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja05vbk51bGxDb21wYXJhYmxlKGZpbmFsIE9iamVjdCBvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oZGF0YU5hbWVbaW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29tcGFyYWJsZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oZGF0YU5hbWVbaW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGJlIENvbXBhcmFibGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEga2V5IGZvciB2YWxpZGl0eSAobm9uLW51bGwgYW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBjaGVja2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtleSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYga2V5IGlzIG5vdCBDb21wYXJhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0tleShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoZWNrTm9uTnVsbENvbXBhcmFibGUoa2V5LCBLRVkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEgdmFsdWUgZm9yIHZhbGlkaXR5IChub24tbnVsbCBhbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlKQotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHZhbHVlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB2YWx1ZSBpcyBub3QgQ29tcGFyYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgY2hlY2tOb25OdWxsQ29tcGFyYWJsZSh2YWx1ZSwgVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEga2V5IGFuZCBhIHZhbHVlIGZvciB2YWxpZGl0eSAobm9uLW51bGwgYW5kIGltcGxlbWVudHMKLSAgICAgKiBDb21wYXJhYmxlKQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IG9yIHZhbHVlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBrZXkgb3IgdmFsdWUgaXMgbm90IENvbXBhcmFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrS2V5QW5kVmFsdWUoZmluYWwgT2JqZWN0IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGNoZWNrS2V5KGtleSk7Ci0gICAgICAgIGNoZWNrVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGluY3JlbWVudCB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IC0tIHVzZWQgdG8gY2hlY2sgZm9yCi0gICAgICogY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlIG1hcCB0aHJvdWdoIHRoZSBtYXAgYW5kIHRocm91Z2gKLSAgICAgKiBhbiBJdGVyYXRvciBmcm9tIG9uZSBvZiBpdHMgU2V0IG9yIENvbGxlY3Rpb24gdmlld3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbW9kaWZ5KCkgewotICAgICAgICBtb2RpZmljYXRpb25zKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVtcCB1cCB0aGUgc2l6ZSBhbmQgbm90ZSB0aGF0IHRoZSBtYXAgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLQotICAgICAgICBtb2RpZnkoKTsKLQotICAgICAgICBub2RlQ291bnQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkZWNyZW1lbnQgdGhlIHNpemUgYW5kIG5vdGUgdGhhdCB0aGUgbWFwIGhhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNocmluaygpIHsKLQotICAgICAgICBtb2RpZnkoKTsKLQotICAgICAgICBub2RlQ291bnQtLTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbnNlcnQgYSBub2RlIGJ5IGl0cyB2YWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIG5ld05vZGUgdGhlIG5vZGUgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBub2RlIGFscmVhZHkgZXhpc3RzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHZhbHVlIG1hcHBpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0VmFsdWUoZmluYWwgTm9kZSBuZXdOb2RlKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTm9kZSBub2RlID0gcm9vdE5vZGVbVkFMVUVdOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgY21wID0gY29tcGFyZShuZXdOb2RlLmdldERhdGEoVkFMVUUpLCBub2RlLmdldERhdGEoVkFMVUUpKTsKLQotICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzdG9yZSBhIGR1cGxpY2F0ZSB2YWx1ZSAoXCIiCi0gICAgICAgICAgICAgICAgICAgICsgbmV3Tm9kZS5nZXREYXRhKFZBTFVFKSArICJcIikgaW4gdGhpcyBNYXAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wIDwgMCkgewotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldExlZnQoVkFMVUUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TGVmdChWQUxVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRMZWZ0KG5ld05vZGUsIFZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5zZXRQYXJlbnQobm9kZSwgVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrSW5zZXJ0KG5ld05vZGUsIFZBTFVFKTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAgICAvLyBjbXAgPiAwCi0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0UmlnaHQoVkFMVUUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UmlnaHQoVkFMVUUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0UmlnaHQobmV3Tm9kZSwgVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLnNldFBhcmVudChub2RlLCBWQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvUmVkQmxhY2tJbnNlcnQobmV3Tm9kZSwgVkFMVUUpOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICoqKioqKioqKiogU1RBUlQgaW1wbGVtZW50YXRpb24gb2YgTWFwICoqKioqKioqKiogKi8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBtYXAuIElmIHRoZQotICAgICAqIG1hcCBjb250YWlucyBtb3JlIHRoYW4gSW50ZWdlci5NQVhWQUxVRSBlbGVtZW50cywgcmV0dXJucwotICAgICAqIEludGVnZXIuTUFYVkFMVUUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkCi0gICAgICoga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAga2V5LgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmb3IgdGhpcyBtYXAuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBPYmplY3Qga2V5KQotICAgICAgICAgICAgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24gewotCi0gICAgICAgIGNoZWNrS2V5KGtleSk7Ci0KLSAgICAgICAgcmV0dXJuIGxvb2t1cCgoQ29tcGFyYWJsZSkga2V5LCBLRVkpICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogICAgICAgICB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCi0gICAgICAgIGNoZWNrVmFsdWUodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBsb29rdXAoKENvbXBhcmFibGUpIHZhbHVlLCBWQUxVRSkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIG1hcCBtYXBzIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBrZXkuIFJldHVybnMgbnVsbCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXksIG9yCi0gICAgICogICAgICAgICBudWxsIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZvciB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIE9iamVjdCBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb0dldCgoQ29tcGFyYWJsZSkga2V5LCBLRVkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMKLSAgICAgKiBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmUKLSAgICAgKiAgICAgICAgICAgIGFzc29jaWF0ZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdmFsdWUgcHJldmVudHMgaXQgZnJvbSBiZWluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGtleSBkdXBsaWNhdGVzIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcga2V5LCBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBkdXBsaWNhdGVzIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIGNoZWNrS2V5QW5kVmFsdWUoa2V5LCB2YWx1ZSk7Ci0KLSAgICAgICAgTm9kZSBub2RlID0gcm9vdE5vZGVbS0VZXTsKLQotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBOb2RlIHJvb3QgPSBuZXcgTm9kZSgoQ29tcGFyYWJsZSkga2V5LCAoQ29tcGFyYWJsZSkgdmFsdWUpOwotCi0gICAgICAgICAgICByb290Tm9kZVtLRVldICAgPSByb290OwotICAgICAgICAgICAgcm9vdE5vZGVbVkFMVUVdID0gcm9vdDsKLQotICAgICAgICAgICAgZ3JvdygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgY21wID0gY29tcGFyZSgoQ29tcGFyYWJsZSkga2V5LCBub2RlLmdldERhdGEoS0VZKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc3RvcmUgYSBkdXBsaWNhdGUga2V5IChcIiIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSBpbiB0aGlzIE1hcCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRMZWZ0KEtFWSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TGVmdChLRVkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBuZXdOb2RlID0gbmV3IE5vZGUoKENvbXBhcmFibGUpIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21wYXJhYmxlKSB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFZhbHVlKG5ld05vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRMZWZ0KG5ld05vZGUsIEtFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLnNldFBhcmVudChub2RlLCBLRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9SZWRCbGFja0luc2VydChuZXdOb2RlLCBLRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIC8vIGNtcCA+IDAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0UmlnaHQoS0VZKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRSaWdodChLRVkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBuZXdOb2RlID0gbmV3IE5vZGUoKENvbXBhcmFibGUpIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21wYXJhYmxlKSB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFZhbHVlKG5ld05vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRSaWdodChuZXdOb2RlLCBLRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5zZXRQYXJlbnQobm9kZSwgS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVkQmxhY2tJbnNlcnQobmV3Tm9kZSwgS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3coKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoaXMgbWFwIGlmIHByZXNlbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciBudWxsCi0gICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGRvUmVtb3ZlKChDb21wYXJhYmxlKSBrZXksIEtFWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotCi0gICAgICAgIG1vZGlmeSgpOwotCi0gICAgICAgIG5vZGVDb3VudCAgID0gMDsKLSAgICAgICAgcm9vdE5vZGVbS0VZXSAgID0gbnVsbDsKLSAgICAgICAgcm9vdE5vZGVbVkFMVUVdID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgVGhlIHNldAotICAgICAqIGlzIGJhY2tlZCBieSB0aGUgbWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBtYXAgYXJlIHJlZmxlY3RlZCBpbgotICAgICAqIHRoZSBzZXQsIGFuZCB2aWNlLXZlcnNhLiBJZiB0aGUgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIGFuCi0gICAgICogaXRlcmF0aW9uIG92ZXIgdGhlIHNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YgdGhlCi0gICAgICogaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuIFRoZSBzZXQgc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLAotICAgICAqIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUKLSAgICAgKiBJdGVyYXRvci5yZW1vdmUsIFNldC5yZW1vdmUsIHJlbW92ZUFsbCwgcmV0YWluQWxsLCBhbmQgY2xlYXIKLSAgICAgKiBvcGVyYXRpb25zLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLQotICAgICAgICBpZiAoc2V0T2ZLZXlzW0tFWV0gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T2ZLZXlzW0tFWV0gPSBuZXcgQWJzdHJhY3RTZXQoKSB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVPcmRlcmVkTWFwSXRlcmF0b3IoS0VZKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXROZXh0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWROb2RlLmdldERhdGEoS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGVPcmRlcmVkTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0tleShvKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkTm9kZUNvdW50ID0gbm9kZUNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgIERvdWJsZU9yZGVyZWRNYXAudGhpcy5yZW1vdmUobyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVDb3VudCAhPSBvbGROb2RlQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvdWJsZU9yZGVyZWRNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2V0T2ZLZXlzW0tFWV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzCi0gICAgICogbWFwLiBUaGUgY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwCi0gICAgICogYXJlIHJlZmxlY3RlZCBpbiB0aGUgY29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuIElmIHRoZSBtYXAgaXMKLSAgICAgKiBtb2RpZmllZCB3aGlsZSBhbiBpdGVyYXRpb24gb3ZlciB0aGUgY29sbGVjdGlvbiBpcyBpbiBwcm9ncmVzcywKLSAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuIFRoZSBjb2xsZWN0aW9uCi0gICAgICogc3VwcG9ydHMgZWxlbWVudCByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUgSXRlcmF0b3IucmVtb3ZlLAotICAgICAqIENvbGxlY3Rpb24ucmVtb3ZlLCByZW1vdmVBbGwsIHJldGFpbkFsbCBhbmQgY2xlYXIgb3BlcmF0aW9ucy4KLSAgICAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhZGQgb3IgYWRkQWxsIG9wZXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLQotICAgICAgICBpZiAoY29sbGVjdGlvbk9mVmFsdWVzW0tFWV0gPT0gbnVsbCkgewotICAgICAgICAgICAgY29sbGVjdGlvbk9mVmFsdWVzW0tFWV0gPSBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uKCkgewotCi0gICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlT3JkZXJlZE1hcEl0ZXJhdG9yKEtFWSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0TmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJldHVybmVkTm9kZS5nZXREYXRhKFZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGVPcmRlcmVkTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1ZhbHVlKG8pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCi0gICAgICAgICAgICAgICAgICAgIGludCBvbGROb2RlQ291bnQgPSBub2RlQ291bnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmFsdWUobyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVDb3VudCAhPSBvbGROb2RlQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgICAgID0gYy5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZVZhbHVlKGl0ZXIubmV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgICAgICBEb3VibGVPcmRlcmVkTWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZlZhbHVlc1tLRVldOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiBFYWNoCi0gICAgICogZWxlbWVudCBpbiB0aGUgcmV0dXJuZWQgc2V0IGlzIGEgTWFwLkVudHJ5LiBUaGUgc2V0IGlzIGJhY2tlZAotICAgICAqIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoZSBzZXQsIGFuZAotICAgICAqIHZpY2UtdmVyc2EuICBJZiB0aGUgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIGFuIGl0ZXJhdGlvbiBvdmVyIHRoZQotICAgICAqIHNldCBpcyBpbiBwcm9ncmVzcywgdGhlIHJlc3VsdHMgb2YgdGhlIGl0ZXJhdGlvbiBhcmUKLSAgICAgKiB1bmRlZmluZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBtYXBwaW5nIGZyb20gdGhlIG1hcCwgdmlhIHRoZSBJdGVyYXRvci5yZW1vdmUsIFNldC5yZW1vdmUsIHJlbW92ZUFsbCwKLSAgICAgKiByZXRhaW5BbGwgYW5kIGNsZWFyIG9wZXJhdGlvbnMuCi0gICAgICogSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgotICAgICAqIFRoZSBzZXRWYWx1ZSBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgTWFwIEVudHJ5LgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLQotICAgICAgICBpZiAoc2V0T2ZFbnRyaWVzW0tFWV0gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T2ZFbnRyaWVzW0tFWV0gPSBuZXcgQWJzdHJhY3RTZXQoKSB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVPcmRlcmVkTWFwSXRlcmF0b3IoS0VZKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXROZXh0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWROb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG87Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCAgICB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGUgICAgICBub2RlICA9IGxvb2t1cCgoQ29tcGFyYWJsZSkgZW50cnkuZ2V0S2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbm9kZS5nZXREYXRhKFZBTFVFKS5lcXVhbHModmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBOb2RlICAgICAgbm9kZSAgPSBsb29rdXAoKENvbXBhcmFibGUpIGVudHJ5LmdldEtleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5vZGUgIT0gbnVsbCkgJiYgbm9kZS5nZXREYXRhKFZBTFVFKS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrRGVsZXRlKG5vZGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGVPcmRlcmVkTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgICAgICBEb3VibGVPcmRlcmVkTWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNldE9mRW50cmllc1tLRVldOwotICAgIH0KLQotICAgIC8qICoqKioqKioqKiogIEVORCAgaW1wbGVtZW50YXRpb24gb2YgTWFwICoqKioqKioqKiogKi8KLSAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIERvdWJsZU9yZGVyZWRNYXBJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICBwcml2YXRlIGludCAgICBleHBlY3RlZE1vZGlmaWNhdGlvbnM7Ci0gICAgICAgIHByb3RlY3RlZCBOb2RlIGxhc3RSZXR1cm5lZE5vZGU7Ci0gICAgICAgIHByaXZhdGUgTm9kZSAgIG5leHROb2RlOwotICAgICAgICBwcml2YXRlIGludCAgICBpdGVyYXRvclR5cGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICAgICAqLwotICAgICAgICBEb3VibGVPcmRlcmVkTWFwSXRlcmF0b3IoZmluYWwgaW50IHR5cGUpIHsKLQotICAgICAgICAgICAgaXRlcmF0b3JUeXBlICAgICAgICAgID0gdHlwZTsKLSAgICAgICAgICAgIGV4cGVjdGVkTW9kaWZpY2F0aW9ucyA9IERvdWJsZU9yZGVyZWRNYXAudGhpcy5tb2RpZmljYXRpb25zOwotICAgICAgICAgICAgbGFzdFJldHVybmVkTm9kZSAgICAgID0gbnVsbDsKLSAgICAgICAgICAgIG5leHROb2RlICAgICAgICAgICAgICA9IGxlYXN0Tm9kZShyb290Tm9kZVtpdGVyYXRvclR5cGVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiAnbmV4dCcsIHdoYXRldmVyIHRoYXQgbWVhbnMgZm9yIGEgZ2l2ZW4ga2luZCBvZgotICAgICAgICAgKiAgICAgICAgIERvdWJsZU9yZGVyZWRNYXBJdGVyYXRvcgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBkb0dldE5leHQoKTsKLQotICAgICAgICAvKiAqKioqKioqKioqIFNUQVJUIGltcGxlbWVudGF0aW9uIG9mIEl0ZXJhdG9yICoqKioqKioqKiogKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVyYXRvciBoYXMgbW9yZSBlbGVtZW50cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dE5vZGUgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIGl0ZXJhdGlvbiBoYXMgbm8gbW9yZQotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuCi0gICAgICAgICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZU9yZGVyZWRNYXAgaXMKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJlaGluZAotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGl0ZXJhdG9yJ3MKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbmV4dCgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RpZmljYXRpb25zICE9IGV4cGVjdGVkTW9kaWZpY2F0aW9ucykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RSZXR1cm5lZE5vZGUgPSBuZXh0Tm9kZTsKLSAgICAgICAgICAgIG5leHROb2RlICAgICAgICAgPSBuZXh0R3JlYXRlcihuZXh0Tm9kZSwgaXRlcmF0b3JUeXBlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRvR2V0TmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgZnJvbSB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIHRoZSBsYXN0IGVsZW1lbnQKLSAgICAgICAgICogcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9ubHkKLSAgICAgICAgICogb25jZSBwZXIgY2FsbCB0byBuZXh0LiBUaGUgYmVoYXZpb3Igb2YgYW4gaXRlcmF0b3IgaXMKLSAgICAgICAgICogdW5zcGVjaWZpZWQgaWYgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBpcyBtb2RpZmllZCB3aGlsZQotICAgICAgICAgKiB0aGUgaXRlcmF0aW9uIGlzIGluIHByb2dyZXNzIGluIGFueSB3YXkgb3RoZXIgdGhhbiBieQotICAgICAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCBtZXRob2QgaGFzIG5vdAotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXQgYmVlbiBjYWxsZWQsIG9yIHRoZQotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgbWV0aG9kIGhhcyBhbHJlYWR5Ci0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBsYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gdGhlIG5leHQgbWV0aG9kLgotICAgICAgICAgKiBAdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGVPcmRlcmVkTWFwIGlzCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCBiZWhpbmQKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpdGVyYXRvcidzCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoKQotICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAobGFzdFJldHVybmVkTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9ucyAhPSBleHBlY3RlZE1vZGlmaWNhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb1JlZEJsYWNrRGVsZXRlKGxhc3RSZXR1cm5lZE5vZGUpOwotCi0gICAgICAgICAgICBleHBlY3RlZE1vZGlmaWNhdGlvbnMrKzsKLQotICAgICAgICAgICAgbGFzdFJldHVybmVkTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAqKioqKioqKioqICBFTkQgIGltcGxlbWVudGF0aW9uIG9mIEl0ZXJhdG9yICoqKioqKioqKiogKi8KLSAgICB9ICAgIC8vIGVuZCBwcml2YXRlIGFic3RyYWN0IGNsYXNzIERvdWJsZU9yZGVyZWRNYXBJdGVyYXRvcgotCi0gICAgLy8gZmluYWwgZm9yIHBlcmZvcm1hbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIE1hcC5FbnRyeSwgS2V5VmFsdWUgewotCi0gICAgICAgIHByaXZhdGUgQ29tcGFyYWJsZVtdIGRhdGE7Ci0gICAgICAgIHByaXZhdGUgTm9kZVtdICAgICAgIGxlZnROb2RlOwotICAgICAgICBwcml2YXRlIE5vZGVbXSAgICAgICByaWdodE5vZGU7Ci0gICAgICAgIHByaXZhdGUgTm9kZVtdICAgICAgIHBhcmVudE5vZGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbltdICAgIGJsYWNrQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgIGhhc2hjb2RlVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgIGNhbGN1bGF0ZWRIYXNoQ29kZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogTWFrZSBhIG5ldyBjZWxsIHdpdGggZ2l2ZW4ga2V5IGFuZCB2YWx1ZSwgYW5kIHdpdGggbnVsbAotICAgICAgICAgKiBsaW5rcywgYW5kIGJsYWNrICh0cnVlKSBjb2xvcnMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBrZXkKLSAgICAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBOb2RlKGZpbmFsIENvbXBhcmFibGUga2V5LCBmaW5hbCBDb21wYXJhYmxlIHZhbHVlKSB7Ci0KLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICA9IG5ldyBDb21wYXJhYmxlW117IGtleSwgdmFsdWUgfTsKLSAgICAgICAgICAgIGxlZnROb2RlICAgICAgICAgICA9IG5ldyBOb2RlW117IG51bGwsIG51bGwgfTsKLSAgICAgICAgICAgIHJpZ2h0Tm9kZSAgICAgICAgICA9IG5ldyBOb2RlW117IG51bGwsIG51bGwgfTsKLSAgICAgICAgICAgIHBhcmVudE5vZGUgICAgICAgICA9IG5ldyBOb2RlW117IG51bGwsIG51bGwgfTsKLSAgICAgICAgICAgIGJsYWNrQ29sb3IgICAgICAgICA9IG5ldyBib29sZWFuW117IHRydWUsIHRydWUgfTsKLSAgICAgICAgICAgIGNhbGN1bGF0ZWRIYXNoQ29kZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGdldCB0aGUgc3BlY2lmaWVkIGRhdGEKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBrZXkgb3IgdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQ29tcGFyYWJsZSBnZXREYXRhKGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGFbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGlzIG5vZGUncyBsZWZ0IG5vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5vZGUgdGhlIG5ldyBsZWZ0IG5vZGUKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExlZnQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGxlZnROb2RlW2luZGV4XSA9IG5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogZ2V0IHRoZSBsZWZ0IG5vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBsZWZ0IG5vZGUgLS0gbWF5IGJlIG51bGwKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTm9kZSBnZXRMZWZ0KGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIGxlZnROb2RlW2luZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhpcyBub2RlJ3MgcmlnaHQgbm9kZQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbmV3IHJpZ2h0IG5vZGUKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFJpZ2h0KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByaWdodE5vZGVbaW5kZXhdID0gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBnZXQgdGhlIHJpZ2h0IG5vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSByaWdodCBub2RlIC0tIG1heSBiZSBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE5vZGUgZ2V0UmlnaHQoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gcmlnaHROb2RlW2luZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhpcyBub2RlJ3MgcGFyZW50IG5vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5vZGUgdGhlIG5ldyBwYXJlbnQgbm9kZQotICAgICAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0UGFyZW50KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBwYXJlbnROb2RlW2luZGV4XSA9IG5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogZ2V0IHRoZSBwYXJlbnQgbm9kZQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBub2RlIC0tIG1heSBiZSBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE5vZGUgZ2V0UGFyZW50KGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5vZGVbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGV4Y2hhbmdlIGNvbG9ycyB3aXRoIGFub3RoZXIgbm9kZQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBzd2FwIHdpdGgKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN3YXBDb2xvcnMoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLQotICAgICAgICAgICAgLy8gU3dhcCBjb2xvcnMgLS0gb2xkIGhhY2tlcidzIHRyaWNrCi0gICAgICAgICAgICBibGFja0NvbG9yW2luZGV4XSAgICAgIF49IG5vZGUuYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgICAgICBub2RlLmJsYWNrQ29sb3JbaW5kZXhdIF49IGJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICAgICAgYmxhY2tDb2xvcltpbmRleF0gICAgICBePSBub2RlLmJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGlzIHRoaXMgbm9kZSBibGFjaz8KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYmxhY2sgKHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgdHJ1ZSBib29sZWFuKQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmxhY2soZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogaXMgdGhpcyBub2RlIHJlZD8KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm9uLWJsYWNrCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWQoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gIWJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIG1ha2UgdGhpcyBub2RlIGJsYWNrCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBLRVkgb3IgVkFMVUUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRCbGFjayhmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGJsYWNrQ29sb3JbaW5kZXhdID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBtYWtlIHRoaXMgbm9kZSByZWQKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IEtFWSBvciBWQUxVRQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFJlZChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGJsYWNrQ29sb3JbaW5kZXhdID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogbWFrZSB0aGlzIG5vZGUgdGhlIHNhbWUgY29sb3IgYXMgYW5vdGhlcgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBhZG9wdGluZwotICAgICAgICAgKiBAcGFyYW0gaW5kZXggS0VZIG9yIFZBTFVFCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY29weUNvbG9yKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBibGFja0NvbG9yW2luZGV4XSA9IG5vZGUuYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAqKioqKioqKioqIFNUQVJUIGltcGxlbWVudGF0aW9uIG9mIE1hcC5FbnRyeSAqKioqKioqKioqICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW50cnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhW0tFWV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGlzIGVudHJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhW1ZBTFVFXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPcHRpb25hbCBvcGVyYXRpb24gdGhhdCBpcyBub3QgcGVybWl0dGVkIGluIHRoaXMKLSAgICAgICAgICogaW1wbGVtZW50YXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlnbm9yZWQKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgaWdub3JlZCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJNYXAuRW50cnkuc2V0VmFsdWUgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBlbnRyeSBmb3IgZXF1YWxpdHkuCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFsc28gYSBtYXAgZW50cnkgYW5kCi0gICAgICAgICAqIHRoZSB0d28gZW50cmllcyByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG8gb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGZvciBlcXVhbGl0eSB3aXRoIHRoaXMgbWFwCi0gICAgICAgICAqICAgICAgICAgIGVudHJ5LgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBtYXAKLSAgICAgICAgICogICAgICAgICBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCi0gICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRhW0tFWV0uZXF1YWxzKGUuZ2V0S2V5KCkpCi0gICAgICAgICAgICAgICAgICAgJiYgZGF0YVtWQUxVRV0uZXF1YWxzKGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1hcCBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0KLSAgICAgICAgICAgIGlmICghY2FsY3VsYXRlZEhhc2hDb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFzaGNvZGVWYWx1ZSAgICAgID0gZGF0YVtLRVldLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIGRhdGFbVkFMVUVdLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICAgICAgY2FsY3VsYXRlZEhhc2hDb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAqKioqKioqKioqICBFTkQgIGltcGxlbWVudGF0aW9uIG9mIE1hcC5FbnRyeSAqKioqKioqKioqICovCi0gICAgfQotfSAgICAvLyBlbmQgcHVibGljIGNsYXNzIERvdWJsZU9yZGVyZWRNYXAKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FbnVtZXJhdGlvblV0aWxzLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRW51bWVyYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWQ2MGM5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FbnVtZXJhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5FbnVtZXJhdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3Ige0BsaW5rIEVudW1lcmF0aW9ufSBpbnN0YW5jZXMuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJElkOiBFbnVtZXJhdGlvblV0aWxzLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMjoxNjoxOCBtcGFya2VyIEV4cCAkCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdncmVnb3J5QHNlYWd1bGxzdy5jb20iPkdhcnkgR3JlZ29yeTwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogRW51bWVyYXRpb25VdGlscyBpcyBub3Qgbm9ybWFsbHkgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvblV0aWxzKCkgewotICAgICAgICAvLyBubyBpbml0LgotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGlzdCBiYXNlZCBvbiBhbiBlbnVtZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiA8cD5BcyB0aGUgZW51bWVyYXRpb24gaXMgdHJhdmVyc2VkLCBhbiBBcnJheUxpc3Qgb2YgaXRzIHZhbHVlcyBpcwotICAgICAqIGNyZWF0ZWQuIFRoZSBuZXcgbGlzdCBpcyByZXR1cm5lZC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bWVyYXRpb24gIHRoZSBlbnVtZXJhdGlvbiB0byB0cmF2ZXJzZSwgd2hpY2ggc2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBlbnVtZXJhdGlvbiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikgewotICAgICAgICByZXR1cm4gSXRlcmF0b3JVdGlscy50b0xpc3QobmV3IEVudW1lcmF0aW9uSXRlcmF0b3IoZW51bWVyYXRpb24pKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9FeHRlbmRlZFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFhN2RmZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRXh0ZW5kZWRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgbm9ybWFsIEphdmEgcHJvcGVydGllcyBieSBhZGRpbmcgdGhlIHBvc3NpYmlsaXR5Ci0gKiB0byB1c2UgdGhlIHNhbWUga2V5IG1hbnkgdGltZXMgY29uY2F0ZW5hdGluZyB0aGUgdmFsdWUgc3RyaW5ncwotICogaW5zdGVhZCBvZiBvdmVyd3JpdGluZyB0aGVtLgotICogPHA+Ci0gKiA8Yj5QbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIDxjb2RlPlByb3BlcnRpZXNDb25maWd1cmF0aW9uPC9jb2RlPiBjbGFzcyBpbgotICogQ29tbW9ucy1Db25maWd1cmF0aW9uIGFzIHNvb24gYXMgaXQgaXMgcmVsZWFzZWQuPC9iPgotICogPHA+Ci0gKiBUaGUgRXh0ZW5kZWQgUHJvcGVydGllcyBzeW50YXggaXMgZXhwbGFpbmVkIGhlcmU6Ci0gKgotICogPHVsPgotICogIDxsaT4KLSAqICAgRWFjaCBwcm9wZXJ0eSBoYXMgdGhlIHN5bnRheCA8Y29kZT5rZXkgPSB2YWx1ZTwvY29kZT4KLSAqICA8L2xpPgotICogIDxsaT4KLSAqICAgVGhlIDxpPmtleTwvaT4gbWF5IHVzZSBhbnkgY2hhcmFjdGVyIGJ1dCB0aGUgZXF1YWwgc2lnbiAnPScuCi0gKiAgPC9saT4KLSAqICA8bGk+Ci0gKiAgIDxpPnZhbHVlPC9pPiBtYXkgYmUgc2VwYXJhdGVkIG9uIGRpZmZlcmVudCBsaW5lcyBpZiBhIGJhY2tzbGFzaAotICogICBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGF0IGNvbnRpbnVlcyBiZWxvdy4KLSAqICA8L2xpPgotICogIDxsaT4KLSAqICAgSWYgPGk+dmFsdWU8L2k+IGlzIGEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoIHRva2VuIGlzIHNlcGFyYXRlZAotICogICBieSBhIGNvbW1hICcsJy4KLSAqICA8L2xpPgotICogIDxsaT4KLSAqICAgQ29tbWFzIGluIGVhY2ggdG9rZW4gYXJlIGVzY2FwZWQgcGxhY2luZyBhIGJhY2tzbGFzaCByaWdodCBiZWZvcmUKLSAqICAgdGhlIGNvbW1hLgotICogIDwvbGk+Ci0gKiAgPGxpPgotICogICBCYWNrc2xhc2hlcyBhcmUgZXNjYXBlZCBieSB1c2luZyB0d28gY29uc2VjdXRpdmUgYmFja3NsYXNoZXMgaS5lLiBcXAotICogIDwvbGk+Ci0gKiAgPGxpPgotICogICBJZiBhIDxpPmtleTwvaT4gaXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIHZhbHVlcyBhcmUgYXBwZW5kZWQKLSAqICAgYXMgaWYgdGhleSB3ZXJlIG9uIHRoZSBzYW1lIGxpbmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLgotICogIDwvbGk+Ci0gKiAgPGxpPgotICogICBCbGFuayBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyMnIGFyZSBza2lwcGVkLgotICogIDwvbGk+Ci0gKiAgPGxpPgotICogICBJZiBhIHByb3BlcnR5IGlzIG5hbWVkICJpbmNsdWRlIiAob3Igd2hhdGV2ZXIgaXMgZGVmaW5lZCBieQotICogICBzZXRJbmNsdWRlKCkgYW5kIGdldEluY2x1ZGUoKSBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgcHJvcGVydHkgaXMKLSAqICAgdGhlIGZ1bGwgcGF0aCB0byBhIGZpbGUgb24gZGlzaywgdGhhdCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW50bwotICogICB0aGUgQ29uZmlndXJhdGlvbnNSZXBvc2l0b3J5LiBZb3UgY2FuIGFsc28gcHVsbCBpbiBmaWxlcyByZWxhdGl2ZQotICogICB0byB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gU28gaWYgeW91IGhhdmUgc29tZXRoaW5nCi0gKiAgIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIGluY2x1ZGUgPSBhZGRpdGlvbmFsLnByb3BlcnRpZXMKLSAqCi0gKiAgIFRoZW4gImFkZGl0aW9uYWwucHJvcGVydGllcyIgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHNhbWUKLSAqICAgZGlyZWN0b3J5IGFzIHRoZSBwYXJlbnQgY29uZmlndXJhdGlvbiBmaWxlLgotICogCi0gKiAgIER1cGxpY2F0ZSBuYW1lIHZhbHVlcyB3aWxsIGJlIHJlcGxhY2VkLCBzbyBiZSBjYXJlZnVsLgotICoKLSAqICA8L2xpPgotICogPC91bD4KLSAqCi0gKiA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSB2YWxpZCBleHRlbmRlZCBwcm9wZXJ0aWVzIGZpbGU6Ci0gKgotICogPHA+PHByZT4KLSAqICAgICAgIyBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGNvbW1lbnRzCi0gKgotICogICAgICAjIFRoaXMgaXMgdGhlIHNpbXBsZXN0IHByb3BlcnR5Ci0gKiAgICAgIGtleSA9IHZhbHVlCi0gKgotICogICAgICAjIEEgbG9uZyBwcm9wZXJ0eSBtYXkgYmUgc2VwYXJhdGVkIG9uIG11bHRpcGxlIGxpbmVzCi0gKiAgICAgIGxvbmd2YWx1ZSA9IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBcCi0gKiAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQotICoKLSAqICAgICAgIyBUaGlzIGlzIGEgcHJvcGVydHkgd2l0aCBtYW55IHRva2VucwotICogICAgICB0b2tlbnNfb25fYV9saW5lID0gZmlyc3QgdG9rZW4sIHNlY29uZCB0b2tlbgotICoKLSAqICAgICAgIyBUaGlzIHNlcXVlbmNlIGdlbmVyYXRlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdAotICogICAgICB0b2tlbnNfb25fbXVsdGlwbGVfbGluZXMgPSBmaXJzdCB0b2tlbgotICogICAgICB0b2tlbnNfb25fbXVsdGlwbGVfbGluZXMgPSBzZWNvbmQgdG9rZW4KLSAqCi0gKiAgICAgICMgY29tbWFzIG1heSBiZSBlc2NhcGVkIGluIHRva2VucwotICogICAgICBjb21tYXMuZXNjYXBlZCA9IEhpXCwgd2hhdCd1cD8KLSAqIDwvcHJlPgotICoKLSAqIDxwPjxiPk5PVEU8L2I+OiB0aGlzIGNsYXNzIGhhcyA8Yj5ub3Q8L2I+IGJlZW4gd3JpdHRlbiBmb3IKLSAqIHBlcmZvcm1hbmNlIG5vciBsb3cgbWVtb3J5IHVzYWdlLiAgSW4gZmFjdCwgaXQncyB3YXkgc2xvd2VyIHRoYW4gaXQKLSAqIGNvdWxkIGJlIGFuZCBnZW5lcmF0ZXMgdG9vIG11Y2ggbWVtb3J5IGdhcmJhZ2UuICBCdXQgc2luY2UKLSAqIHBlcmZvcm1hbmNlIGlzIG5vdCBhbiBpc3N1ZSBkdXJpbmcgaW50aWFsaXphdGlvbiAoYW5kIHRoZXJlIGlzIG5vdAotICogbXVjaCB0aW1lIHRvIGltcHJvdmUgaXQpLCBJIHdyb3RlIGl0IHRoaXMgd2F5LiAgSWYgeW91IGRvbid0IGxpa2UKLSAqIGl0LCBnbyBhaGVhZCBhbmQgdHVuZSBpdCB1cCEKLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPlN0ZWZhbm8gTWF6em9jY2hpPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86am9uQGxhdGNoa2V5LmNvbSI+Sm9uIFMuIFN0ZXZlbnM8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkYXZlYkBtaWNlZGEtZGF0YSI+RGF2ZSBCcnlzb248L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqdmFuenlsQHBlcmlhcHQuY29tIj5KYXNvbiB2YW4gWnlsPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z2Vpcm1Ab3B0b25saW5lLm5ldCI+R2VpciBNYWdudXNzb24gSnIuPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bGVvbkBvcHRpY29kZS5jby56YSI+TGVvbiBNZXNzZXJzY2htaWR0PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a2pvaG5zb25AdHJhbnNwYXJlbnQuY29tIj5LZW50IEpvaG5zb248L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkbHJAZmluZW1hbHRjb2RpbmcuY29tIj5EYW5pZWwgUmFsbDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmlwcmloYUBzdXJmZXUuZmkiPklsa2thIFByaWhhPC9hPgotICogQGF1dGhvciBKYW5layBCb2d1Y2tpCi0gKiBAYXV0aG9yIE1vaGFuIEtpc2hvcmUKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFNoaW5vYnUgS2F3YWkKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmhwc0BpbnRlcm1ldGEuZGUiPkhlbm5pbmcgUC4gU2NobWllZGVoYXVzZW48L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFByb3BlcnRpZXMgZXh0ZW5kcyBIYXNodGFibGUgewotICAgIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uZmlndXJhdGlvbnMgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEV4dGVuZGVkUHJvcGVydGllcyBkZWZhdWx0czsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaWxlIGNvbm5lY3RlZCB0byB0aGlzIHJlcG9zaXRvcnkgKGhvbGRpbmcgY29tbWVudHMgYW5kCi0gICAgICogc3VjaCkuCi0gICAgICoKLSAgICAgKiBAc2VyaWFsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlOwotCi0gICAgLyoqCi0gICAgICogQmFzZSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdXNlZCB0byBjcmVhdGUKLSAgICAgKiB0aGlzIEV4dGVuZGVkUHJvcGVydGllcyBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotICAgIC8qKgotICAgICAqIEZpbGUgc2VwYXJhdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQotICAgIC8qKgotICAgICAqIEhhcyB0aGlzIGNvbmZpZ3VyYXRpb24gYmVlbiBpbnRpYWxpemVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2FuIHBvaW50IHRvIG90aGVyCi0gICAgICogcHJvcGVydGllcyBmaWxlIGZvciBpbmNsdWRpbmcgb3RoZXIgcHJvcGVydGllcyBmaWxlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmNsdWRlID0gImluY2x1ZGUiOwotCi0gICAgLyoqCi0gICAgICogVGhlc2UgYXJlIHRoZSBrZXlzIGluIHRoZSBvcmRlciB0aGV5IGxpc3RlZAotICAgICAqIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4KLSAgICAgKiB5b3Ugd2lzaCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aCBjb25maWd1cmF0aW9uCi0gICAgICogaW5mb3JtYXRpb24gaW4gYSBwYXJ0aWN1bGFyIG9yZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnJheUxpc3Qga2V5c0FzTGlzdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBUlRfVE9LRU49IiR7IjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFTkRfVE9LRU49In0iOwotCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcnBvbGF0ZSBrZXkgbmFtZXMgdG8gaGFuZGxlICR7a2V5fSBzdHVmZgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2Ugc3RyaW5nIHRvIGludGVycG9sYXRlCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBrZXkgbmFtZSB3aXRoIHRoZSAke2tleX0gc3Vic3RpdHV0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBiYXNlKSB7Ci0gICAgICAgIC8vIENPUElFRCBmcm9tIFtjb25maWd1cmF0aW9uXSAyMDAzLTEyLTI5Ci0gICAgICAgIHJldHVybiAoaW50ZXJwb2xhdGVIZWxwZXIoYmFzZSwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZSBoYW5kbGVyIGZvciBtdWx0aXBsZSBsZXZlbHMgb2YgaW50ZXJwb2xhdGlvbi4KLSAgICAgKgotICAgICAqIFdoZW4gY2FsbGVkIHRoZSBmaXJzdCB0aW1lLCBwcmlvclZhcmlhYmxlcyBzaG91bGQgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlIHN0cmluZyB3aXRoIHRoZSAke2tleX0gdmFyaWFibGVzCi0gICAgICogQHBhcmFtIHByaW9yVmFyaWFibGVzIHNlcnZlcyB0d28gcHVycG9zZXM6IHRvIGFsbG93IGNoZWNraW5nIGZvcgotICAgICAqIGxvb3BzLCBhbmQgY3JlYXRpbmcgYSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiBtZXNzYWdlIHNob3VsZCBhIGxvb3AKLSAgICAgKiBvY2N1ci4gIEl0J3MgMCd0aCBlbGVtZW50IHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiBiYXNlIGZyb20KLSAgICAgKiB0aGUgZmlyc3QgY2FsbC4gIEFsbCBzdWJzZXF1ZW50IGludGVycG9sYXRlZCB2YXJpYWJsZXMgYXJlIGFkZGVkCi0gICAgICogYWZ0ZXJ3YXJkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggdGhlIGludGVycG9sYXRpb24gdGFrZW4gY2FyZSBvZgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgaW50ZXJwb2xhdGVIZWxwZXIoU3RyaW5nIGJhc2UsIExpc3QgcHJpb3JWYXJpYWJsZXMpIHsKLSAgICAgICAgLy8gQ09QSUVEIGZyb20gW2NvbmZpZ3VyYXRpb25dIDIwMDMtMTItMjkKLSAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvbiB0aGUgZmlyc3QgY2FsbCBpbml0aWFsaXplIHByaW9yVmFyaWFibGVzCi0gICAgICAgIC8vIGFuZCBhZGQgYmFzZSBhcyB0aGUgZmlyc3QgZWxlbWVudAotICAgICAgICBpZiAocHJpb3JWYXJpYWJsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJpb3JWYXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcmlvclZhcmlhYmxlcy5hZGQoYmFzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYmVnaW4gPSAtMTsKLSAgICAgICAgaW50IGVuZCA9IC0xOwotICAgICAgICBpbnQgcHJlYyA9IDAgLSBFTkRfVE9LRU4ubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZyB2YXJpYWJsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBwcm9iYWJseSBhbGxvdyB0aGUgZXNjYXBpbmcgb2YgdGhlIHN0YXJ0IHRva2VuCi0gICAgICAgIHdoaWxlICgoKGJlZ2luID0gYmFzZS5pbmRleE9mKFNUQVJUX1RPS0VOLCBwcmVjICsgRU5EX1RPS0VOLmxlbmd0aCgpKSkgPiAtMSkKLSAgICAgICAgICAgICYmICgoZW5kID0gYmFzZS5pbmRleE9mKEVORF9UT0tFTiwgYmVnaW4pKSA+IC0xKSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChiYXNlLnN1YnN0cmluZyhwcmVjICsgRU5EX1RPS0VOLmxlbmd0aCgpLCBiZWdpbikpOwotICAgICAgICAgICAgdmFyaWFibGUgPSBiYXNlLnN1YnN0cmluZyhiZWdpbiArIFNUQVJUX1RPS0VOLmxlbmd0aCgpLCBlbmQpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSd2ZSBnb3QgYSBsb29wLCBjcmVhdGUgYSB1c2VmdWwgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIHRocm93Ci0gICAgICAgICAgICBpZiAocHJpb3JWYXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluaXRpYWxCYXNlID0gcHJpb3JWYXJpYWJsZXMucmVtb3ZlKDApLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcHJpb3JWYXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcHJpb3JWYXJpYWJsZVNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmljZSB0cmFjZSBvZiBpbnRlcnBvbGF0ZWQgdmFyaWFibGVzIGxpa2Ugc286Ci0gICAgICAgICAgICAgICAgLy8gdmFyMS0+dmFyMi0+dmFyMwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwcmlvclZhcmlhYmxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yVmFyaWFibGVTYi5hcHBlbmQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JWYXJpYWJsZVNiLmFwcGVuZCgiLT4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJpbmZpbml0ZSBsb29wIGluIHByb3BlcnR5IGludGVycG9sYXRpb24gb2YgIiArIGluaXRpYWxCYXNlICsgIjogIiArIHByaW9yVmFyaWFibGVTYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgYWRkIHRoaXMgdmFyaWFibGUgdG8gdGhlIGludGVycG9sYXRpb24gbGlzdC4KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHByaW9yVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vUVVFU1RJT046IGdldFByb3BlcnR5IG9yIGdldFByb3BlcnR5RGlyZWN0Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRQcm9wZXJ0eSh2YXJpYWJsZSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW50ZXJwb2xhdGVIZWxwZXIodmFsdWUudG9TdHJpbmcoKSwgcHJpb3JWYXJpYWJsZXMpKTsKLQotICAgICAgICAgICAgICAgIC8vIHBvcCB0aGUgaW50ZXJwb2xhdGVkIHZhcmlhYmxlIG9mZiB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAvLyB0aGlzIG1haW50YWlucyBwcmlvclZhcmlhYmxlcyBjb3JyZWN0bmVzcyBmb3IKLSAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIHdpdGggbXVsdGlwbGUgaW50ZXJwb2xhdGlvbnMsIGUuZy4KLSAgICAgICAgICAgICAgICAvLyBwcm9wLm5hbWU9JHtzb21lLm90aGVyLnByb3AxfS9ibGFoYmxhaC8ke3NvbWUub3RoZXIucHJvcDJ9Ci0gICAgICAgICAgICAgICAgcHJpb3JWYXJpYWJsZXMucmVtb3ZlKHByaW9yVmFyaWFibGVzLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0cyAhPSBudWxsICYmIGRlZmF1bHRzLmdldFN0cmluZyh2YXJpYWJsZSwgbnVsbCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVmYXVsdHMuZ2V0U3RyaW5nKHZhcmlhYmxlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdmFyaWFibGUgbm90IGRlZmluZWQgLSBzbyBwdXQgaXQgYmFjayBpbiB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFNUQVJUX1RPS0VOKS5hcHBlbmQodmFyaWFibGUpLmFwcGVuZChFTkRfVE9LRU4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJlYyA9IGVuZDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJhc2Uuc3Vic3RyaW5nKHByZWMgKyBFTkRfVE9LRU4ubGVuZ3RoKCksIGJhc2UubGVuZ3RoKCkpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBiYWNrc2xhc2ggYmVmb3JlIGV2ZXJ5IGNvbW1hIGFuZCBiYWNrc2xhc2guIAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IGJ1Zi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnLCcgfHwgYyA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmluc2VydChpLCAnXFwnKTsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgYmFja3NsYXNoIGZyb20gZXZlcnkgcGFpciBvZiBiYWNrc2xhc2hlcy4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBzKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGgoKSAtIDE7IGkrKykgewotICAgICAgICAgICAgY2hhciBjMSA9IGJ1Zi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBjaGFyIGMyID0gYnVmLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICBpZiAoYzEgPT0gJ1xcJyAmJiBjMiA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2l2ZSB0aW1lcyAnY2gnIGFwcGVhcnMgaW4gdGhlCi0gICAgICogJ2xpbmUnIGJlZm9yZSB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IHRoZSAnaW5kZXgnLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudFByZWNlZGluZyhTdHJpbmcgbGluZSwgaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgIT0gY2gpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXggLSAxIC0gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGxpbmUgZW5kcyB3aXRoIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMgCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aFNsYXNoKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghbGluZS5lbmRzV2l0aCgiXFwiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoY291bnRQcmVjZWRpbmcobGluZSwgbGluZS5sZW5ndGgoKSAtIDEsICdcXCcpICUgMiA9PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGxpbmVzLiAgVGhlc2UgbGluZXMgZG8KLSAgICAgKiBub3QgdGVybWluYXRlIHdpdGggbmV3LWxpbmUgY2hhcnMgYnV0IHJhdGhlciB3aGVuIHRoZXJlIGlzIG5vCi0gICAgICogYmFja3NsYXNoIHNpZ24gYSB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhpcyBpcyB1c2VkIHRvCi0gICAgICogY29uY2F0ZW5hdGUgbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5LgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBQcm9wZXJ0aWVzUmVhZGVyIGV4dGVuZHMgTGluZU51bWJlclJlYWRlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYWRlciBBIFJlYWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzUmVhZGVyKFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKHJlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHByb3BlcnR5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHByb3BlcnR5Ci0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgZGlmZmljdWx0eSByZWFkaW5nIHRoZSBzb3VyY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRQcm9wZXJ0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkTGluZSgpOwotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoKGxpbmUubGVuZ3RoKCkgIT0gMCkgJiYgKGxpbmUuY2hhckF0KDApICE9ICcjJykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHNXaXRoU2xhc2gobGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgIC8vIG5vcm1hbCBtZXRob2QgZW5kCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZSA9IHJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIEVPRiByZWFjaGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGRpdmlkZXMgaW50byB0b2tlbnMgYSBwcm9wZXJ0eSB2YWx1ZS4gIFRva2VuCi0gICAgICogc2VwYXJhdG9yIGlzICIsIiBidXQgY29tbWFzIGludG8gdGhlIHByb3BlcnR5IHZhbHVlIGFyZSBlc2NhcGVkCi0gICAgICogdXNpbmcgdGhlIGJhY2tzbGFzaCBpbiBmcm9udC4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgUHJvcGVydGllc1Rva2VuaXplciBleHRlbmRzIFN0cmluZ1Rva2VuaXplciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcHJvcGVydHkgZGVsaW1pdGVyIHVzZWQgd2hpbGUgcGFyc2luZyAoYSBjb21tYSkuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICIsIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdHJpbmcgQSBTdHJpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvcGVydGllc1Rva2VuaXplcihTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgICAgICBzdXBlcihzdHJpbmcsIERFTElNSVRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyBtb3JlIHRva2Vucy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIG1vcmUgdG9rZW5zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNNb3JlVG9rZW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IG5leHQgdG9rZW4uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIG5leHRUb2tlbigpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBzdXBlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGhTbGFzaCh0b2tlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW4ubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoREVMSU1JVEVSKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBleHRlbmRlZCBwcm9wZXJ0aWVzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5kZWRQcm9wZXJ0aWVzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIGxvYWRzIHRoZSBleHRlbmRlZCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUgIHRoZSBmaWxlbmFtZSB0byBsb2FkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGZpbGUgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuZGVkUHJvcGVydGllcyhTdHJpbmcgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhmaWxlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCBsb2FkcyB0aGUgZXh0ZW5kZWQgcHJvcGVydGllcyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlICB0aGUgZmlsZW5hbWUgdG8gbG9hZAotICAgICAqIEBwYXJhbSBkZWZhdWx0RmlsZSAgYSBzZWNvbmQgZmlsZW5hbWUgdG8gbG9hZCBkZWZhdWx0IHZhbHVlcyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGZpbGUgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuZGVkUHJvcGVydGllcyhTdHJpbmcgZmlsZSwgU3RyaW5nIGRlZmF1bHRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotCi0gICAgICAgIGJhc2VQYXRoID0gbmV3IEZpbGUoZmlsZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIGJhc2VQYXRoID0gYmFzZVBhdGguc3Vic3RyaW5nKDAsIGJhc2VQYXRoLmxhc3RJbmRleE9mKGZpbGVTZXBhcmF0b3IpICsgMSk7Ci0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIHRoaXMubG9hZChpbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmYXVsdEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVmYXVsdHMgPSBuZXcgRXh0ZW5kZWRQcm9wZXJ0aWVzKGRlZmF1bHRGaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRvIGNsaWVudCBjb2RlIHdoZXRoZXIgcHJvcGVydHkKLSAgICAgKiByZXNvdXJjZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgICByZXR1cm4gaXNJbml0aWFsaXplZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgaW5jbHVkaW5nIG90aGVyIHByb3BlcnRpZXMgZmlsZXMuCi0gICAgICogQnkgZGVmYXVsdCBpdCBpcyAiaW5jbHVkZSIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZSgpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGluY2x1ZGluZyBvdGhlciBwcm9wZXJ0aWVzIGZpbGVzLgotICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgImluY2x1ZGUiLgotICAgICAqCi0gICAgICogQHBhcmFtIGluYyBBIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlKFN0cmluZyBpbmMpIHsKLSAgICAgICAgaW5jbHVkZSA9IGluYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIElucHV0U3RyZWFtIHRvIGxvYWQgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU8gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9hZChpbnB1dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0KLSAgICAgKiBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIElucHV0U3RyZWFtIHRvIGxvYWQgZnJvbQotICAgICAqIEBwYXJhbSBlbmMgIHRoZSBlbmNvZGluZyB0byB1c2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgZW5jKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQcm9wZXJ0aWVzUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChlbmMgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgUHJvcGVydGllc1JlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXQsIGVuYykpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIEFub3RoZXIgdHJ5IGNvbWluZyB1cC4uLi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBQcm9wZXJ0aWVzUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dCwgIjg4NTlfMSIpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBJU084ODU5LTEgc3VwcG9ydCBpcyByZXF1aXJlZCBvbiBqYXZhIHBsYXRmb3JtcyBidXQuLi4uCi0gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nCi0gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IFByb3BlcnRpZXNSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIEVPRgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZXF1YWxTaWduID0gbGluZS5pbmRleE9mKCc9Jyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXF1YWxTaWduID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgZXF1YWxTaWduKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGVxdWFsU2lnbiArIDEpLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDb25maWd1cmUgcHJvZHVjZXMgbGluZXMgbGlrZSB0aGlzIC4uLiBqdXN0IGlnbm9yZSB0aGVtCi0gICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRJbmNsdWRlKCkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzSWdub3JlQ2FzZShnZXRJbmNsdWRlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBsb2FkIHByb3BlcnRpZXMgZmlsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChmaWxlU2VwYXJhdG9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBzbyB3ZSdsbCB1c2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLCBhbmQgd2UgaGF2ZSB0d28gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9ybXMgaGVyZS4gSWYgd2UgaGF2ZSB0aGUgIi4vIiBmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBqdXN0IHN0cmlwIHRoYXQgb2ZmIGZpcnN0IGJlZm9yZSBjb250aW51aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCIuIiArIGZpbGVTZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gTG9hZGluZyBpcyBpbml0aWFsaXppbmcKLSAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHByb3BlcnR5IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHByb3BlcnR5IHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB2YWx1ZSBhcyBvYmplY3QuIFdpbGwgcmV0dXJuIHVzZXIgdmFsdWUgaWYgZXhpc3RzLAotICAgICAqICAgICAgICBpZiBub3QgdGhlbiBkZWZhdWx0IHZhbHVlIGlmIGV4aXN0cywgb3RoZXJ3aXNlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgLy8gZmlyc3QsIHRyeSB0byBnZXQgZnJvbSB0aGUgJ3VzZXIgdmFsdWUnIHN0b3JlCi0gICAgICAgIE9iamVjdCBvYmogPSB0aGlzLmdldChrZXkpOwotCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXNuJ3QgYSB2YWx1ZSB0aGVyZSwgZ2V0IGl0IGZyb20gdGhlCi0gICAgICAgICAgICAvLyBkZWZhdWx0cyBpZiB3ZSBoYXZlIHRoZW0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqID0gZGVmYXVsdHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBwcm9wZXJ0eSB0byB0aGUgY29uZmlndXJhdGlvbi4gSWYgaXQgYWxyZWFkeQotICAgICAqIGV4aXN0cyB0aGVuIHRoZSB2YWx1ZSBzdGF0ZWQgaGVyZSB3aWxsIGJlIGFkZGVkCi0gICAgICogdG8gdGhlIGNvbmZpZ3VyYXRpb24gZW50cnkuIEZvciBleGFtcGxlLCBpZgotICAgICAqCi0gICAgICogPGNvZGU+cmVzb3VyY2UubG9hZGVyID0gZmlsZTwvY29kZT4KLSAgICAgKgotICAgICAqIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgeW91Ci0gICAgICoKLSAgICAgKiA8Y29kZT5hZGRQcm9wZXJ0eSgicmVzb3VyY2UubG9hZGVyIiwgImNsYXNzcGF0aCIpPC9jb2RlPgotICAgICAqCi0gICAgICogVGhlbiB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIFZlY3RvciBsaWtlIHRoZQotICAgICAqIGZvbGxvd2luZzoKLSAgICAgKgotICAgICAqIDxjb2RlPlsiZmlsZSIsICJjbGFzc3BhdGgiXTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpIHZhbHVlOwotICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKFByb3BlcnRpZXNUb2tlbml6ZXIuREVMSU1JVEVSKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0b2tlbiBjb250YWlucyBjb21tYXMsIHNvIG11c3QgYmUgc3BsaXQgYXBhcnQgdGhlbiBhZGRlZAotICAgICAgICAgICAgICAgIFByb3BlcnRpZXNUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFByb3BlcnRpZXNUb2tlbml6ZXIoc3RyKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SW50ZXJuYWwoa2V5LCB1bmVzY2FwZSh0b2tlbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdG9rZW4gY29udGFpbnMgbm8gY29tbWFzLCBzbyBjYW4gYmUgc2ltcGx5IGFkZGVkCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJbnRlcm5hbChrZXksIHVuZXNjYXBlKHN0cikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUHJvcGVydHlJbnRlcm5hbChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZGluZyBhIHByb3BlcnR5IGNvbm5vdGVzIGluaXRpYWxpemF0aW9uCi0gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBrZXkvdmFsdWUgcGFpciB0byB0aGUgbWFwLiAgVGhpcyByb3V0aW5lIGRvZXMKLSAgICAgKiBubyBtYWdpYyBtb3JwaGluZy4gIEl0IGVuc3VyZXMgdGhlIGtleWxpc3QgaXMgbWFpbnRhaW5lZAotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzdG9yZSBhdAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIGRlY29kZWQgb2JqZWN0IHRvIHN0b3JlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5RGlyZWN0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyBzYWZldHkgY2hlY2sKLSAgICAgICAgaWYgKCFjb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICBrZXlzQXNMaXN0ZWQuYWRkKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkZWNvZGVkIHByb3BlcnR5IHRvIHRoZSBtYXAgdy9vIGNoZWNraW5nIGZvciBjb21tYXMgLSB1c2VkCi0gICAgICogaW50ZXJuYWxseSB3aGVuIGEgcHJvcGVydHkgaGFzIGJlZW4gYnJva2VuIHVwIGludG8KLSAgICAgKiBzdHJpbmdzIHRoYXQgY291bGQgY29udGFpbiBlc2NhcGVkIGNvbW1hcyB0byBwcmV2ZW50Ci0gICAgICogdGhlIGluYWR2ZXJ0ZW50IHZlY3Rvcml6YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhhbmtzIHRvIExlb24gTWVzc2Vyc2NobWlkdCBmb3IgdGhpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHN0b3JlIGF0Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgZGVjb2RlZCBvYmplY3QgdG8gc3RvcmUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlJbnRlcm5hbChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSB0aGlzLmdldChrZXkpOwotCi0gICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAvLyBvbmUgb2JqZWN0IGFscmVhZHkgaW4gbWFwIC0gY29udmVydCBpdCB0byBhIHZlY3RvcgotICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgVmVjdG9yKDIpOwotICAgICAgICAgICAgdmFsdWVzLmFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgcHV0KGtleSwgdmFsdWVzKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAvLyBhbHJlYWR5IGEgbGlzdCAtIGp1c3QgYWRkIHRoZSBuZXcgdG9rZW4KLSAgICAgICAgICAgICgoTGlzdCkgY3VycmVudCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYnJhbmQgbmV3IGtleSAtIHN0b3JlIGluIGtleXNBc0xpc3RlZCB0byByZXRhaW4gb3JkZXIKLSAgICAgICAgICAgIGlmICghY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGtleXNBc0xpc3RlZC5hZGQoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIHByb3BlcnR5LCB0aGlzIHdpbGwgcmVwbGFjZSBhbnkgcHJldmlvdXNseQotICAgICAqIHNldCB2YWx1ZXMuIFNldCB2YWx1ZXMgaXMgaW1wbGljaXRseSBhIGNhbGwKLSAgICAgKiB0byBjbGVhclByb3BlcnR5KGtleSksIGFkZFByb3BlcnR5KGtleSx2YWx1ZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBjbGVhclByb3BlcnR5KGtleSk7Ci0gICAgICAgIGFkZFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJlYW0gaXMgbm90IGNsb3NlZCwgYnV0IGl0IGlzIGZsdXNoZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0cHV0ICBhbiBPdXRwdXRTdHJlYW0sIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGhlYWRlciAgYSB0ZXh0dWFsIGNvbW1lbnQgdG8gYWN0IGFzIGEgZmlsZSBoZWFkZXIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXQsIFN0cmluZyBoZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFByaW50V3JpdGVyIHRoZVdydHIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0KTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVXcnRyLnByaW50bG4oaGVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW51bWVyYXRpb24gdGhlS2V5cyA9IGtleXMoKTsKLSAgICAgICAgd2hpbGUgKHRoZUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSB0aGVLZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoa2V5KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjdXJyZW50T3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0LmFwcGVuZChrZXkpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0LmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0LmFwcGVuZChlc2NhcGUoKFN0cmluZykgdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlV3J0ci5wcmludGxuKGN1cnJlbnRPdXRwdXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gKExpc3QpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEVsZW1lbnQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY3VycmVudE91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPdXRwdXQuYXBwZW5kKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0LmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE91dHB1dC5hcHBlbmQoZXNjYXBlKGN1cnJlbnRFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGVXcnRyLnByaW50bG4oY3VycmVudE91dHB1dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoZVdydHIucHJpbnRsbigpOwotICAgICAgICAgICAgdGhlV3J0ci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tYmluZXMgYW4gZXhpc3RpbmcgSGFzaHRhYmxlIHdpdGggdGhpcyBIYXNodGFibGUuCi0gICAgICogPHA+Ci0gICAgICogV2FybmluZzogSXQgd2lsbCBvdmVyd3JpdGUgcHJldmlvdXMgZW50cmllcyB3aXRob3V0IHdhcm5pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcHMgIHRoZSBwcm9wZXJ0aWVzIHRvIGNvbWJpbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21iaW5lKEV4dGVuZGVkUHJvcGVydGllcyBwcm9wcykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcHMuZ2V0S2V5cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgc2V0UHJvcGVydHkoa2V5LCBwcm9wcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgYSBwcm9wZXJ0eSBpbiB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBwcm9wZXJ0eSBrZXkgdG8gcmVtb3ZlIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyUHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHJlYnVpbGQgdGhlIGtleXNBc0xpc3RlZCBvciBlbHNlCi0gICAgICAgICAgICAvLyB0aGluZ3MgZ2V0ICp2ZXJ5KiBjb25mdXNpbmcKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5c0FzTGlzdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgga2V5c0FzTGlzdGVkLmdldChpKSkuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5c0FzTGlzdGVkLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogcmVwb3NpdG9yeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb3ZlciB0aGUga2V5cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRLZXlzKCkgewotICAgICAgICByZXR1cm4ga2V5c0FzTGlzdGVkLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIHJlcG9zaXRvcnkgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggIHRoZSBwcmVmaXggdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGtleXMgdGhhdCBtYXRjaCB0aGUgcHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEtleXMoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBJdGVyYXRvciBrZXlzID0gZ2V0S2V5cygpOwotICAgICAgICBBcnJheUxpc3QgbWF0Y2hpbmdLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBrZXkpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgIG1hdGNoaW5nS2V5cy5hZGQoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hpbmdLZXlzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEV4dGVuZGVkUHJvcGVydGllcyBvYmplY3QgdGhhdCBpcyBhIHN1YnNldAotICAgICAqIG9mIHRoaXMgb25lLiBUYWtlIGludG8gYWNjb3VudCBkdXBsaWNhdGUga2V5cwotICAgICAqIGJ5IHVzaW5nIHRoZSBzZXRQcm9wZXJ0eSgpIGluIEV4dGVuZGVkUHJvcGVydGllcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggIHRoZSBwcmVmaXggdG8gZ2V0IGEgc3Vic2V0IGZvcgotICAgICAqIEByZXR1cm4gYSBuZXcgaW5kZXBlbmRlbnQgRXh0ZW5kZWRQcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIEV4dGVuZGVkUHJvcGVydGllcyBzdWJzZXQoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBFeHRlbmRlZFByb3BlcnRpZXMgYyA9IG5ldyBFeHRlbmRlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGdldEtleXMoKTsKLSAgICAgICAgYm9vbGVhbiB2YWxpZFN1YnNldCA9IGZhbHNlOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBrZXkpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgIGlmICghdmFsaWRTdWJzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRTdWJzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgYy5zdWJzZXQocHJlZml4KSBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICogYmxvdyB1cCB3aGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgKiB3aXRoIHRoZSBrZXkgcHJlZml4LiBUaGlzIGlzIG5vdCBhIHVzZWZ1bAotICAgICAgICAgICAgICAgICAqIHN1YnNldCBidXQgaXQgaXMgYSB2YWxpZCBzdWJzZXQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0tleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBrZXkpLmxlbmd0aCgpID09IHByZWZpeC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBwcmVmaXg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3S2V5ID0gKChTdHJpbmcpIGtleSkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIHVzZSBhZGRQcm9wZXJ0eURpcmVjdCgpIC0gdGhpcyB3aWxsIHBsdWcgdGhlIGRhdGEgYXMgCi0gICAgICAgICAgICAgICAgICogIGlzIGludG8gdGhlIE1hcCwgYnV0IHdpbGwgYWxzbyBkbyB0aGUgcmlnaHQgdGhpbmcKLSAgICAgICAgICAgICAgICAgKiAgcmUga2V5IGFjY291bnRpbmcKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjLmFkZFByb3BlcnR5RGlyZWN0KG5ld0tleSwgZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbGlkU3Vic2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHRvIFN5c3RlbS5vdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcGxheSgpIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGdldEtleXMoKTsKLQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGtleSArICIgPT4gIiArIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBzdHJpbmcuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBzdHJpbmcgaWYga2V5IGlzIGZvdW5kLAotICAgICAqIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoa2V5KTsKLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShkZWZhdWx0cy5nZXRTdHJpbmcoa2V5LCBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoKFN0cmluZykgKChMaXN0KSB2YWx1ZSkuZ2V0KDApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGEgU3RyaW5nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgcHJvcGVydGllcyBpZiBrZXkgaXMgZm91bmQuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIFN0cmluZy9MaXN0LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgdG9rZW5zIGlzCi0gICAgICogbWFsZm9ybWVkIChkb2VzIG5vdCBjb250YWluIGFuIGVxdWFscyBzaWduKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnRpZXMoa2V5LCBuZXcgUHJvcGVydGllcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBsaXN0IG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGlmIGtleSBpcyBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgU3RyaW5nL0xpc3QuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgb25lIG9mIHRoZSB0b2tlbnMgaXMKLSAgICAgKiBtYWxmb3JtZWQgKGRvZXMgbm90IGNvbnRhaW4gYW4gZXF1YWxzIHNpZ24pLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIGtleSwgUHJvcGVydGllcyBkZWZhdWx0cykgewotICAgICAgICAvKgotICAgICAgICAgKiBHcmFiIGFuIGFycmF5IG9mIHRoZSB0b2tlbnMgZm9yIHRoaXMga2V5LgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gZ2V0U3RyaW5nQXJyYXkoa2V5KTsKLQotICAgICAgICAvLyBFYWNoIHRva2VuIGlzIG9mIHRoZSBmb3JtICdrZXk9dmFsdWUnLgotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdHMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5zW2ldOwotICAgICAgICAgICAgaW50IGVxdWFsU2lnbiA9IHRva2VuLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgIGlmIChlcXVhbFNpZ24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBrZXkgPSB0b2tlbi5zdWJzdHJpbmcoMCwgZXF1YWxTaWduKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHB2YWx1ZSA9IHRva2VuLnN1YnN0cmluZyhlcXVhbFNpZ24gKyAxKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgcHJvcHMucHV0KHBrZXksIHB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1wnJyArIHRva2VuICsgIicgZG9lcyBub3QgY29udGFpbiAiICsgImFuIGVxdWFscyBzaWduIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBhcnJheSBvZiBzdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotICAgICAqIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgc3RyaW5nIGFycmF5IGlmIGtleSBpcyBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgU3RyaW5nL0xpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0KLSAgICAgICAgTGlzdCB2YWx1ZXM7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgdmFsdWVzID0gbmV3IFZlY3RvcigxKTsKLSAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSAoTGlzdCkgdmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXRTdHJpbmdBcnJheShrZXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGEgU3RyaW5nL0xpc3Qgb2JqZWN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3ZhbHVlcy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdG9rZW5zW2ldID0gKFN0cmluZykgdmFsdWVzLmdldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b2tlbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgVmVjdG9yIG9mIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uCi0gICAgICoga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBWZWN0b3IuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIFZlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldFZlY3RvcihTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRWZWN0b3Ioa2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBWZWN0b3Igb2Ygc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIDxwPgotICAgICAqIFRoZSBsaXN0IGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgZGF0YSBvZiB0aGlzIG9iamVjdCwgYW5kIGFzCi0gICAgICogc3VjaCB5b3UgbWF5IGFsdGVyIGl0IGZyZWVseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBWZWN0b3IuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIFZlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldFZlY3RvcihTdHJpbmcga2V5LCBWZWN0b3IgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKChMaXN0KSB2YWx1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgVmVjdG9yIHZhbHVlcyA9IG5ldyBWZWN0b3IoMSk7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlcyk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHMuZ2V0VmVjdG9yKGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoZGVmYXVsdFZhbHVlID09IG51bGwpID8gbmV3IFZlY3RvcigpIDogZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGEgVmVjdG9yIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgTGlzdCBvZiBzdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGxpc3QgaXMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBkYXRhIG9mIHRoaXMgb2JqZWN0LCBhbmQgYXMKLSAgICAgKiBzdWNoIHlvdSBtYXkgYWx0ZXIgaXQgZnJlZWx5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBMaXN0IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgTGlzdC4KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3Qoa2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBMaXN0IG9mIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbGlzdCBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGRhdGEgb2YgdGhpcyBvYmplY3QsIGFuZCBhcwotICAgICAqIHN1Y2ggeW91IG1heSBhbHRlciBpdCBmcmVlbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgTGlzdC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgTGlzdC4KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0KFN0cmluZyBrZXksIExpc3QgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KChMaXN0KSB2YWx1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICBwdXQoa2V5LCB2YWx1ZXMpOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzLmdldExpc3Qoa2V5LCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbignXCcnICsga2V5ICsgIicgZG9lc24ndCBtYXAgdG8gYSBMaXN0IG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgYm9vbGVhbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBib29sZWFuLgotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBkb2Vzbid0Ci0gICAgICogbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgQm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpIHsKLSAgICAgICAgQm9vbGVhbiBiID0gZ2V0Qm9vbGVhbihrZXksIG51bGwpOwotICAgICAgICBpZiAoYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhbiBleGlzdGluZyBvYmplY3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGJvb2xlYW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBib29sZWFuLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBCb29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oa2V5LCBuZXcgQm9vbGVhbihkZWZhdWx0VmFsdWUpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBib29sZWFuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgYm9vbGVhbiBpZiBrZXkgaXMgZm91bmQgYW5kIGhhcyB2YWxpZAotICAgICAqIGZvcm1hdCwgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBCb29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgdmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Qm9vbGVhbigoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICBCb29sZWFuIGIgPSBuZXcgQm9vbGVhbihzKTsKLSAgICAgICAgICAgIHB1dChrZXksIGIpOwotICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXRCb29sZWFuKGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGEgQm9vbGVhbiBvYmplY3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgc3RyaW5nIHJlcHJlc2VudCBieSB2YWx1ZSBtYXBzIHRvIGEgYm9vbGVhbgotICAgICAqIHZhbHVlIG9yIG5vdC4gV2Ugd2lsbCBhbGxvdyA8Y29kZT50cnVlPC9jb2RlPiwgPGNvZGU+b248L2NvZGU+LAotICAgICAqIGFuZCA8Y29kZT55ZXM8L2NvZGU+IGZvciBhIDxjb2RlPnRydWU8L2NvZGU+IGJvb2xlYW4gdmFsdWUsIGFuZAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiwgPGNvZGU+b2ZmPC9jb2RlPiwgYW5kIDxjb2RlPm5vPC9jb2RlPiBmb3IKLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gYm9vbGVhbiB2YWx1ZXMuICBDYXNlIG9mIHZhbHVlIHRvIHRlc3QgZm9yCi0gICAgICogYm9vbGVhbiBzdGF0dXMgaXMgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHRlc3QgZm9yIGJvb2xlYW4gc3RhdGUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc3VwcGxpZWQKLSAgICAgKiB0ZXh0IG1hcHMgdG8gYSBib29sZWFuIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0ZXN0Qm9vbGVhbihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgIGlmIChzLmVxdWFscygidHJ1ZSIpIHx8IHMuZXF1YWxzKCJvbiIpIHx8IHMuZXF1YWxzKCJ5ZXMiKSkgewotICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKLSAgICAgICAgfSBlbHNlIGlmIChzLmVxdWFscygiZmFsc2UiKSB8fCBzLmVxdWFscygib2ZmIikgfHwgcy5lcXVhbHMoIm5vIikpIHsKLSAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBieXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGJ5dGUuCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IGRvZXNuJ3QKLSAgICAgKiBtYXAgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBCeXRlLgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgQnl0ZSBiID0gZ2V0Qnl0ZShrZXksIG51bGwpOwotICAgICAgICBpZiAoYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYi5ieXRlVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiIGRvZXNuJ3QgbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgYnl0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGJ5dGUuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEJ5dGUuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoU3RyaW5nIGtleSwgYnl0ZSBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ5dGUoa2V5LCBuZXcgQnl0ZShkZWZhdWx0VmFsdWUpKS5ieXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBieXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgYnl0ZSBpZiBrZXkgaXMgZm91bmQgYW5kIGhhcyB2YWxpZAotICAgICAqIGZvcm1hdCwgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEJ5dGUuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBCeXRlIGdldEJ5dGUoU3RyaW5nIGtleSwgQnl0ZSBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgewotICAgICAgICAgICAgcmV0dXJuIChCeXRlKSB2YWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBCeXRlIGIgPSBuZXcgQnl0ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICBwdXQoa2V5LCBiKTsKLSAgICAgICAgICAgIHJldHVybiBiOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHMuZ2V0Qnl0ZShrZXksIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhIEJ5dGUgb2JqZWN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzaG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBzaG9ydC4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgZG9lc24ndAotICAgICAqIG1hcCB0byBhbiBleGlzdGluZyBvYmplY3QuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIFNob3J0LgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoU3RyaW5nIGtleSkgewotICAgICAgICBTaG9ydCBzID0gZ2V0U2hvcnQoa2V5LCBudWxsKTsKLSAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHMuc2hvcnRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc2hvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBzaG9ydC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgU2hvcnQuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChTdHJpbmcga2V5LCBzaG9ydCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFNob3J0KGtleSwgbmV3IFNob3J0KGRlZmF1bHRWYWx1ZSkpLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzaG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHNob3J0IGlmIGtleSBpcyBmb3VuZCBhbmQgaGFzIHZhbGlkCi0gICAgICogZm9ybWF0LCBkZWZhdWx0IHZhbHVlIG90aGVyd2lzZS4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgU2hvcnQuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBTaG9ydCBnZXRTaG9ydChTdHJpbmcga2V5LCBTaG9ydCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoU2hvcnQpIHZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIFNob3J0IHMgPSBuZXcgU2hvcnQoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcHV0KGtleSwgcyk7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzLmdldFNob3J0KGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGEgU2hvcnQgb2JqZWN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGFzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcmVzb3VyY2UgbmFtZS4KLSAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgYXMgYW4gaW50ZWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0SW50ZWdlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGFzIGFuIGludGVnZXIsIG9yIGEgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHBhcmFtIGRlZiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHJlc291cmNlIGFzIGFuIGludGVnZXIuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUsIGludCBkZWYpIHsKLSAgICAgICAgcmV0dXJuIGdldEludGVnZXIobmFtZSwgZGVmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBpbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgaW50LgotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBkb2Vzbid0Ci0gICAgICogbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGtleSBtYXBzIHRvIGFuCi0gICAgICogb2JqZWN0IHRoYXQgaXMgbm90IGEgSW50ZWdlci4KLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHZhbHVlIG1hcHBlZAotICAgICAqIGJ5IHRoZSBrZXkgaGFzIG5vdCBhIHZhbGlkIG51bWJlciBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLSAgICAgICAgSW50ZWdlciBpID0gZ2V0SW50ZWdlcihrZXksIG51bGwpOwotICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgaW50LgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBJbnRlZ2VyLgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludGVnZXIoU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBJbnRlZ2VyIGkgPSBnZXRJbnRlZ2VyKGtleSwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGludCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGludCBpZiBrZXkgaXMgZm91bmQgYW5kIGhhcyB2YWxpZAotICAgICAqIGZvcm1hdCwgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEludGVnZXIuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSwgSW50ZWdlciBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcigoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICBwdXQoa2V5LCBpKTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHMuZ2V0SW50ZWdlcihrZXksIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhIEludGVnZXIgb2JqZWN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBsb25nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGxvbmcuCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IGRvZXNuJ3QKLSAgICAgKiBtYXAgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBMb25nLgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgTG9uZyBsID0gZ2V0TG9uZyhrZXksIG51bGwpOwotICAgICAgICBpZiAobCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbC5sb25nVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhbiBleGlzdGluZyBvYmplY3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGxvbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBsb25nLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBMb25nLgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb25nKGtleSwgbmV3IExvbmcoZGVmYXVsdFZhbHVlKSkubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbG9uZyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGxvbmcgaWYga2V5IGlzIGZvdW5kIGFuZCBoYXMgdmFsaWQKLSAgICAgKiBmb3JtYXQsIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBMb25nLgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9uZyBnZXRMb25nKFN0cmluZyBrZXksIExvbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoTG9uZykgdmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgTG9uZyBsID0gbmV3IExvbmcoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgcHV0KGtleSwgbCk7Ci0gICAgICAgICAgICByZXR1cm4gbDsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzLmdldExvbmcoa2V5LCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbignXCcnICsga2V5ICsgIicgZG9lc24ndCBtYXAgdG8gYSBMb25nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgZmxvYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgZmxvYXQuCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IGRvZXNuJ3QKLSAgICAgKiBtYXAgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBGbG9hdC4KLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHZhbHVlIG1hcHBlZAotICAgICAqIGJ5IHRoZSBrZXkgaGFzIG5vdCBhIHZhbGlkIG51bWJlciBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgRmxvYXQgZiA9IGdldEZsb2F0KGtleSwgbnVsbCk7Ci0gICAgICAgIGlmIChmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhbiBleGlzdGluZyBvYmplY3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGZsb2F0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgZmxvYXQuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEZsb2F0LgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBnZXRGbG9hdChrZXksIG5ldyBGbG9hdChkZWZhdWx0VmFsdWUpKS5mbG9hdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgZmxvYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBmbG9hdCBpZiBrZXkgaXMgZm91bmQgYW5kIGhhcyB2YWxpZAotICAgICAqIGZvcm1hdCwgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIEZsb2F0LgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgdmFsdWUgbWFwcGVkCi0gICAgICogYnkgdGhlIGtleSBoYXMgbm90IGEgdmFsaWQgbnVtYmVyIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSwgRmxvYXQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKEZsb2F0KSB2YWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBGbG9hdCBmID0gbmV3IEZsb2F0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIHB1dChrZXksIGYpOwotICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXRGbG9hdChrZXksIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCdcJycgKyBrZXkgKyAiJyBkb2Vzbid0IG1hcCB0byBhIEZsb2F0IG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgZG91YmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGRvdWJsZS4KLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgZG9lc24ndAotICAgICAqIG1hcCB0byBhbiBleGlzdGluZyBvYmplY3QuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBrZXkgbWFwcyB0byBhbgotICAgICAqIG9iamVjdCB0aGF0IGlzIG5vdCBhIERvdWJsZS4KLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHZhbHVlIG1hcHBlZAotICAgICAqIGJ5IHRoZSBrZXkgaGFzIG5vdCBhIHZhbGlkIG51bWJlciBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGtleSkgewotICAgICAgICBEb3VibGUgZCA9IGdldERvdWJsZShrZXksIG51bGwpOwotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZC5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oJ1wnJyArIGtleSArICInIGRvZXNuJ3QgbWFwIHRvIGFuIGV4aXN0aW5nIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgZG91YmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgZG91YmxlLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBEb3VibGUuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGdldERvdWJsZShrZXksIG5ldyBEb3VibGUoZGVmYXVsdFZhbHVlKSkuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBkb3VibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBkb3VibGUgaWYga2V5IGlzIGZvdW5kIGFuZCBoYXMgdmFsaWQKLSAgICAgKiBmb3JtYXQsIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IG1hcHMgdG8gYW4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBub3QgYSBEb3VibGUuCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSB2YWx1ZSBtYXBwZWQKLSAgICAgKiBieSB0aGUga2V5IGhhcyBub3QgYSB2YWxpZCBudW1iZXIgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIERvdWJsZSBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKERvdWJsZSkgdmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgRG91YmxlIGQgPSBuZXcgRG91YmxlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIHB1dChrZXksIGQpOwotICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5nZXREb3VibGUoa2V5LCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbignXCcnICsga2V5ICsgIicgZG9lc24ndCBtYXAgdG8gYSBEb3VibGUgb2JqZWN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgc3RhbmRhcmQgcHJvcGVydGllcyBjbGFzcyBpbnRvIGEgY29uZmlndXJhdGlvbiBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBOT1RFOiBGcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yIHRoaXMgbWV0aG9kIHdpbGwgcGljayB1cAotICAgICAqIGFueSBkZWZhdWx0IHBhcmVudCBQcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BzICB0aGUgcHJvcGVydGllcyBvYmplY3QgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gbmV3IEV4dGVuZGVkUHJvcGVydGllcyBjcmVhdGVkIGZyb20gcHJvcHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEV4dGVuZGVkUHJvcGVydGllcyBjb252ZXJ0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0gICAgICAgIEV4dGVuZGVkUHJvcGVydGllcyBjID0gbmV3IEV4dGVuZGVkUHJvcGVydGllcygpOwotCi0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgYy5zZXRQcm9wZXJ0eShzLCBwcm9wcy5nZXRQcm9wZXJ0eShzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYWN0b3J5LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDhmMmUzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi0vKioKLSAqIERlZmluZXMgYSBmdW5jdG9yIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIG9iamVjdHMuCi0gKiA8cD4KLSAqIEEgPGNvZGU+RmFjdG9yeTwvY29kZT4gY3JlYXRlcyBhbiBvYmplY3Qgd2l0aG91dCB1c2luZyBhbiBpbnB1dCBwYXJhbWV0ZXIuCi0gKiBJZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIHRoZW4ge0BsaW5rIFRyYW5zZm9ybWVyfSBpcyBtb3JlIGFwcHJvcHJpYXRlLgotICogPHA+Ci0gKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YgY29tbW9uIGZhY3RvcmllcyBhcmUgcHJvdmlkZWQgYnkKLSAqIHtAbGluayBGYWN0b3J5VXRpbHN9LiBUaGVzZSBpbmNsdWRlIGZhY3RvcmllcyB0aGF0IHJldHVybiBhIGNvbnN0YW50LAotICogYSBjb3B5IG9mIGEgcHJvdG90eXBlIG9yIGEgbmV3IGluc3RhbmNlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICoKLSAqIEBhdXRob3IgQXJyb24gQmF0ZXMKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3QKLSAgICAgKiBAdGhyb3dzIEZ1bmN0b3JFeGNlcHRpb24gKHJ1bnRpbWUpIGlmIHRoZSBmYWN0b3J5IGNhbm5vdCBjcmVhdGUgYW4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnlVdGlscy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3RvcnlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTkzOWU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYWN0b3J5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW5zdGFudGlhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Qcm90b3R5cGVGYWN0b3J5OwotCi0vKioKLSAqIDxjb2RlPkZhY3RvcnlVdGlsczwvY29kZT4gcHJvdmlkZXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9ucyBhbmQgdXRpbGl0aWVzCi0gKiBmb3IgdGhlIEZhY3RvcnkgZnVuY3RvciBpbnRlcmZhY2UuIFRoZSBzdXBwbGllZCBmYWN0b3JpZXMgYXJlOgotICogPHVsPgotICogPGxpPlByb3RvdHlwZSAtIGNsb25lcyBhIHNwZWNpZmllZCBvYmplY3QKLSAqIDxsaT5SZWZsZWN0aW9uIC0gY3JlYXRlcyBvYmplY3RzIHVzaW5nIHJlZmxlY3Rpb24KLSAqIDxsaT5Db25zdGFudCAtIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIG9iamVjdAotICogPGxpPk51bGwgLSBhbHdheXMgcmV0dXJucyBudWxsCi0gKiA8bGk+RXhjZXB0aW9uIC0gYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24KLSAqIDwvdWw+Ci0gKiBBbGwgdGhlIHN1cHBsaWVkIGZhY3RvcmllcyBhcmUgU2VyaWFsaXphYmxlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWN0b3J5VXRpbHMgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBGYWN0b3J5VXRpbHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEZhY3RvcnkgdGhhdCBhbHdheXMgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCBkdXJpbmcgdGVzdGluZyBhcyBhIHBsYWNlaG9sZGVyLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuRXhjZXB0aW9uRmFjdG9yeQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnkgZXhjZXB0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbkZhY3RvcnkuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEZhY3RvcnkgdGhhdCB3aWxsIHJldHVybiBudWxsIGVhY2ggdGltZSB0aGUgZmFjdG9yeSBpcyB1c2VkLgotICAgICAqIFRoaXMgY291bGQgYmUgdXNlZnVsIGR1cmluZyB0ZXN0aW5nIGFzIGEgcGxhY2Vob2xkZXIuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudEZhY3RvcnkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IG51bGxGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRGYWN0b3J5Lk5VTExfSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEZhY3RvcnkgdGhhdCB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QgZWFjaCB0aW1lIHRoZSBmYWN0b3J5Ci0gICAgICogaXMgdXNlZC4gTm8gY2hlY2sgaXMgbWFkZSB0aGF0IHRoZSBvYmplY3QgaXMgaW1tdXRhYmxlLiBJbiBnZW5lcmFsLCBvbmx5Ci0gICAgICogaW1tdXRhYmxlIG9iamVjdHMgc2hvdWxkIHVzZSB0aGUgY29uc3RhbnQgZmFjdG9yeS4gTXV0YWJsZSBvYmplY3RzIHNob3VsZAotICAgICAqIHVzZSB0aGUgcHJvdG90eXBlIGZhY3RvcnkuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudEZhY3RvcnkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRUb1JldHVybiAgdGhlIGNvbnN0YW50IG9iamVjdCB0byByZXR1cm4gZWFjaCB0aW1lIGluIHRoZSBmYWN0b3J5Ci0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y29uc3RhbnQ8L2NvZGU+IGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IGNvbnN0YW50RmFjdG9yeShPYmplY3QgY29uc3RhbnRUb1JldHVybikgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRGYWN0b3J5LmdldEluc3RhbmNlKGNvbnN0YW50VG9SZXR1cm4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGYWN0b3J5IHRoYXQgd2lsbCByZXR1cm4gYSBjbG9uZSBvZiB0aGUgc2FtZSBwcm90b3R5cGUgb2JqZWN0Ci0gICAgICogZWFjaCB0aW1lIHRoZSBmYWN0b3J5IGlzIHVzZWQuIFRoZSBwcm90b3R5cGUgd2lsbCBiZSBjbG9uZWQgdXNpbmcgb25lIG9mIHRoZXNlCi0gICAgICogdGVjaG5pcXVlcyAoaW4gb3JkZXIpOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+cHVibGljIGNsb25lIG1ldGhvZAotICAgICAqIDxsaT5wdWJsaWMgY29weSBjb25zdHJ1Y3RvcgotICAgICAqIDxsaT5zZXJpYWxpemF0aW9uIGNsb25lCi0gICAgICogPHVsPgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuUHJvdG90eXBlRmFjdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm90b3R5cGUgIHRoZSBvYmplY3QgdG8gY2xvbmUgZWFjaCB0aW1lIGluIHRoZSBmYWN0b3J5Ci0gICAgICogQHJldHVybiB0aGUgPGNvZGU+cHJvdG90eXBlPC9jb2RlPiBmYWN0b3J5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3RvdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3RvdHlwZSBjYW5ub3QgYmUgY2xvbmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IHByb3RvdHlwZUZhY3RvcnkoT2JqZWN0IHByb3RvdHlwZSkgewotICAgICAgICByZXR1cm4gUHJvdG90eXBlRmFjdG9yeS5nZXRJbnN0YW5jZShwcm90b3R5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGYWN0b3J5IHRoYXQgY2FuIGNyZWF0ZSBvYmplY3RzIG9mIGEgc3BlY2lmaWMgdHlwZSB1c2luZwotICAgICAqIGEgbm8tYXJncyBjb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbnRpYXRlRmFjdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc1RvSW5zdGFudGlhdGUgIHRoZSBDbGFzcyB0byBpbnN0YW50aWF0ZSBlYWNoIHRpbWUgaW4gdGhlIGZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5yZWZsZWN0aW9uPC9jb2RlPiBmYWN0b3J5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNsYXNzVG9JbnN0YW50aWF0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IGluc3RhbnRpYXRlRmFjdG9yeShDbGFzcyBjbGFzc1RvSW5zdGFudGlhdGUpIHsKLSAgICAgICAgcmV0dXJuIEluc3RhbnRpYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShjbGFzc1RvSW5zdGFudGlhdGUsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBGYWN0b3J5IHRoYXQgY2FuIGNyZWF0ZSBvYmplY3RzIG9mIGEgc3BlY2lmaWMgdHlwZSB1c2luZwotICAgICAqIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIHRvIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW5zdGFudGlhdGVGYWN0b3J5Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXNzVG9JbnN0YW50aWF0ZSAgdGhlIENsYXNzIHRvIGluc3RhbnRpYXRlIGVhY2ggdGltZSBpbiB0aGUgZmFjdG9yeQotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICBwYXJhbWV0ZXIgdHlwZXMgZm9yIHRoZSBjb25zdHJ1Y3RvciwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gYXJncyAgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3RvciwgY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5yZWZsZWN0aW9uPC9jb2RlPiBmYWN0b3J5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNsYXNzVG9JbnN0YW50aWF0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmFtVHlwZXMgYW5kIGFyZ3MgZG9uJ3QgbWF0Y2gKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgZG9lc24ndCBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBpbnN0YW50aWF0ZUZhY3RvcnkoQ2xhc3MgY2xhc3NUb0luc3RhbnRpYXRlLCBDbGFzc1tdIHBhcmFtVHlwZXMsIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIEluc3RhbnRpYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShjbGFzc1RvSW5zdGFudGlhdGUsIHBhcmFtVHlwZXMsIGFyZ3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0QXJyYXlMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlNTFjZDEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RBcnJheUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogPHA+QSBjdXN0b21pemVkIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmphdmEudXRpbC5BcnJheUxpc3Q8L2NvZGU+IGRlc2lnbmVkCi0gKiB0byBvcGVyYXRlIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB3aGVyZSB0aGUgbGFyZ2UgbWFqb3JpdHkgb2YKLSAqIG1ldGhvZCBjYWxscyBhcmUgcmVhZC1vbmx5LCBpbnN0ZWFkIG9mIHN0cnVjdHVyYWwgY2hhbmdlcy4gIFdoZW4gb3BlcmF0aW5nCi0gKiBpbiAiZmFzdCIgbW9kZSwgcmVhZCBjYWxscyBhcmUgbm9uLXN5bmNocm9uaXplZCBhbmQgd3JpdGUgY2FsbHMgcGVyZm9ybSB0aGUKLSAqIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+Q2xvbmUgdGhlIGV4aXN0aW5nIGNvbGxlY3Rpb24KLSAqIDxsaT5QZXJmb3JtIHRoZSBtb2RpZmljYXRpb24gb24gdGhlIGNsb25lCi0gKiA8bGk+UmVwbGFjZSB0aGUgZXhpc3RpbmcgY29sbGVjdGlvbiB3aXRoIHRoZSAobW9kaWZpZWQpIGNsb25lCi0gKiA8L3VsPgotICogPHA+V2hlbiBmaXJzdCBjcmVhdGVkLCBvYmplY3RzIG9mIHRoaXMgY2xhc3MgZGVmYXVsdCB0byAic2xvdyIgbW9kZSwgd2hlcmUKLSAqIGFsbCBhY2Nlc3NlcyBvZiBhbnkgdHlwZSBhcmUgc3luY2hyb25pemVkIGJ1dCBubyBjbG9uaW5nIHRha2VzIHBsYWNlLiAgVGhpcwotICogaXMgYXBwcm9wcmlhdGUgZm9yIGluaXRpYWxseSBwb3B1bGF0aW5nIHRoZSBjb2xsZWN0aW9uLCBmb2xsb3dlZCBieSBhIHN3aXRjaAotICogdG8gImZhc3QiIG1vZGUgKGJ5IGNhbGxpbmcgPGNvZGU+c2V0RmFzdCh0cnVlKTwvY29kZT4pIGFmdGVyIGluaXRpYWxpemF0aW9uCi0gKiBpcyBjb21wbGV0ZS48L3A+Ci0gKgotICogPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiBJZiB5b3UgYXJlIGNyZWF0aW5nIGFuZCBhY2Nlc3NpbmcgYW4KLSAqIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb25seSB3aXRoaW4gYSBzaW5nbGUgdGhyZWFkLCB5b3Ugc2hvdWxkIHVzZQotICogPGNvZGU+amF2YS51dGlsLkFycmF5TGlzdDwvY29kZT4gZGlyZWN0bHkgKHdpdGggbm8gc3luY2hyb25pemF0aW9uKSwgZm9yCi0gKiBtYXhpbXVtIHBlcmZvcm1hbmNlLjwvcD4KLSAqCi0gKiA8cD48c3Ryb25nPk5PVEU8L3N0cm9uZz46IDxpPlRoaXMgY2xhc3MgaXMgbm90IGNyb3NzLXBsYXRmb3JtLgotICogVXNpbmcgaXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgZmFpbHVyZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzLjwvaT4KLSAqIEl0IHN1ZmZlcnMgZnJvbSB0aGUgc2FtZSBwcm9ibGVtcyBhcyB0aGUgZG91YmxlLWNoZWNrZWQgbG9ja2luZyBpZGlvbS4gIAotICogSW4gcGFydGljdWxhciwgdGhlIGluc3RydWN0aW9uIHRoYXQgY2xvbmVzIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uIGFuZCB0aGUgCi0gKiBpbnN0cnVjdGlvbiB0aGF0IHNldHMgdGhlIGludGVybmFsIHJlZmVyZW5jZSB0byB0aGUgY2xvbmUgY2FuIGJlIGV4ZWN1dGVkIAotICogb3IgcGVyY2VpdmVkIG91dC1vZi1vcmRlci4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgcmVhZCBvcGVyYXRpb24gbWlnaHQgZmFpbCAKLSAqIHVuZXhwZWN0ZWRseSwgYXMgaXQgbWF5IGJlIHJlYWRpbmcgdGhlIHN0YXRlIG9mIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uCi0gKiBiZWZvcmUgdGhlIGludGVybmFsIGNvbGxlY3Rpb24gaXMgZnVsbHkgZm9ybWVkLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRvdWJsZS1jaGVja2VkIGxvY2tpbmcgaWRpb20sIHNlZSB0aGUKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudW1kLmVkdS9+cHVnaC9qYXZhL21lbW9yeU1vZGVsL0RvdWJsZUNoZWNrZWRMb2NraW5nLmh0bWwiPgotICogRG91YmxlLUNoZWNrZWQgTG9ja2luZyBJZGlvbSBJcyBCcm9rZW4gRGVjbGFyYXRpb248L2E+LjwvcD4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXN0QXJyYXlMaXN0IGV4dGVuZHMgQXJyYXlMaXN0IHsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCi0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGFuIGVtcHR5IGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIEZhc3RBcnJheUxpc3QoKSB7Ci0KLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgVGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGVtcHR5IGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRmFzdEFycmF5TGlzdChpbnQgY2FwYWNpdHkpIHsKLQotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0KGNhcGFjaXR5KTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24sCi0gICAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBpbml0aWFsaXplIHRoZSBjb250ZW50cwotICAgICAqICBvZiB0aGlzIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRmFzdEFycmF5TGlzdChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0KGNvbGxlY3Rpb24pOwotCi0gICAgfQotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKLQotCi0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcgbGlzdCB3ZSBhcmUgbWFuYWdpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0ID0gbnVsbDsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCi0KLQotICAgIC8qKgotICAgICAqIEFyZSB3ZSBvcGVyYXRpbmcgaW4gImZhc3QiIG1vZGU/Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFzdCA9IGZhbHNlOwotCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlzdCBpcyBvcGVyYXRpbmcgaW4gZmFzdCBtb2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGxpc3QgaXMgb3BlcmF0aW5nIGluIGZhc3QgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEZhc3QoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5mYXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0cyB3aGV0aGVyIHRoaXMgbGlzdCB3aWxsIG9wZXJhdGUgaW4gZmFzdCBtb2RlLgotICAgICAqCi0gICAgICogIEBwYXJhbSBmYXN0IHRydWUgaWYgdGhlIGxpc3Qgc2hvdWxkIG9wZXJhdGUgaW4gZmFzdCBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFzdChib29sZWFuIGZhc3QpIHsKLSAgICAgICAgdGhpcy5mYXN0ID0gZmFzdDsKLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcwotCi0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGJlIGFwcGVuZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBlbGVtZW50KSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdGVtcC5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LmFkZChlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdCwKLSAgICAgKiBhbmQgc2hpZnQgYWxsIHJlbWFpbmluZyBlbGVtZW50cyB1cCBvbmUgcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoaXMgZWxlbWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGJlIGluc2VydGVkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIHRlbXAuYWRkKGluZGV4LCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIENvbGxlY3Rpb24gdG8gdGhlIGVuZAotICAgICAqIG9mIHRoaXMgbGlzdCwgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIENvbGxlY3Rpb24ncyBJdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGJlIGFwcGVuZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRlbXAuYWRkQWxsKGNvbGxlY3Rpb24pOwotICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC5hZGRBbGwoY29sbGVjdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluc2VydCBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogcG9zaXRpb24gaW4gdGhpcyBsaXN0LCBhbmQgc2hpZnQgYW55IHByZXZpb3VzIGVsZW1lbnRzIHVwd2FyZHMgYXMKLSAgICAgKiBuZWVkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggYXQgd2hpY2ggaW5zZXJ0aW9uIHRha2VzIHBsYWNlCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gYmUgYWRkZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdGVtcC5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pOwotICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgbGlzdC4gIFRoZSBsaXN0IHdpbGwgYmUgZW1wdHkKLSAgICAgKiBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgPGNvZGU+Y2xlYXIoKTwvY29kZT4KLSAgICAgKiAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgdGVtcC5jbGVhcigpOwotICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIDxjb2RlPkZhc3RBcnJheUxpc3Q8L2NvZGU+IGluc3RhbmNlLgotICAgICAqIFRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0KLSAgICAgICAgRmFzdEFycmF5TGlzdCByZXN1bHRzID0gbnVsbDsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgRmFzdEFycmF5TGlzdChsaXN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgRmFzdEFycmF5TGlzdChsaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHRzLnNldEZhc3QoZ2V0RmFzdCgpKTsKLSAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbGlzdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byB0ZXN0IGZvcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiAobGlzdC5jb250YWlucyhlbGVtZW50KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3QuY29udGFpbnMoZWxlbWVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGxpc3QgY29udGFpbnMgYWxsIG9mIHRoZSBlbGVtZW50cwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChsaXN0LmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC5jb250YWluc0FsbChjb2xsZWN0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSW5jcmVhc2UgdGhlIGNhcGFjaXR5IG9mIHRoaXMgPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBpbnN0YW5jZSwgaWYKLSAgICAgKiBuZWNlc3NhcnksIHRvIGVuc3VyZSB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIG1pbmltdW0gY2FwYWNpdHkgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgVGhlIG5ldyBtaW5pbXVtIGNhcGFjaXR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IGNhcGFjaXR5KSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIHRlbXAuZW5zdXJlQ2FwYWNpdHkoY2FwYWNpdHkpOwotICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5lbnN1cmVDYXBhY2l0eShjYXBhY2l0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgbGlzdCBmb3IgZXF1YWxpdHkuICBUaGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gdXNlcyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlCi0gICAgICogbGlzdCBlcXVhbHMgZnVuY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQotICAgICAqIDxjb2RlPkxpc3QuZXF1YWxzPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBPYmplY3QgdG8gYmUgY29tcGFyZWQgdG8gdGhpcyBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0KLSAgICAgICAgLy8gU2ltcGxlIHRlc3RzIHRoYXQgcmVxdWlyZSBubyBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgaWYgKG8gPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCEobyBpbnN0YW5jZW9mIExpc3QpKQotICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgIExpc3QgbG8gPSAoTGlzdCkgbzsKLQotICAgICAgICAvLyBDb21wYXJlIHRoZSBzZXRzIG9mIGVsZW1lbnRzIGZvciBlcXVhbGl0eQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGxpMSA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBMaXN0SXRlcmF0b3IgbGkyID0gbG8ubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobGkxLmhhc05leHQoKSAmJiBsaTIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8xID0gbGkxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgbzIgPSBsaTIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghKG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICghKGxpMS5oYXNOZXh0KCkgfHwgbGkyLmhhc05leHQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGxpMSA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIGxpMiA9IGxvLmxpc3RJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChsaTEuaGFzTmV4dCgpICYmIGxpMi5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8xID0gbGkxLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8yID0gbGkyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEobzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKCEobGkxLmhhc05leHQoKSB8fCBsaTIuaGFzTmV4dCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChsaXN0LmdldChpbmRleCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGxpc3QuICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgKiBleGFjdGx5IHRoZSBjb2RlIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGxpc3QgaGFzaCBmdW5jdGlvbiBpbiB0aGUKLSAgICAgKiBkb2N1bWVudGF0aW9uIGZvciB0aGUgPGNvZGU+TGlzdC5oYXNoQ29kZTwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIGludCBoYXNoQ29kZSA9IDE7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgKG8gPT0gbnVsbCA/IDAgOiBvLmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChoYXNoQ29kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSAxOwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyAobyA9PSBudWxsID8gMCA6IG8uaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoaGFzaENvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGdpdmVuIGFyZ3VtZW50LCB0ZXN0aW5nCi0gICAgICogZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kLCBhbmQgcmV0dXJuCi0gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXgsIG9yIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgZWxlbWVudCkgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxpc3QuaW5kZXhPZihlbGVtZW50KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3QuaW5kZXhPZihlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBpZiB0aGlzIGxpc3QgaGFzIG5vIGVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiAobGlzdC5pc0VtcHR5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIgc2VxdWVuY2UuCi0gICAgICogPHA+Ci0gICAgICogPGI+VGhyZWFkIHNhZmV0eTwvYj48YnIgLz4KLSAgICAgKiBUaGUgaXRlcmF0b3IgcmV0dXJuZWQgaXMgdGhyZWFkLXNhZmUgT05MWSBpbiBGQVNUIG1vZGUuCi0gICAgICogSW4gc2xvdyBtb2RlIHRoZXJlIGlzIG5vIHdheSB0byBzeW5jaHJvbml6ZSwgb3IgbWFrZSB0aGUgaXRlcmF0b3IgdGhyZWFkLXNhZmUuCi0gICAgICogPHA+Ci0gICAgICogSW4gZmFzdCBtb2RlIGl0ZXJhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIG1heSBvY2N1ciBpbiBwYXJhbGxlbCBvbiBkaWZmZXJlbnQgdGhyZWFkcywKLSAgICAgKiBob3dldmVyIHRoZXJlIGlzIGEgcmVzdHJpY3Rpb24uIE1vZGlmaWNhdGlvbiBtdXN0IGJlIEVJVEhFUiB2aWEgdGhlIEl0ZXJhdG9yCi0gICAgICogaW50ZXJmYWNlIG1ldGhvZHMgT1IgdGhlIExpc3QgaW50ZXJmYWNlLiBJZiBhIG1peHR1cmUgb2YgbW9kaWZpY2F0aW9uCi0gICAgICogbWV0aG9kcyBpcyB1c2VkIGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB0aGUgaXRlcmF0b3IKLSAgICAgKiBtb2RpZmljYXRpb24gbWV0aG9kLiBJZiB0aGUgTGlzdCBtb2RpZmljYXRpb24gbWV0aG9kcyBhcmUgdXNlZCB0aGUgY2hhbmdlcyBhcmUKLSAgICAgKiBOT1QgdmlzaWJsZSBpbiB0aGUgaXRlcmF0b3IgKGl0IHNob3dzIHRoZSBsaXN0IGNvbnRlbnRzIGF0IHRoZSB0aW1lIHRoZSBpdGVyYXRvcgotICAgICAqIHdhcyBjcmVhdGVkKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIGdpdmVuIGFyZ3VtZW50LCB0ZXN0aW5nCi0gICAgICogZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kLCBhbmQgcmV0dXJuCi0gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXgsIG9yIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChsaXN0Lmxhc3RJbmRleE9mKGVsZW1lbnQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC5sYXN0SW5kZXhPZihlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QsIGluIHByb3BlciBzZXF1ZW5jZS4KLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5UaHJlYWQgc2FmZXR5PC9iPjxiciAvPgotICAgICAqIFRoZSBpdGVyYXRvciByZXR1cm5lZCBpcyB0aHJlYWQtc2FmZSBPTkxZIGluIEZBU1QgbW9kZS4KLSAgICAgKiBJbiBzbG93IG1vZGUgdGhlcmUgaXMgbm8gd2F5IHRvIHN5bmNocm9uaXplLCBvciBtYWtlIHRoZSBpdGVyYXRvciB0aHJlYWQtc2FmZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBmYXN0IG1vZGUgaXRlcmF0aW9uIGFuZCBtb2RpZmljYXRpb24gbWF5IG9jY3VyIGluIHBhcmFsbGVsIG9uIGRpZmZlcmVudCB0aHJlYWRzLAotICAgICAqIGhvd2V2ZXIgdGhlcmUgaXMgYSByZXN0cmljdGlvbi4gTW9kaWZpY2F0aW9uIG11c3QgYmUgRUlUSEVSIHZpYSB0aGUgSXRlcmF0b3IKLSAgICAgKiBpbnRlcmZhY2UgbWV0aG9kcyBPUiB0aGUgTGlzdCBpbnRlcmZhY2UuIElmIGEgbWl4dHVyZSBvZiBtb2RpZmljYXRpb24KLSAgICAgKiBtZXRob2RzIGlzIHVzZWQgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlzIHRocm93biBmcm9tIHRoZSBpdGVyYXRvcgotICAgICAqIG1vZGlmaWNhdGlvbiBtZXRob2QuIElmIHRoZSBMaXN0IG1vZGlmaWNhdGlvbiBtZXRob2RzIGFyZSB1c2VkIHRoZSBjaGFuZ2VzIGFyZQotICAgICAqIE5PVCB2aXNpYmxlIGluIHRoZSBpdGVyYXRvciAoaXQgc2hvd3MgdGhlIGxpc3QgY29udGVudHMgYXQgdGhlIHRpbWUgdGhlIGl0ZXJhdG9yCi0gICAgICogd2FzIGNyZWF0ZWQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3QgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QsIGluIHByb3BlciBzZXF1ZW5jZSwKLSAgICAgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIDxiPlRocmVhZCBzYWZldHk8L2I+PGJyIC8+Ci0gICAgICogVGhlIGl0ZXJhdG9yIHJldHVybmVkIGlzIHRocmVhZC1zYWZlIE9OTFkgaW4gRkFTVCBtb2RlLgotICAgICAqIEluIHNsb3cgbW9kZSB0aGVyZSBpcyBubyB3YXkgdG8gc3luY2hyb25pemUsIG9yIG1ha2UgdGhlIGl0ZXJhdG9yIHRocmVhZC1zYWZlLgotICAgICAqIDxwPgotICAgICAqIEluIGZhc3QgbW9kZSBpdGVyYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBtYXkgb2NjdXIgaW4gcGFyYWxsZWwgb24gZGlmZmVyZW50IHRocmVhZHMsCi0gICAgICogaG93ZXZlciB0aGVyZSBpcyBhIHJlc3RyaWN0aW9uLiBNb2RpZmljYXRpb24gbXVzdCBiZSBFSVRIRVIgdmlhIHRoZSBJdGVyYXRvcgotICAgICAqIGludGVyZmFjZSBtZXRob2RzIE9SIHRoZSBMaXN0IGludGVyZmFjZS4gSWYgYSBtaXh0dXJlIG9mIG1vZGlmaWNhdGlvbgotICAgICAqIG1ldGhvZHMgaXMgdXNlZCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaXMgdGhyb3duIGZyb20gdGhlIGl0ZXJhdG9yCi0gICAgICogbW9kaWZpY2F0aW9uIG1ldGhvZC4gSWYgdGhlIExpc3QgbW9kaWZpY2F0aW9uIG1ldGhvZHMgYXJlIHVzZWQgdGhlIGNoYW5nZXMgYXJlCi0gICAgICogTk9UIHZpc2libGUgaW4gdGhlIGl0ZXJhdG9yIChpdCBzaG93cyB0aGUgbGlzdCBjb250ZW50cyBhdCB0aGUgdGltZSB0aGUgaXRlcmF0b3IKLSAgICAgKiB3YXMgY3JlYXRlZCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBpdGVyYXRvciB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IGl0ZXJhdG9yCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdEl0ZXIoaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGxpc3QsIGFuZCBzaGlmdAotICAgICAqIGFueSBzdWJzZXF1ZW50IGVsZW1lbnRzIGRvd24gb25lIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0KLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSB0ZW1wLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LnJlbW92ZShpbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCwKLSAgICAgKiBhbmQgc2hpZnQgYW55IHN1YnNlcXVlbnQgZWxlbWVudHMgZG93biBvbmUgcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0ZW1wLnJlbW92ZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3QucmVtb3ZlKGVsZW1lbnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgZnJvbSB0aGlzIGNvbGxlY3Rpb24gYWxsIG9mIGl0cyBlbGVtZW50cyB0aGF0IGFyZSBjb250YWluZWQKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgZWxlbWVudHMgdG8gYmUgcmVtb3ZlZAotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wdGlvbmFsIG9wZXJhdGlvbgotICAgICAqICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0ZW1wLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3QucmVtb3ZlQWxsKGNvbGxlY3Rpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgZnJvbSB0aGlzIGNvbGxlY3Rpb24gYWxsIG9mIGl0cyBlbGVtZW50cyBleGNlcHQgdGhvc2UgdGhhdCBhcmUKLSAgICAgKiBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gQ29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIHJldGFpbmVkCi0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3B0aW9uYWwgb3BlcmF0aW9uCi0gICAgICogIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRlbXAucmV0YWluQWxsKGNvbGxlY3Rpb24pOwotICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC5yZXRhaW5BbGwoY29sbGVjdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2UgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3Qgd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gIFJldHVybnMgdGhlIHByZXZpb3VzIG9iamVjdCBhdCB0aGF0IHBvc2l0aW9uLgotICAgICAqIDxicj48YnI+Ci0gICAgICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gVGhpcyBvcGVyYXRpb24gaXMgc3BlY2lmaWNhbGx5Ci0gICAgICogZG9jdW1lbnRlZCB0byBub3QgYmUgYSBzdHJ1Y3R1cmFsIGNoYW5nZSwgc28gaXQgaXMgc2FmZSB0byBiZSBwZXJmb3JtZWQKLSAgICAgKiB3aXRob3V0IGNsb25pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVwbGFjZQotICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBuZXcgZWxlbWVudCB0byBiZSBzdG9yZWQKLSAgICAgKgotICAgICAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxpc3Quc2V0KGluZGV4LCBlbGVtZW50KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3Quc2V0KGluZGV4LCBlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChsaXN0LnNpemUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2aWV3IG9mIHRoZSBwb3J0aW9uIG9mIHRoaXMgbGlzdCBiZXR3ZWVuIGZyb21JbmRleAotICAgICAqIChpbmNsdXNpdmUpIGFuZCB0b0luZGV4IChleGNsdXNpdmUpLiAgVGhlIHJldHVybmVkIGxpc3QgaXMgYmFja2VkCi0gICAgICogYnkgdGhpcyBsaXN0LCBzbyBub24tc3RydWN0dXJhbCBjaGFuZ2VzIGluIHRoZSByZXR1cm5lZCBsaXN0IGFyZQotICAgICAqIHJlZmxlY3RlZCBpbiB0aGlzIGxpc3QuICBUaGUgcmV0dXJuZWQgbGlzdCBzdXBwb3J0cwotICAgICAqIGFsbCBvZiB0aGUgb3B0aW9uYWwgbGlzdCBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc3VibGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIHRvSW5kZXggVGhlIGluZGV4IGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN1Ymxpc3QgdmlldwotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGFuIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiB0aGUKLSAgICAgKiBjb3JyZWN0IG9yZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHRoZQotICAgICAqIGNvcnJlY3Qgb3JkZXIuICBUaGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mCi0gICAgICogdGhlIHNwZWNpZmllZCBhcnJheS4gIElmIHRoZSBsaXN0IGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMKLSAgICAgKiByZXR1cm5lZCB0aGVyZWluLiAgT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUKLSAgICAgKiBydW50aW1lIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBhcnJheSwgYW5kIHRoZSBzaXplIG9mIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSBBcnJheSBkZWZpbmluZyB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXR1cm5lZCBsaXN0Ci0gICAgICoKLSAgICAgKiBAZXhjZXB0aW9uIEFycmF5U3RvcmVFeGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiA8Y29kZT5hcnJheTwvY29kZT4KLSAgICAgKiAgaXMgbm90IGEgc3VwZXJ0eXBlIG9mIHRoZSBydW50aW1lIHR5cGUgb2YgZXZlcnkgZWxlbWVudCBpbiB0aGlzIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3QgYXJyYXlbXSkgewotCi0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGxpc3QudG9BcnJheShhcnJheSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LnRvQXJyYXkoYXJyYXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJGYXN0QXJyYXlMaXN0WyIpOwotICAgICAgICBzYi5hcHBlbmQobGlzdC50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKCJdIik7Ci0gICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRyaW0gdGhlIGNhcGFjaXR5IG9mIHRoaXMgPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBpbnN0YW5jZSB0byBiZSB0aGUKLSAgICAgKiBsaXN0J3MgY3VycmVudCBzaXplLiAgQW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIG9wZXJhdGlvbiB0byBtaW5pbWl6ZQotICAgICAqIHRoZSBzdG9yYWdlIG9mIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJpbVRvU2l6ZSgpIHsKLQotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgdGVtcC50cmltVG9TaXplKCk7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0LnRyaW1Ub1NpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLQotICAgIHByaXZhdGUgY2xhc3MgU3ViTGlzdCBpbXBsZW1lbnRzIExpc3QgewotCi0gICAgICAgIHByaXZhdGUgaW50IGZpcnN0OwotICAgICAgICBwcml2YXRlIGludCBsYXN0OwotICAgICAgICBwcml2YXRlIExpc3QgZXhwZWN0ZWQ7Ci0KLQotICAgICAgICBwdWJsaWMgU3ViTGlzdChpbnQgZmlyc3QsIGludCBsYXN0KSB7Ci0gICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgdGhpcy5leHBlY3RlZCA9IGxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIExpc3QgZ2V0KExpc3QgbCkgewotICAgICAgICAgICAgaWYgKGxpc3QgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGwuc3ViTGlzdChmaXJzdCwgbGFzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0QXJyYXlMaXN0LnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldCh0ZW1wKS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBsYXN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0KGV4cGVjdGVkKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RBcnJheUxpc3QudGhpcykgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByID0gZ2V0KHRlbXApLnJlbW92ZShvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIpIGxhc3QtLTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkucmVtb3ZlKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0QXJyYXlMaXN0LnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc3ViID0gZ2V0KHRlbXApOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBzdWIucmVtb3ZlQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBpZiAocikgbGFzdCA9IGZpcnN0ICsgc3ViLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkucmVtb3ZlQWxsKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0QXJyYXlMaXN0LnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc3ViID0gZ2V0KHRlbXApOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBzdWIucmV0YWluQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBpZiAocikgbGFzdCA9IGZpcnN0ICsgc3ViLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkucmV0YWluQWxsKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuc2l6ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmNvbnRhaW5zKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuY29udGFpbnMobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBvKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmNvbnRhaW5zQWxsKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuY29udGFpbnNBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGV4cGVjdGVkKS50b0FycmF5KG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkudG9BcnJheShvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkudG9BcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAobyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGV4cGVjdGVkKS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RBcnJheUxpc3QudGhpcykgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByID0gZ2V0KHRlbXApLmFkZChvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIpIGxhc3QrKzsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuYWRkKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0QXJyYXlMaXN0LnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRlbXAgPSAoQXJyYXlMaXN0KSBsaXN0LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gciA9IGdldCh0ZW1wKS5hZGRBbGwobyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyKSBsYXN0ICs9IG8uc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGV4cGVjdGVkKS5hZGRBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKGludCBpLCBPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RBcnJheUxpc3QudGhpcykgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0KHRlbXApLmFkZChpLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdCsrOwotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldChleHBlY3RlZCkuYWRkKGksIG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaSwgQ29sbGVjdGlvbiBvKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRmFzdEFycmF5TGlzdC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkuYWRkQWxsKGksIG8pOwotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIpIGxhc3QgKz0gby5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuYWRkQWxsKGksIG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRmFzdEFycmF5TGlzdC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0ZW1wID0gKEFycmF5TGlzdCkgbGlzdC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGdldCh0ZW1wKS5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3QtLTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpLCBPYmplY3QgYSkgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RBcnJheUxpc3QudGhpcykgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdGVtcCA9IChBcnJheUxpc3QpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXQodGVtcCkuc2V0KGksIGEpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobGlzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGV4cGVjdGVkKS5zZXQoaSwgYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXIoaSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmdldChpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmdldChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkuaW5kZXhPZihvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmluZGV4T2Yobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQoZXhwZWN0ZWQpLmxhc3RJbmRleE9mKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChleHBlY3RlZCkubGFzdEluZGV4T2Yobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmLCBpbnQgbCkgewotICAgICAgICAgICAgaWYgKGxpc3QgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJMaXN0KGZpcnN0ICsgZiwgZiArIGwpOwotICAgICAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgU3ViTGlzdEl0ZXIgaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IgewotCi0gICAgICAgIHByaXZhdGUgTGlzdCBleHBlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3IgaXRlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLQotCi0gICAgICAgIHB1YmxpYyBTdWJMaXN0SXRlcihpbnQgaSkgewotICAgICAgICAgICAgdGhpcy5leHBlY3RlZCA9IGxpc3Q7Ci0gICAgICAgICAgICB0aGlzLml0ZXIgPSBTdWJMaXN0LnRoaXMuZ2V0KGV4cGVjdGVkKS5saXN0SXRlcmF0b3IoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2QoKSB7Ci0gICAgICAgICAgICBpZiAobGlzdCAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBTdWJMaXN0LnRoaXMuZ2V0KGV4cGVjdGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOyAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSBpdGVyLm5leHRJbmRleCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzUHJldmlvdXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSBpdGVyLnByZXZpb3VzSW5kZXgoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXIucHJldmlvdXNJbmRleCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dEluZGV4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldCgpLnJlbW92ZShsYXN0UmV0dXJuZWRJbmRleCk7Ci0gICAgICAgICAgICBsYXN0LS07Ci0gICAgICAgICAgICBleHBlY3RlZCA9IGxpc3Q7Ci0gICAgICAgICAgICBpdGVyID0gZ2V0KCkubGlzdEl0ZXJhdG9yKGxhc3RSZXR1cm5lZEluZGV4KTsKLSAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGNoZWNrTW9kKCk7Ci0gICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0KCkuc2V0KGxhc3RSZXR1cm5lZEluZGV4LCBvKTsKLSAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdDsKLSAgICAgICAgICAgIGl0ZXIgPSBnZXQoKS5saXN0SXRlcmF0b3IocHJldmlvdXNJbmRleCgpICsgMSk7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgaW50IGkgPSBuZXh0SW5kZXgoKTsKLSAgICAgICAgICAgIGdldCgpLmFkZChpLCBvKTsKLSAgICAgICAgICAgIGxhc3QrKzsKLSAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdDsKLSAgICAgICAgICAgIGl0ZXIgPSBnZXQoKS5saXN0SXRlcmF0b3IoaSArIDEpOwotICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLSAgICAgICAgfQotCi0gICB9Ci0KLQotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIGNsYXNzIExpc3RJdGVyIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKLQotICAgICAgICBwcml2YXRlIExpc3QgZXhwZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgTGlzdEl0ZXJhdG9yIGl0ZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0KLQotICAgICAgICBwdWJsaWMgTGlzdEl0ZXIoaW50IGkpIHsKLSAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBsaXN0OwotICAgICAgICAgICAgdGhpcy5pdGVyID0gZ2V0KCkubGlzdEl0ZXJhdG9yKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kKCkgewotICAgICAgICAgICAgaWYgKGxpc3QgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOyAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IGl0ZXIubmV4dEluZGV4KCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyLmhhc1ByZXZpb3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSBpdGVyLnByZXZpb3VzSW5kZXgoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlci5wcmV2aW91c0luZGV4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHRJbmRleCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXQoKS5yZW1vdmUobGFzdFJldHVybmVkSW5kZXgpOwotICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0OwotICAgICAgICAgICAgaXRlciA9IGdldCgpLmxpc3RJdGVyYXRvcihsYXN0UmV0dXJuZWRJbmRleCk7Ci0gICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldCgpLnNldChsYXN0UmV0dXJuZWRJbmRleCwgbyk7Ci0gICAgICAgICAgICBleHBlY3RlZCA9IGxpc3Q7Ci0gICAgICAgICAgICBpdGVyID0gZ2V0KCkubGlzdEl0ZXJhdG9yKHByZXZpb3VzSW5kZXgoKSArIDEpOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIGludCBpID0gbmV4dEluZGV4KCk7Ci0gICAgICAgICAgICBnZXQoKS5hZGQoaSwgbyk7Ci0gICAgICAgICAgICBleHBlY3RlZCA9IGxpc3Q7Ci0gICAgICAgICAgICBpdGVyID0gZ2V0KCkubGlzdEl0ZXJhdG9yKGkgKyAxKTsKLSAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgIH0KLQotICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RIYXNoTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjY3MTY5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRmFzdEhhc2hNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxNCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD5BIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+amF2YS51dGlsLkhhc2hNYXA8L2NvZGU+IGRlc2lnbmVkCi0gKiB0byBvcGVyYXRlIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB3aGVyZSB0aGUgbGFyZ2UgbWFqb3JpdHkgb2YKLSAqIG1ldGhvZCBjYWxscyBhcmUgcmVhZC1vbmx5LCBpbnN0ZWFkIG9mIHN0cnVjdHVyYWwgY2hhbmdlcy4gIFdoZW4gb3BlcmF0aW5nCi0gKiBpbiAiZmFzdCIgbW9kZSwgcmVhZCBjYWxscyBhcmUgbm9uLXN5bmNocm9uaXplZCBhbmQgd3JpdGUgY2FsbHMgcGVyZm9ybSB0aGUKLSAqIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+Q2xvbmUgdGhlIGV4aXN0aW5nIGNvbGxlY3Rpb24KLSAqIDxsaT5QZXJmb3JtIHRoZSBtb2RpZmljYXRpb24gb24gdGhlIGNsb25lCi0gKiA8bGk+UmVwbGFjZSB0aGUgZXhpc3RpbmcgY29sbGVjdGlvbiB3aXRoIHRoZSAobW9kaWZpZWQpIGNsb25lCi0gKiA8L3VsPgotICogPHA+V2hlbiBmaXJzdCBjcmVhdGVkLCBvYmplY3RzIG9mIHRoaXMgY2xhc3MgZGVmYXVsdCB0byAic2xvdyIgbW9kZSwgd2hlcmUKLSAqIGFsbCBhY2Nlc3NlcyBvZiBhbnkgdHlwZSBhcmUgc3luY2hyb25pemVkIGJ1dCBubyBjbG9uaW5nIHRha2VzIHBsYWNlLiAgVGhpcwotICogaXMgYXBwcm9wcmlhdGUgZm9yIGluaXRpYWxseSBwb3B1bGF0aW5nIHRoZSBjb2xsZWN0aW9uLCBmb2xsb3dlZCBieSBhIHN3aXRjaAotICogdG8gImZhc3QiIG1vZGUgKGJ5IGNhbGxpbmcgPGNvZGU+c2V0RmFzdCh0cnVlKTwvY29kZT4pIGFmdGVyIGluaXRpYWxpemF0aW9uCi0gKiBpcyBjb21wbGV0ZS48L3A+Ci0gKgotICogPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiBJZiB5b3UgYXJlIGNyZWF0aW5nIGFuZCBhY2Nlc3NpbmcgYQotICogPGNvZGU+SGFzaE1hcDwvY29kZT4gb25seSB3aXRoaW4gYSBzaW5nbGUgdGhyZWFkLCB5b3Ugc2hvdWxkIHVzZQotICogPGNvZGU+amF2YS51dGlsLkhhc2hNYXA8L2NvZGU+IGRpcmVjdGx5ICh3aXRoIG5vIHN5bmNocm9uaXphdGlvbiksIGZvcgotICogbWF4aW11bSBwZXJmb3JtYW5jZS48L3A+Ci0gKgotICogPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiA8aT5UaGlzIGNsYXNzIGlzIG5vdCBjcm9zcy1wbGF0Zm9ybS4gIAotICogVXNpbmcgaXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgZmFpbHVyZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzLjwvaT4KLSAqIEl0IHN1ZmZlcnMgZnJvbSB0aGUgc2FtZSBwcm9ibGVtcyBhcyB0aGUgZG91YmxlLWNoZWNrZWQgbG9ja2luZyBpZGlvbS4gIAotICogSW4gcGFydGljdWxhciwgdGhlIGluc3RydWN0aW9uIHRoYXQgY2xvbmVzIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uIGFuZCB0aGUgCi0gKiBpbnN0cnVjdGlvbiB0aGF0IHNldHMgdGhlIGludGVybmFsIHJlZmVyZW5jZSB0byB0aGUgY2xvbmUgY2FuIGJlIGV4ZWN1dGVkIAotICogb3IgcGVyY2VpdmVkIG91dC1vZi1vcmRlci4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgcmVhZCBvcGVyYXRpb24gbWlnaHQgZmFpbCAKLSAqIHVuZXhwZWN0ZWRseSwgYXMgaXQgbWF5IGJlIHJlYWRpbmcgdGhlIHN0YXRlIG9mIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uCi0gKiBiZWZvcmUgdGhlIGludGVybmFsIGNvbGxlY3Rpb24gaXMgZnVsbHkgZm9ybWVkLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRvdWJsZS1jaGVja2VkIGxvY2tpbmcgaWRpb20sIHNlZSB0aGUKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudW1kLmVkdS9+cHVnaC9qYXZhL21lbW9yeU1vZGVsL0RvdWJsZUNoZWNrZWRMb2NraW5nLmh0bWwiPgotICogRG91YmxlLUNoZWNrZWQgTG9ja2luZyBJZGlvbSBJcyBCcm9rZW4gRGVjbGFyYXRpb248L2E+LjwvcD4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXN0SGFzaE1hcCBleHRlbmRzIEhhc2hNYXAgewotCi0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcgbWFwIHdlIGFyZSBtYW5hZ2luZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQXJlIHdlIGN1cnJlbnRseSBvcGVyYXRpbmcgaW4gImZhc3QiIG1vZGU/Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFzdCA9IGZhbHNlOwotCi0gICAgLy8gQ29uc3RydWN0b3JzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIGVtcHR5IG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmFzdEhhc2hNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGVtcHR5IG1hcAotICAgICAqLwotICAgIHB1YmxpYyBGYXN0SGFzaE1hcChpbnQgY2FwYWNpdHkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBuZXcgSGFzaE1hcChjYXBhY2l0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIGVtcHR5IG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgZW1wdHkgbWFwCi0gICAgICogQHBhcmFtIGZhY3RvciAgdGhlIGxvYWQgZmFjdG9yIG9mIHRoZSBuZXcgbWFwCi0gICAgICovCi0gICAgcHVibGljIEZhc3RIYXNoTWFwKGludCBjYXBhY2l0eSwgZmxvYXQgZmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbmV3IEhhc2hNYXAoY2FwYWNpdHksIGZhY3Rvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IG1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZSBzcGVjaWZpZWQgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgY29waWVkCi0gICAgICovCi0gICAgcHVibGljIEZhc3RIYXNoTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBuZXcgSGFzaE1hcChtYXApOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBvcGVyYXRpbmcgaW4gZmFzdCBtb2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyBvcGVyYXRpbmcgaW4gZmFzdCBtb2RlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RmFzdCgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmZhc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHdoZXRoZXIgdGhpcyBtYXAgaXMgb3BlcmF0aW5nIGluIGZhc3QgbW9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gZmFzdCB0cnVlIGlmIHRoaXMgbWFwIHNob3VsZCBvcGVyYXRlIGluIGZhc3QgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhc3QoYm9vbGVhbiBmYXN0KSB7Ci0gICAgICAgIHRoaXMuZmFzdCA9IGZhc3Q7Ci0gICAgfQotCi0KLSAgICAvLyBNYXAgYWNjZXNzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIGZvcndhcmQgc3RyYWlnaHQgdG8gdGhlIHdyYXBwZWQgTWFwIGluICdmYXN0JyBtb2RlLgotICAgIC8vIChiZWNhdXNlIHRoZXkgYXJlIHF1ZXJ5IG1ldGhvZHMpCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuICBSZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleSwgb3IgaWYKLSAgICAgKiB0aGVyZSBpcyBhIG1hcHBpbmcgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+LiAgVXNlIHRoZQotICAgICAqIDxjb2RlPmNvbnRhaW5zS2V5KCk8L2NvZGU+IG1ldGhvZCB0byBkaXNhbWJpZ3VhdGUgdGhlc2UgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHdob3NlIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoYXQga2V5LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChtYXAuZ2V0KGtleSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBtYXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5zaXplKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmdzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gaXMgdGhlIG1hcCBjdXJyZW50bHkgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChtYXAuaXNFbXB0eSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5jb250YWluc0tleShrZXkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAuY29udGFpbnNLZXkoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtYXAgY29udGFpbnMgb25lIG9yIG1vcmUga2V5cyBtYXBwaW5nCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGJlIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5jb250YWluc1ZhbHVlKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1hcCBtb2RpZmljYXRpb24KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVGhlc2UgbWV0aG9kcyBwZXJmb3JtIHNwZWNpYWwgYmVoYXZpb3VyIGluICdmYXN0JyBtb2RlLgotICAgIC8vIFRoZSBtYXAgaXMgY2xvbmVkLCB1cGRhdGVkIGFuZCB0aGVuIGFzc2lnbmVkIGJhY2suCi0gICAgLy8gU2VlIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIGFzIHRvIHdoeSB0aGlzIHdvbid0IGFsd2F5cyB3b3JrLgotCi0gICAgLyoqCi0gICAgICogQXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcC4KLSAgICAgKiBJZiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQKLSAgICAgKiB2YWx1ZSBpcyByZXBsYWNlZCBhbmQgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHdpdGggd2hpY2ggdGhlIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBwcmV2aW91c2x5IG1hcHBlZCB0byB0aGUga2V5LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIHRlbXAgPSAoSGFzaE1hcCkgbWFwLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHRlbXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIG1hcCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5wdXQoa2V5LCB2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSBhbGwgb2YgdGhlIG1hcHBpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAgdG8gdGhpcyBvbmUsIHJlcGxhY2luZwotICAgICAqIGFueSBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGtleXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBtYXAgd2hvc2UgbWFwcGluZ3MgYXJlIHRvIGJlIGNvcGllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgaW4pIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIEhhc2hNYXAgdGVtcCA9IChIYXNoTWFwKSBtYXAuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICB0ZW1wLnB1dEFsbChpbik7Ci0gICAgICAgICAgICAgICAgbWFwID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dEFsbChpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYW55IG1hcHBpbmcgZm9yIHRoaXMga2V5LCBhbmQgcmV0dXJuIGFueSBwcmV2aW91c2x5Ci0gICAgICogbWFwcGVkIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZW1vdmVkLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCB0ZW1wID0gKEhhc2hNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSB0ZW1wLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIG1hcCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5yZW1vdmUoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICBtYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEJhc2ljIG9iamVjdCBtZXRob2RzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGxpc3QgZm9yIGVxdWFsaXR5LiAgVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHVzZXMgZXhhY3RseSB0aGUgY29kZSB0aGF0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZQotICAgICAqIGxpc3QgZXF1YWxzIGZ1bmN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKLSAgICAgKiA8Y29kZT5NYXAuZXF1YWxzPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCB0byB0aGlzIGxpc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBtYXBzIGFyZSBlcXVhbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAvLyBTaW1wbGUgdGVzdHMgdGhhdCByZXF1aXJlIG5vIHN5bmNocm9uaXphdGlvbgotICAgICAgICBpZiAobyA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKCEobyBpbnN0YW5jZW9mIE1hcCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIE1hcCBtbyA9IChNYXApIG87Ci0KLSAgICAgICAgLy8gQ29tcGFyZSB0aGUgdHdvIG1hcHMgZm9yIGVxdWFsaXR5Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBpZiAobW8uc2l6ZSgpICE9IG1hcC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEobW8uZ2V0KGtleSkgPT0gbnVsbCAmJiBtby5jb250YWluc0tleShrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhtby5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICBpZiAobW8uc2l6ZSgpICE9IG1hcC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobW8uZ2V0KGtleSkgPT0gbnVsbCAmJiBtby5jb250YWluc0tleShrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMobW8uZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1hcC4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAqIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbGlzdCBoYXNoIGZ1bmN0aW9uIGluIHRoZQotICAgICAqIGRvY3VtZW50YXRpb24gZm9yIHRoZSA8Y29kZT5NYXAuaGFzaENvZGU8L2NvZGU+IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHN1aXRhYmxlIGludGVnZXIgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIGludCBoID0gMDsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaCArPSBpLm5leHQoKS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGggPSAwOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBoICs9IGkubmV4dCgpLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyA8Y29kZT5GYXN0SGFzaE1hcDwvY29kZT4gaW5zdGFuY2UuCi0gICAgICogVGhlIGtleXMgYW5kIHZhbHVlcyB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIEZhc3RIYXNoTWFwIHJlc3VsdHMgPSBudWxsOwotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBGYXN0SGFzaE1hcChtYXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEZhc3RIYXNoTWFwKG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0cy5zZXRGYXN0KGdldEZhc3QoKSk7Ci0gICAgICAgIHJldHVybiAocmVzdWx0cyk7Ci0gICAgfQotCi0gICAgLy8gTWFwIHZpZXdzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgRWFjaAotICAgICAqIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgYSA8Y29kZT5NYXAuRW50cnk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5U2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvLyBNYXAgdmlldyBpbm5lciBjbGFzc2VzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQWJzdHJhY3QgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkga2V5U2V0KCksIHZhbHVlcygpIGFuZCBlbnRyeVNldCgpLgotICAgICAqLwotICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZpZXcgaW1wbGVtZW50cyBDb2xsZWN0aW9uIHsKLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvblZpZXcoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbiBnZXQoTWFwIG1hcCk7Ci0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgaXRlcmF0b3JOZXh0KE1hcC5FbnRyeSBlbnRyeSk7Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0SGFzaE1hcC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICBnZXQobWFwKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RIYXNoTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCB0ZW1wID0gKEhhc2hNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmVtb3ZlKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZW1vdmUobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RIYXNoTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCB0ZW1wID0gKEhhc2hNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmVtb3ZlQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZW1vdmVBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RIYXNoTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCB0ZW1wID0gKEhhc2hNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmV0YWluQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZXRhaW5BbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuc2l6ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmlzRW1wdHkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuY29udGFpbnMobyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5jb250YWlucyhvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmNvbnRhaW5zQWxsKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuY29udGFpbnNBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkudG9BcnJheShvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLnRvQXJyYXkobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25WaWV3SXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQ29sbGVjdGlvblZpZXdJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBNYXAgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBwcml2YXRlIE1hcC5FbnRyeSBsYXN0UmV0dXJuZWQgPSBudWxsOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgICAgICAgICAgcHVibGljIENvbGxlY3Rpb25WaWV3SXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RlZCA9IG1hcDsKLSAgICAgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gZXhwZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gbWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gbWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IChNYXAuRW50cnkpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvck5leHQobGFzdFJldHVybmVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRmFzdEhhc2hNYXAudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IG1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXN0SGFzaE1hcC50aGlzLnJlbW92ZShsYXN0UmV0dXJuZWQuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJldHVybmVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbWFwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGltcGxlbWVudGF0aW9uIG92ZXIgdGhlIGtleXMgb2YgdGhlIEZhc3RIYXNoTWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBLZXlTZXQgZXh0ZW5kcyBDb2xsZWN0aW9uVmlldyBpbXBsZW1lbnRzIFNldCB7Ci0gICAgCi0gICAgICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldChNYXAgbWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgaXRlcmF0b3JOZXh0KE1hcC5FbnRyeSBlbnRyeSkgewotICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpOwotICAgICAgICB9Ci0gICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBGYXN0SGFzaE1hcAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQ29sbGVjdGlvblZpZXcgewotICAgIAotICAgICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXQoTWFwIG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIG1hcC52YWx1ZXMoKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGl0ZXJhdG9yTmV4dChNYXAuRW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCBpbXBsZW1lbnRhdGlvbiBvdmVyIHRoZSBlbnRyaWVzIG9mIHRoZSBGYXN0SGFzaE1hcAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBDb2xsZWN0aW9uVmlldyBpbXBsZW1lbnRzIFNldCB7Ci0gICAgCi0gICAgICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldChNYXAgbWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpdGVyYXRvck5leHQoTWFwLkVudHJ5IGVudHJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgIH0KLSAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9GYXN0VHJlZU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0YjU5YTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Zhc3RUcmVlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiA8cD5BIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+amF2YS51dGlsLlRyZWVNYXA8L2NvZGU+IGRlc2lnbmVkCi0gKiB0byBvcGVyYXRlIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB3aGVyZSB0aGUgbGFyZ2UgbWFqb3JpdHkgb2YKLSAqIG1ldGhvZCBjYWxscyBhcmUgcmVhZC1vbmx5LCBpbnN0ZWFkIG9mIHN0cnVjdHVyYWwgY2hhbmdlcy4gIFdoZW4gb3BlcmF0aW5nCi0gKiBpbiAiZmFzdCIgbW9kZSwgcmVhZCBjYWxscyBhcmUgbm9uLXN5bmNocm9uaXplZCBhbmQgd3JpdGUgY2FsbHMgcGVyZm9ybSB0aGUKLSAqIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+Q2xvbmUgdGhlIGV4aXN0aW5nIGNvbGxlY3Rpb24KLSAqIDxsaT5QZXJmb3JtIHRoZSBtb2RpZmljYXRpb24gb24gdGhlIGNsb25lCi0gKiA8bGk+UmVwbGFjZSB0aGUgZXhpc3RpbmcgY29sbGVjdGlvbiB3aXRoIHRoZSAobW9kaWZpZWQpIGNsb25lCi0gKiA8L3VsPgotICogPHA+V2hlbiBmaXJzdCBjcmVhdGVkLCBvYmplY3RzIG9mIHRoaXMgY2xhc3MgZGVmYXVsdCB0byAic2xvdyIgbW9kZSwgd2hlcmUKLSAqIGFsbCBhY2Nlc3NlcyBvZiBhbnkgdHlwZSBhcmUgc3luY2hyb25pemVkIGJ1dCBubyBjbG9uaW5nIHRha2VzIHBsYWNlLiAgVGhpcwotICogaXMgYXBwcm9wcmlhdGUgZm9yIGluaXRpYWxseSBwb3B1bGF0aW5nIHRoZSBjb2xsZWN0aW9uLCBmb2xsb3dlZCBieSBhIHN3aXRjaAotICogdG8gImZhc3QiIG1vZGUgKGJ5IGNhbGxpbmcgPGNvZGU+c2V0RmFzdCh0cnVlKTwvY29kZT4pIGFmdGVyIGluaXRpYWxpemF0aW9uCi0gKiBpcyBjb21wbGV0ZS48L3A+Ci0gKgotICogPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiBJZiB5b3UgYXJlIGNyZWF0aW5nIGFuZCBhY2Nlc3NpbmcgYQotICogPGNvZGU+VHJlZU1hcDwvY29kZT4gb25seSB3aXRoaW4gYSBzaW5nbGUgdGhyZWFkLCB5b3Ugc2hvdWxkIHVzZQotICogPGNvZGU+amF2YS51dGlsLlRyZWVNYXA8L2NvZGU+IGRpcmVjdGx5ICh3aXRoIG5vIHN5bmNocm9uaXphdGlvbiksIGZvcgotICogbWF4aW11bSBwZXJmb3JtYW5jZS48L3A+Ci0gKgotICogPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiA8aT5UaGlzIGNsYXNzIGlzIG5vdCBjcm9zcy1wbGF0Zm9ybS4gIAotICogVXNpbmcgaXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgZmFpbHVyZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzLjwvaT4KLSAqIEl0IHN1ZmZlcnMgZnJvbSB0aGUgc2FtZSBwcm9ibGVtcyBhcyB0aGUgZG91YmxlLWNoZWNrZWQgbG9ja2luZyBpZGlvbS4gIAotICogSW4gcGFydGljdWxhciwgdGhlIGluc3RydWN0aW9uIHRoYXQgY2xvbmVzIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uIGFuZCB0aGUgCi0gKiBpbnN0cnVjdGlvbiB0aGF0IHNldHMgdGhlIGludGVybmFsIHJlZmVyZW5jZSB0byB0aGUgY2xvbmUgY2FuIGJlIGV4ZWN1dGVkIAotICogb3IgcGVyY2VpdmVkIG91dC1vZi1vcmRlci4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgcmVhZCBvcGVyYXRpb24gbWlnaHQgZmFpbCAKLSAqIHVuZXhwZWN0ZWRseSwgYXMgaXQgbWF5IGJlIHJlYWRpbmcgdGhlIHN0YXRlIG9mIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uCi0gKiBiZWZvcmUgdGhlIGludGVybmFsIGNvbGxlY3Rpb24gaXMgZnVsbHkgZm9ybWVkLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRvdWJsZS1jaGVja2VkIGxvY2tpbmcgaWRpb20sIHNlZSB0aGUKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudW1kLmVkdS9+cHVnaC9qYXZhL21lbW9yeU1vZGVsL0RvdWJsZUNoZWNrZWRMb2NraW5nLmh0bWwiPgotICogRG91YmxlLUNoZWNrZWQgTG9ja2luZyBJZGlvbSBJcyBCcm9rZW4gRGVjbGFyYXRpb248L2E+LjwvcD4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXN0VHJlZU1hcCBleHRlbmRzIFRyZWVNYXAgewotCi0gICAgLyoqCi0gICAgICogVGhlIHVuZGVybHlpbmcgbWFwIHdlIGFyZSBtYW5hZ2luZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZU1hcCBtYXAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQXJlIHdlIG9wZXJhdGluZyBpbiAiZmFzdCIgbW9kZT8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYXN0ID0gZmFsc2U7Ci0KLQotICAgIC8vIENvbnN0cnVjdG9ycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGFuIGVtcHR5IG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmFzdFRyZWVNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbmV3IFRyZWVNYXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBjb21wYXJhdG9yIHRvIHVzZSBmb3Igb3JkZXJpbmcgdHJlZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBGYXN0VHJlZU1hcChDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBuZXcgVHJlZU1hcChjb21wYXJhdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWFwIHdpdGggdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhlIHNwZWNpZmllZCBtYXAsCi0gICAgICogc29ydGVkIGFjY29yZGluZyB0byB0aGUga2V5cydzIG5hdHVyYWwgb3JkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2UgbWFwcGluZ3MgYXJlIHRvIGJlIGNvcGllZAotICAgICAqLwotICAgIHB1YmxpYyBGYXN0VHJlZU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbmV3IFRyZWVNYXAobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWFwIHdpdGggdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhlIHNwZWNpZmllZCBtYXAsCi0gICAgICogc29ydGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBvcmRlcmluZwotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgY29waWVkCi0gICAgICovCi0gICAgcHVibGljIEZhc3RUcmVlTWFwKFNvcnRlZE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBuZXcgVHJlZU1hcChtYXApOwotICAgIH0KLQotCi0gICAgLy8gUHJvcGVydHkgYWNjZXNzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBvcGVyYXRpbmcgaW4gZmFzdCBtb2RlLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyBvcGVyYXRpbmcgaW4gZmFzdCBtb2RlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RmFzdCgpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmZhc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIHdoZXRoZXIgdGhpcyBtYXAgaXMgb3BlcmF0aW5nIGluIGZhc3QgbW9kZS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gZmFzdCB0cnVlIGlmIHRoaXMgbWFwIHNob3VsZCBvcGVyYXRlIGluIGZhc3QgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhc3QoYm9vbGVhbiBmYXN0KSB7Ci0gICAgICAgIHRoaXMuZmFzdCA9IGZhc3Q7Ci0gICAgfQotCi0KLSAgICAvLyBNYXAgYWNjZXNzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIGZvcndhcmQgc3RyYWlnaHQgdG8gdGhlIHdyYXBwZWQgTWFwIGluICdmYXN0JyBtb2RlLgotICAgIC8vIChiZWNhdXNlIHRoZXkgYXJlIHF1ZXJ5IG1ldGhvZHMpCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuICBSZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleSwgb3IgaWYKLSAgICAgKiB0aGVyZSBpcyBhIG1hcHBpbmcgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+LiAgVXNlIHRoZQotICAgICAqIDxjb2RlPmNvbnRhaW5zS2V5KCk8L2NvZGU+IG1ldGhvZCB0byBkaXNhbWJpZ3VhdGUgdGhlc2UgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHdob3NlIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoYXQga2V5LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChtYXAuZ2V0KGtleSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBtYXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5zaXplKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmdzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gaXMgdGhlIG1hcCBjdXJyZW50bHkgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChtYXAuaXNFbXB0eSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZQotICAgICAqIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5jb250YWluc0tleShrZXkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAuY29udGFpbnNLZXkoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtYXAgY29udGFpbnMgb25lIG9yIG1vcmUga2V5cyBtYXBwaW5nCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGJlIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5jb250YWluc1ZhbHVlKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29tcGFyYXRvciB1c2VkIHRvIG9yZGVyIHRoaXMgbWFwLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIGlmIHRoaXMgbWFwIHVzZXMgaXRzIGtleXMnIG5hdHVyYWwgb3JkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tcGFyYXRvciB1c2VkIHRvIG9yZGVyIHRoZSBtYXAsIG9yIG51bGwgaWYgbmF0dXJhbCBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5jb21wYXJhdG9yKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5jb21wYXJhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBmaXJzdCAobG93ZXN0KSBrZXkgY3VycmVudGx5IGluIHRoaXMgc29ydGVkIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBrZXkgaW4gdGhlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZmlyc3RLZXkoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5maXJzdEtleSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAuZmlyc3RLZXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxhc3QgKGhpZ2hlc3QpIGtleSBjdXJyZW50bHkgaW4gdGhpcyBzb3J0ZWQgbWFwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga2V5IGluIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1hcC5sYXN0S2V5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5sYXN0S2V5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBNYXAgbW9kaWZpY2F0aW9uCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFRoZXNlIG1ldGhvZHMgcGVyZm9ybSBzcGVjaWFsIGJlaGF2aW91ciBpbiAnZmFzdCcgbW9kZS4KLSAgICAvLyBUaGUgbWFwIGlzIGNsb25lZCwgdXBkYXRlZCBhbmQgdGhlbiBhc3NpZ25lZCBiYWNrLgotICAgIC8vIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBhcyB0byB3aHkgdGhpcyB3b24ndCBhbHdheXMgd29yay4KLQotICAgIC8qKgotICAgICAqIEFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBtYXAuCi0gICAgICogSWYgdGhlIG1hcCBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkCi0gICAgICogdmFsdWUgaXMgcmVwbGFjZWQgYW5kIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB3aXRoIHdoaWNoIHRoZSB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcHJldmlvdXNseSBtYXBwZWQgdG8gdGhlIGtleSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgVHJlZU1hcCB0ZW1wID0gKFRyZWVNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSB0ZW1wLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAucHV0KGtleSwgdmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgb25lLCByZXBsYWNpbmcKLSAgICAgKiBhbnkgbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBrZXlzLgotICAgICAqCi0gICAgICogQHBhcmFtIGluICB0aGUgbWFwIHdob3NlIG1hcHBpbmdzIGFyZSB0byBiZSBjb3BpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIGluKSB7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBUcmVlTWFwIHRlbXAgPSAoVHJlZU1hcCkgbWFwLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgdGVtcC5wdXRBbGwoaW4pOwotICAgICAgICAgICAgICAgIG1hcCA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIG1hcC5wdXRBbGwoaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFueSBtYXBwaW5nIGZvciB0aGlzIGtleSwgYW5kIHJldHVybiBhbnkgcHJldmlvdXNseQotICAgICAqIG1hcHBlZCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgd2hvc2UgbWFwcGluZyBpcyB0byBiZSByZW1vdmVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcmVtb3ZlZCwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIFRyZWVNYXAgdGVtcCA9IChUcmVlTWFwKSBtYXAuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGVtcC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAucmVtb3ZlKGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbWFwID0gbmV3IFRyZWVNYXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgbWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLy8gQmFzaWMgb2JqZWN0IG1ldGhvZHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgbGlzdCBmb3IgZXF1YWxpdHkuICBUaGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gdXNlcyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlCi0gICAgICogbGlzdCBlcXVhbHMgZnVuY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQotICAgICAqIDxjb2RlPk1hcC5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvICB0aGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHRvIHRoaXMgbGlzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIG1hcHMgYXJlIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIC8vIFNpbXBsZSB0ZXN0cyB0aGF0IHJlcXVpcmUgbm8gc3luY2hyb25pemF0aW9uCi0gICAgICAgIGlmIChvID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShvIGluc3RhbmNlb2YgTWFwKSkgewotICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1vID0gKE1hcCkgbzsKLQotICAgICAgICAvLyBDb21wYXJlIHRoZSB0d28gbWFwcyBmb3IgZXF1YWxpdHkKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIGlmIChtby5zaXplKCkgIT0gbWFwLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlLmdldEtleSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShtby5nZXQoa2V5KSA9PSBudWxsICYmIG1vLmNvbnRhaW5zS2V5KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKG1vLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICBpZiAobW8uc2l6ZSgpICE9IG1hcC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobW8uZ2V0KGtleSkgPT0gbnVsbCAmJiBtby5jb250YWluc0tleShrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMobW8uZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1hcC4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAqIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbGlzdCBoYXNoIGZ1bmN0aW9uIGluIHRoZQotICAgICAqIGRvY3VtZW50YXRpb24gZm9yIHRoZSA8Y29kZT5NYXAuaGFzaENvZGU8L2NvZGU+IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3VpdGFibGUgaW50ZWdlciBoYXNoIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgaW50IGggPSAwOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBoICs9IGkubmV4dCgpLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICBpbnQgaCA9IDA7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggKz0gaS5uZXh0KCkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIDxjb2RlPkZhc3RUcmVlTWFwPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKiBUaGUga2V5cyBhbmQgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjb3BpZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGNsb25lIG9mIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgRmFzdFRyZWVNYXAgcmVzdWx0cyA9IG51bGw7Ci0gICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICByZXN1bHRzID0gbmV3IEZhc3RUcmVlTWFwKG1hcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgRmFzdFRyZWVNYXAobWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHRzLnNldEZhc3QoZ2V0RmFzdCgpKTsKLSAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKLSAgICB9Ci0KLQotICAgIC8vIFN1YiBtYXAgdmlld3MKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgdmlldyBvZiB0aGUgcG9ydGlvbiBvZiB0aGlzIG1hcCB3aG9zZSBrZXlzIGFyZSBzdHJpY3RseQotICAgICAqIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgS2V5IGhpZ2hlciB0aGFuIGFueSBpbiB0aGUgcmV0dXJuZWQgbWFwCi0gICAgICogQHJldHVybiBhIGhlYWQgbWFwCi0gICAgICovCi0gICAgcHVibGljIFNvcnRlZE1hcCBoZWFkTWFwKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiAobWFwLmhlYWRNYXAoa2V5KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobWFwLmhlYWRNYXAoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2aWV3IG9mIHRoZSBwb3J0aW9uIG9mIHRoaXMgbWFwIHdob3NlIGtleXMgYXJlIGluIHRoZQotICAgICAqIHJhbmdlIGZyb21LZXkgKGluY2x1c2l2ZSkgdG8gdG9LZXkgKGV4Y2x1c2l2ZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbUtleSBMb3dlciBsaW1pdCBvZiBrZXlzIGZvciB0aGUgcmV0dXJuZWQgbWFwCi0gICAgICogQHBhcmFtIHRvS2V5IFVwcGVyIGxpbWl0IG9mIGtleXMgZm9yIHRoZSByZXR1cm5lZCBtYXAKLSAgICAgKiBAcmV0dXJuIGEgc3ViIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBTb3J0ZWRNYXAgc3ViTWFwKE9iamVjdCBmcm9tS2V5LCBPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgIHJldHVybiAobWFwLnN1Yk1hcChmcm9tS2V5LCB0b0tleSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcC5zdWJNYXAoZnJvbUtleSwgdG9LZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHZpZXcgb2YgdGhlIHBvcnRpb24gb2YgdGhpcyBtYXAgd2hvc2Uga2V5cyBhcmUgZ3JlYXRlciB0aGFuCi0gICAgICogb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IEtleSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYW55IGluIHRoZSByZXR1cm5lZCBtYXAKLSAgICAgKiBAcmV0dXJuIGEgdGFpbCBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgU29ydGVkTWFwIHRhaWxNYXAoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgcmV0dXJuIChtYXAudGFpbE1hcChrZXkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtYXAudGFpbE1hcChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gTWFwIHZpZXdzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgRWFjaAotICAgICAqIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgYSA8Y29kZT5NYXAuRW50cnk8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5U2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvLyBNYXAgdmlldyBpbm5lciBjbGFzc2VzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQWJzdHJhY3QgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkga2V5U2V0KCksIHZhbHVlcygpIGFuZCBlbnRyeVNldCgpLgotICAgICAqLwotICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZpZXcgaW1wbGVtZW50cyBDb2xsZWN0aW9uIHsKLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvblZpZXcoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbiBnZXQoTWFwIG1hcCk7Ci0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgaXRlcmF0b3JOZXh0KE1hcC5FbnRyeSBlbnRyeSk7Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChGYXN0VHJlZU1hcC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICBnZXQobWFwKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RUcmVlTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJlZU1hcCB0ZW1wID0gKFRyZWVNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmVtb3ZlKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZW1vdmUobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RUcmVlTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJlZU1hcCB0ZW1wID0gKFRyZWVNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmVtb3ZlQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZW1vdmVBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEZhc3RUcmVlTWFwLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJlZU1hcCB0ZW1wID0gKFRyZWVNYXApIG1hcC5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHIgPSBnZXQodGVtcCkucmV0YWluQWxsKG8pOwotICAgICAgICAgICAgICAgICAgICBtYXAgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5yZXRhaW5BbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuc2l6ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmlzRW1wdHkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuY29udGFpbnMobyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5jb250YWlucyhvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIG8pIHsKLSAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLmNvbnRhaW5zQWxsKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuY29udGFpbnNBbGwobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gbykgewotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkudG9BcnJheShvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChtYXApLnRvQXJyYXkobyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKGZhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuZXF1YWxzKG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICBpZiAoZmFzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXQobWFwKS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KG1hcCkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25WaWV3SXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQ29sbGVjdGlvblZpZXdJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBNYXAgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBwcml2YXRlIE1hcC5FbnRyeSBsYXN0UmV0dXJuZWQgPSBudWxsOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgICAgICAgICAgcHVibGljIENvbGxlY3Rpb25WaWV3SXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RlZCA9IG1hcDsKLSAgICAgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gZXhwZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gbWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gbWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IChNYXAuRW50cnkpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvck5leHQobGFzdFJldHVybmVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRmFzdFRyZWVNYXAudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IG1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXN0VHJlZU1hcC50aGlzLnJlbW92ZShsYXN0UmV0dXJuZWQuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJldHVybmVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbWFwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogU2V0IGltcGxlbWVudGF0aW9uIG92ZXIgdGhlIGtleXMgb2YgdGhlIEZhc3RUcmVlTWFwCi0gICAgKi8KLSAgIHByaXZhdGUgY2xhc3MgS2V5U2V0IGV4dGVuZHMgQ29sbGVjdGlvblZpZXcgaW1wbGVtZW50cyBTZXQgewotCi0gICAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0KE1hcCBtYXApIHsKLSAgICAgICAgICAgcmV0dXJuIG1hcC5rZXlTZXQoKTsKLSAgICAgICB9Ci0KLSAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGl0ZXJhdG9yTmV4dChNYXAuRW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpOwotICAgICAgIH0gICAgICAgCi0KLSAgIH0KLQotICAgLyoqCi0gICAgKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgRmFzdFRyZWVNYXAKLSAgICAqLwotICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZXMgZXh0ZW5kcyBDb2xsZWN0aW9uVmlldyB7Ci0KLSAgICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXQoTWFwIG1hcCkgewotICAgICAgICAgICByZXR1cm4gbWFwLnZhbHVlcygpOwotICAgICAgIH0KLQotICAgICAgIHByb3RlY3RlZCBPYmplY3QgaXRlcmF0b3JOZXh0KE1hcC5FbnRyeSBlbnRyeSkgewotICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogU2V0IGltcGxlbWVudGF0aW9uIG92ZXIgdGhlIGVudHJpZXMgb2YgdGhlIEZhc3RUcmVlTWFwCi0gICAgKi8KLSAgIHByaXZhdGUgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBDb2xsZWN0aW9uVmlldyBpbXBsZW1lbnRzIFNldCB7Ci0KLSAgICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXQoTWFwIG1hcCkgewotICAgICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgfQotCi0KLSAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGl0ZXJhdG9yTmV4dChNYXAuRW50cnkgZW50cnkpIHsKLSAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgIH0KLQotICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRnVuY3RvckV4Y2VwdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0Z1bmN0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNiZjc0My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvRnVuY3RvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogUnVudGltZSBleGNlcHRpb24gdGhyb3duIGZyb20gZnVuY3RvcnMuCi0gKiBJZiByZXF1aXJlZCwgYSByb290IGNhdXNlIGVycm9yIGNhbiBiZSB3cmFwcGVkIHdpdGhpbiB0aGlzIG9uZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRnVuY3RvckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIAotICAgIC8qKgotICAgICAqIERvZXMgSkRLIHN1cHBvcnQgbmVzdGVkIGV4Y2VwdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEpES19TVVBQT1JUU19ORVNURUQ7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgYm9vbGVhbiBmbGFnID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldENhdXNlIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgIGZsYWcgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBKREtfU1VQUE9SVFNfTkVTVEVEID0gZmxhZzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgcm9vdENhdXNlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GdW5jdG9yRXhjZXB0aW9uPC9jb2RlPiB3aXRob3V0IHNwZWNpZmllZAotICAgICAqIGRldGFpbCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBGdW5jdG9yRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnJvb3RDYXVzZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GdW5jdG9yRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHNwZWNpZmllZAotICAgICAqIGRldGFpbCBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyAgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEZ1bmN0b3JFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgICBzdXBlcihtc2cpOwotICAgICAgICB0aGlzLnJvb3RDYXVzZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GdW5jdG9yRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHNwZWNpZmllZAotICAgICAqIG5lc3RlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IHJvb3QgY2F1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdENhdXNlICB0aGUgZXhjZXB0aW9uIG9yIGVycm9yIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgdG8gYmUgdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyBGdW5jdG9yRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLSAgICAgICAgc3VwZXIoKHJvb3RDYXVzZSA9PSBudWxsID8gbnVsbCA6IHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GdW5jdG9yRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHNwZWNpZmllZAotICAgICAqIGRldGFpbCBtZXNzYWdlIGFuZCBuZXN0ZWQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiByb290IGNhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHJvb3RDYXVzZSAgdGhlIGV4Y2VwdGlvbiBvciBlcnJvciB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIHRvIGJlIHRocm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVuY3RvckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgICAgIHRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNhdXNlIG9mIHRoaXMgdGhyb3dhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gIHRoZSBjYXVzZSBvZiB0aGlzIHRocm93YWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewotICAgICAgICByZXR1cm4gcm9vdENhdXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhpcyBleGNlcHRpb24gdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCAgdGhlIDxjb2RlPlByaW50U3RyZWFtPC9jb2RlPiB0byB1c2UgZm9yIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChvdXQpIHsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG91dCwgZmFsc2UpOwotICAgICAgICAgICAgcHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBQcmludFdyaXRlciBiZWZvcmUgaXQncyBHQydlZC4KLSAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCAgdGhlIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiB0byB1c2UgZm9yIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBvdXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChvdXQpIHsKLSAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShvdXQpOwotICAgICAgICAgICAgaWYgKHJvb3RDYXVzZSAhPSBudWxsICYmIEpES19TVVBQT1JUU19ORVNURUQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIkNhdXNlZCBieTogIik7Ci0gICAgICAgICAgICAgICAgcm9vdENhdXNlLnByaW50U3RhY2tUcmFjZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSGFzaEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0hhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmI0ODVhYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSGFzaEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEEge0BsaW5rIEJhZ30gdGhhdCBpcyBiYWNrZWQgYnkgYSB7QGxpbmsgSGFzaE1hcH0uCi0gKgotICogQGRlcHJlY2F0ZWQgTW92ZWQgdG8gYmFnIHN1YnBhY2thZ2UgYW5kIHJld3JpdHRlbiBpbnRlcm5hbGx5LiBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBDaHVjayBCdXJkaWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBIYXNoQmFnIGV4dGVuZHMgRGVmYXVsdE1hcEJhZyBpbXBsZW1lbnRzIEJhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDxDb2RlPkhhc2hCYWc8L0NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBIYXNoQmFnKCkgewotICAgICAgICBzdXBlcihuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIEJhZ30gY29udGFpbmluZyBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuCi0gICAgICogY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgYSBjb2xsZWN0aW9uIHRvIGNvcHkgaW50byB0aGlzIGJhZwotICAgICAqLwotICAgIHB1YmxpYyBIYXNoQmFnKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIGFkZEFsbChjb2xsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9JdGVyYWJsZU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0l0ZXJhYmxlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1Y2MxNTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0l0ZXJhYmxlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZWZpbmVzIGEgbWFwIHRoYXQgY2FuIGJlIGl0ZXJhdGVkIGRpcmVjdGx5IHdpdGhvdXQgbmVlZGluZyB0byBjcmVhdGUgYW4gZW50cnkgc2V0LgotICogPHA+Ci0gKiBBIG1hcCBpdGVyYXRvciBpcyBhbiBlZmZpY2llbnQgd2F5IG9mIGl0ZXJhdGluZyBvdmVyIG1hcHMuCi0gKiBUaGVyZSBpcyBubyBuZWVkIHRvIGFjY2VzcyB0aGUgZW50cnkgc2V0IG9yIGNhc3QgdG8gTWFwIEVudHJ5IG9iamVjdHMuCi0gKiA8cHJlPgotICogSXRlcmFibGVNYXAgbWFwID0gbmV3IEhhc2hlZE1hcCgpOwotICogTWFwSXRlcmF0b3IgaXQgPSBtYXAubWFwSXRlcmF0b3IoKTsKLSAqIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAqICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLSAqICAgT2JqZWN0IHZhbHVlID0gaXQuZ2V0VmFsdWUoKTsKLSAqICAgaXQuc2V0VmFsdWUoIm5ld1ZhbHVlIik7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhYmxlTWFwIGV4dGVuZHMgTWFwIHsKLQotICAgIC8qKgotICAgICAqIE9idGFpbnMgYSA8Y29kZT5NYXBJdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIEEgbWFwIGl0ZXJhdG9yIGlzIGFuIGVmZmljaWVudCB3YXkgb2YgaXRlcmF0aW5nIG92ZXIgbWFwcy4KLSAgICAgKiBUaGVyZSBpcyBubyBuZWVkIHRvIGFjY2VzcyB0aGUgZW50cnkgc2V0IG9yIGNhc3QgdG8gTWFwIEVudHJ5IG9iamVjdHMuCi0gICAgICogPHByZT4KLSAgICAgKiBJdGVyYWJsZU1hcCBtYXAgPSBuZXcgSGFzaGVkTWFwKCk7Ci0gICAgICogTWFwSXRlcmF0b3IgaXQgPSBtYXAubWFwSXRlcmF0b3IoKTsKLSAgICAgKiB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICogICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAqICAgT2JqZWN0IHZhbHVlID0gaXQuZ2V0VmFsdWUoKTsKLSAgICAgKiAgIGl0LnNldFZhbHVlKCJuZXdWYWx1ZSIpOwotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbWFwIGl0ZXJhdG9yCi0gICAgICovCi0gICAgTWFwSXRlcmF0b3IgbWFwSXRlcmF0b3IoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9JdGVyYXRvclV0aWxzLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvSXRlcmF0b3JVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOGM4MzNlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9JdGVyYXRvclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Db2xsYXRpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5TWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5FbXB0eU9yZGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkZpbHRlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRmlsdGVyTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuSXRlcmF0b3JDaGFpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkl0ZXJhdG9yRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5MaXN0SXRlcmF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuTG9vcGluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuTG9vcGluZ0xpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLk9iamVjdEFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5PYmplY3RBcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLk9iamVjdEdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5TaW5nbGV0b25JdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlNpbmdsZXRvbkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlRyYW5zZm9ybUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVNYXBJdGVyYXRvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGFuZCBkZWNvcmF0b3JzIGZvciB7QGxpbmsgSXRlcmF0b3J9IAotICogaW5zdGFuY2VzLiBUaGUgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgaXRlcmF0b3JzIHN1YnBhY2thZ2UuCi0gKiA8cD4KLSAqIFdBUk5JTkc6IER1ZSB0byBodW1hbiBlcnJvciBjZXJ0YWluIGJpbmFyeSBpbmNvbXBhdGFiaWxpdGllcyB3ZXJlIGludHJvZHVjZWQKLSAqIGJldHdlZW4gQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEgYW5kIDMuMC4gVGhlIGNsYXNzIHJlbWFpbmVkIHNvdXJjZSBhbmQgdGVzdAotICogY29tcGF0aWJsZSwgc28gaWYgeW91IGNhbiByZWNvbXBpbGUgYWxsIHlvdXIgY2xhc3NlcyBhbmQgZGVwZW5kZW5jaWVzCi0gKiBldmVyeXRoaW5nIGlzIE9LLiBUaG9zZSBtZXRob2RzIHdoaWNoIGFyZSBiaW5hcnkgaW5jb21wYXRpYmxlIGFyZSBtYXJrZWQgYXMKLSAqIHN1Y2gsIHRvZ2V0aGVyIHdpdGggYWx0ZXJuYXRlIHNvbHV0aW9ucyB0aGF0IGFyZSBiaW5hcnkgY29tcGF0aWJsZQotICogYWdhaW5zdCB2ZXJzaW9ucyAyLjEuMSBhbmQgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBoaWwgU3RlaXR6Ci0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvclV0aWxzIHsKLSAgICAvLyB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhpcyBjbGFzcyBpbiBjZXJ0YWluIGNhc2VzIGJlY2F1c2UgdGhlCi0gICAgLy8gcHVibGljIGNsYXNzZXMgYWxsb3cgaW52YWxpZCBzdGF0ZXMKLQotICAgIC8qKgotICAgICAqIEFuIGl0ZXJhdG9yIG92ZXIgbm8gZWxlbWVudHMuCi0gICAgICogPHA+Ci0gICAgICogV0FSTklORzogVGhpcyBjb25zdGFudCBpcyBiaW5hcnkgaW5jb21wYXRpYmxlIHdpdGggQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEgYW5kIDIuMS4xLgotICAgICAqIFVzZSA8Y29kZT5FbXB0eUl0ZXJhdG9yLklOU1RBTkNFPC9jb2RlPiBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xLjEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXNldHRhYmxlSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBFbXB0eUl0ZXJhdG9yLlJFU0VUVEFCTEVfSU5TVEFOQ0U7Ci0gICAgLyoqCi0gICAgICogQSBsaXN0IGl0ZXJhdG9yIG92ZXIgbm8gZWxlbWVudHMuCi0gICAgICogPHA+Ci0gICAgICogV0FSTklORzogVGhpcyBjb25zdGFudCBpcyBiaW5hcnkgaW5jb21wYXRpYmxlIHdpdGggQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEgYW5kIDIuMS4xLgotICAgICAqIFVzZSA8Y29kZT5FbXB0eUxpc3RJdGVyYXRvci5JTlNUQU5DRTwvY29kZT4gZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMS4xLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVzZXR0YWJsZUxpc3RJdGVyYXRvciBFTVBUWV9MSVNUX0lURVJBVE9SID0gRW1wdHlMaXN0SXRlcmF0b3IuUkVTRVRUQUJMRV9JTlNUQU5DRTsKLSAgICAvKioKLSAgICAgKiBBbiBvcmRlcmVkIGl0ZXJhdG9yIG92ZXIgbm8gZWxlbWVudHMuCi0gICAgICovICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3JkZXJlZEl0ZXJhdG9yIEVNUFRZX09SREVSRURfSVRFUkFUT1IgPSBFbXB0eU9yZGVyZWRJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAvKioKLSAgICAgKiBBIG1hcCBpdGVyYXRvciBvdmVyIG5vIGVsZW1lbnRzLgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcEl0ZXJhdG9yIEVNUFRZX01BUF9JVEVSQVRPUiA9IEVtcHR5TWFwSXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgLyoqCi0gICAgICogQW4gb3JkZXJlZCBtYXAgaXRlcmF0b3Igb3ZlciBubyBlbGVtZW50cy4KLSAgICAgKi8gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPcmRlcmVkTWFwSXRlcmF0b3IgRU1QVFlfT1JERVJFRF9NQVBfSVRFUkFUT1IgPSBFbXB0eU9yZGVyZWRNYXBJdGVyYXRvci5JTlNUQU5DRTsKLQotICAgIC8qKgotICAgICAqIEl0ZXJhdG9yVXRpbHMgaXMgbm90IG5vcm1hbGx5IGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3JVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvLyBFbXB0eQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGVtcHR5IGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXRlcmF0b3IgaXMgYSB2YWxpZCBpdGVyYXRvciBvYmplY3QgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlcgotICAgICAqIG5vdGhpbmcuCi0gICAgICogPHA+Ci0gICAgICogV0FSTklORzogVGhpcyBtZXRob2QgaXMgYmluYXJ5IGluY29tcGF0aWJsZSB3aXRoIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xIGFuZCAyLjEuMS4KLSAgICAgKiBVc2UgPGNvZGU+RW1wdHlJdGVyYXRvci5JTlNUQU5DRTwvY29kZT4gZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMS4xLgotICAgICAqCi0gICAgICogQHJldHVybiAgYW4gaXRlcmF0b3Igb3ZlciBub3RoaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlSXRlcmF0b3IgZW1wdHlJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX0lURVJBVE9SOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gZW1wdHkgbGlzdCBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGlzIGEgdmFsaWQgbGlzdCBpdGVyYXRvciBvYmplY3QgdGhhdCB3aWxsIGl0ZXJhdGUgCi0gICAgICogb3ZlciBub3RoaW5nLgotICAgICAqIDxwPgotICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMSBhbmQgMi4xLjEuCi0gICAgICogVXNlIDxjb2RlPkVtcHR5TGlzdEl0ZXJhdG9yLklOU1RBTkNFPC9jb2RlPiBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xLjEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBhIGxpc3QgaXRlcmF0b3Igb3ZlciBub3RoaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIGVtcHR5TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gRU1QVFlfTElTVF9JVEVSQVRPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGVtcHR5IG9yZGVyZWQgaXRlcmF0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpdGVyYXRvciBpcyBhIHZhbGlkIGl0ZXJhdG9yIG9iamVjdCB0aGF0IHdpbGwgaXRlcmF0ZSAKLSAgICAgKiBvdmVyIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBhbiBvcmRlcmVkIGl0ZXJhdG9yIG92ZXIgbm90aGluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT3JkZXJlZEl0ZXJhdG9yIGVtcHR5T3JkZXJlZEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gRU1QVFlfT1JERVJFRF9JVEVSQVRPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGVtcHR5IG1hcCBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGlzIGEgdmFsaWQgbWFwIGl0ZXJhdG9yIG9iamVjdCB0aGF0IHdpbGwgaXRlcmF0ZSAKLSAgICAgKiBvdmVyIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBhIG1hcCBpdGVyYXRvciBvdmVyIG5vdGhpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcEl0ZXJhdG9yIGVtcHR5TWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9NQVBfSVRFUkFUT1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBlbXB0eSBvcmRlcmVkIG1hcCBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGlzIGEgdmFsaWQgbWFwIGl0ZXJhdG9yIG9iamVjdCB0aGF0IHdpbGwgaXRlcmF0ZSAKLSAgICAgKiBvdmVyIG5vdGhpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBhIG1hcCBpdGVyYXRvciBvdmVyIG5vdGhpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9yZGVyZWRNYXBJdGVyYXRvciBlbXB0eU9yZGVyZWRNYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZX09SREVSRURfTUFQX0lURVJBVE9SOwotICAgIH0KLQotICAgIC8vIFNpbmdsZXRvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc2luZ2xldG9uIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXRlcmF0b3IgaXMgYSB2YWxpZCBpdGVyYXRvciBvYmplY3QgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlcgotICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMSBhbmQgMi4xLjEuCi0gICAgICogVXNlIDxjb2RlPm5ldyBTaW5nbGV0b25JdGVyYXRvcihvYmplY3QpPC9jb2RlPiBmb3IgY29tcGF0YWJpbGl0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBzaW5nbGUgb2JqZWN0IG92ZXIgd2hpY2ggdG8gaXRlcmF0ZQotICAgICAqIEByZXR1cm4gIGEgc2luZ2xldG9uIGl0ZXJhdG9yIG92ZXIgdGhlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUl0ZXJhdG9yIHNpbmdsZXRvbkl0ZXJhdG9yKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25JdGVyYXRvcihvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzaW5nbGV0b24gbGlzdCBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGlzIGEgdmFsaWQgbGlzdCBpdGVyYXRvciBvYmplY3QgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlcgotICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIHNpbmdsZSBvYmplY3Qgb3ZlciB3aGljaCB0byBpdGVyYXRlCi0gICAgICogQHJldHVybiAgYSBzaW5nbGV0b24gbGlzdCBpdGVyYXRvciBvdmVyIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3RJdGVyYXRvciBzaW5nbGV0b25MaXN0SXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbkxpc3RJdGVyYXRvcihvYmplY3QpOwotICAgIH0KLQotICAgIC8vIEFycmF5cwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIG92ZXIgYW4gb2JqZWN0IGFycmF5LgotICAgICAqIDxwPgotICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMSBhbmQgMi4xLjEuCi0gICAgICogVXNlIDxjb2RlPm5ldyBBcnJheUl0ZXJhdG9yKGFycmF5KTwvY29kZT4gZm9yIGNvbXBhdGFiaWxpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcmV0dXJuICBhbiBpdGVyYXRvciBvdmVyIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUl0ZXJhdG9yIGFycmF5SXRlcmF0b3IoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RBcnJheUl0ZXJhdG9yKGFycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIG92ZXIgYW4gb2JqZWN0IG9yIHByaW1pdGl2ZSBhcnJheS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBwcmltaXRpdmUgYXJyYXlzIGFzIHdlbGwgYXMgb2JqZWN0IGFycmF5cy4KLSAgICAgKiBUaGUgcHJpbWl0aXZlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcmV0dXJuICBhbiBpdGVyYXRvciBvdmVyIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc2V0dGFibGVJdGVyYXRvciBhcnJheUl0ZXJhdG9yKE9iamVjdCBhcnJheSkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IoYXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZW5kIHBhcnQgb2YgYW4gb2JqZWN0IGFycmF5LgotICAgICAqIDxwPgotICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMSBhbmQgMi4xLjEuCi0gICAgICogVXNlIDxjb2RlPm5ldyBBcnJheUl0ZXJhdG9yKGFycmF5LHN0YXJ0KTwvY29kZT4gZm9yIGNvbXBhdGFiaWxpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3RhcnQgaXMgbGVzcyB0aGFuIHplcm8gb3IgZ3JlYXRlcgotICAgICAqICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlSXRlcmF0b3IgYXJyYXlJdGVyYXRvcihPYmplY3RbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0QXJyYXlJdGVyYXRvcihhcnJheSwgc3RhcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZW5kIHBhcnQgb2YgYW4gb2JqZWN0IG9yIHByaW1pdGl2ZSBhcnJheS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBwcmltaXRpdmUgYXJyYXlzIGFzIHdlbGwgYXMgb2JqZWN0IGFycmF5cy4KLSAgICAgKiBUaGUgcHJpbWl0aXZlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHN0YXJ0IGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIKLSAgICAgKiAgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUl0ZXJhdG9yIGFycmF5SXRlcmF0b3IoT2JqZWN0IGFycmF5LCBpbnQgc3RhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKGFycmF5LCBzdGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIHBhcnQgb2YgYW4gb2JqZWN0IGFycmF5LgotICAgICAqIDxwPgotICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBDb21tb25zIENvbGxlY3Rpb25zIDIuMSBhbmQgMi4xLjEuCi0gICAgICogVXNlIDxjb2RlPm5ldyBBcnJheUl0ZXJhdG9yKGFycmF5LHN0YXJ0LGVuZCk8L2NvZGU+IGZvciBjb21wYXRhYmlsaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgb3ZlciB3aGljaCB0byBpdGVyYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0ICB0aGUgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIGF0Ci0gICAgICogQHBhcmFtIGVuZCAgdGhlIGluZGV4IHRvIGZpbmlzaCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgYXJyYXkgYm91bmRzIGFyZSBpbnZhbGlkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZW5kIGlzIGJlZm9yZSBzdGFydAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUl0ZXJhdG9yIGFycmF5SXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdEFycmF5SXRlcmF0b3IoYXJyYXksIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciBwYXJ0IG9mIGFuIG9iamVjdCBvciBwcmltaXRpdmUgYXJyYXkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBoYW5kbGUgcHJpbWl0aXZlIGFycmF5cyBhcyB3ZWxsIGFzIG9iamVjdCBhcnJheXMuCi0gICAgICogVGhlIHByaW1pdGl2ZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgb3ZlciB3aGljaCB0byBpdGVyYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0ICB0aGUgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIGF0Ci0gICAgICogQHBhcmFtIGVuZCAgdGhlIGluZGV4IHRvIGZpbmlzaCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGFycmF5IGJvdW5kcyBhcmUgaW52YWxpZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVuZCBpcyBiZWZvcmUgc3RhcnQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc2V0dGFibGVJdGVyYXRvciBhcnJheUl0ZXJhdG9yKE9iamVjdCBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihhcnJheSwgc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaXN0IGl0ZXJhdG9yIG92ZXIgYW4gb2JqZWN0IGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgb3ZlciB3aGljaCB0byBpdGVyYXRlCi0gICAgICogQHJldHVybiAgYSBsaXN0IGl0ZXJhdG9yIG92ZXIgdGhlIGFycmF5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIGFycmF5TGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IoYXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaXN0IGl0ZXJhdG9yIG92ZXIgYW4gb2JqZWN0IG9yIHByaW1pdGl2ZSBhcnJheS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBwcmltaXRpdmUgYXJyYXlzIGFzIHdlbGwgYXMgb2JqZWN0IGFycmF5cy4KLSAgICAgKiBUaGUgcHJpbWl0aXZlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcmV0dXJuICBhIGxpc3QgaXRlcmF0b3Igb3ZlciB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIGFycmF5TGlzdEl0ZXJhdG9yKE9iamVjdCBhcnJheSkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yKGFycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGlzdCBpdGVyYXRvciBvdmVyIHRoZSBlbmQgcGFydCBvZiBhbiBvYmplY3QgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvdmVyIHBhcnQgb2YgdGhlIGFycmF5Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHN0YXJ0IGlzIGxlc3MgdGhhbiB6ZXJvCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIGFycmF5TGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RBcnJheUxpc3RJdGVyYXRvcihhcnJheSwgc3RhcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaXN0IGl0ZXJhdG9yIG92ZXIgdGhlIGVuZCBwYXJ0IG9mIGFuIG9iamVjdCBvciBwcmltaXRpdmUgYXJyYXkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBoYW5kbGUgcHJpbWl0aXZlIGFycmF5cyBhcyB3ZWxsIGFzIG9iamVjdCBhcnJheXMuCi0gICAgICogVGhlIHByaW1pdGl2ZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgb3ZlciB3aGljaCB0byBpdGVyYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0ICB0aGUgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIGF0Ci0gICAgICogQHJldHVybiBhIGxpc3QgaXRlcmF0b3Igb3ZlciBwYXJ0IG9mIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcnJheSBpcyBub3QgYW4gYXJyYXkKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3RhcnQgaXMgbGVzcyB0aGFuIHplcm8KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc2V0dGFibGVMaXN0SXRlcmF0b3IgYXJyYXlMaXN0SXRlcmF0b3IoT2JqZWN0IGFycmF5LCBpbnQgc3RhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcihhcnJheSwgc3RhcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaXN0IGl0ZXJhdG9yIG92ZXIgcGFydCBvZiBhbiBvYmplY3QgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgaW5kZXggdG8gZmluaXNoIGl0ZXJhdGluZyBhdAotICAgICAqIEByZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgYXJyYXkgYm91bmRzIGFyZSBpbnZhbGlkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZW5kIGlzIGJlZm9yZSBzdGFydAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUxpc3RJdGVyYXRvciBhcnJheUxpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IoYXJyYXksIHN0YXJ0LCBlbmQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGlzdCBpdGVyYXRvciBvdmVyIHBhcnQgb2YgYW4gb2JqZWN0IG9yIHByaW1pdGl2ZSBhcnJheS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBwcmltaXRpdmUgYXJyYXlzIGFzIHdlbGwgYXMgb2JqZWN0IGFycmF5cy4KLSAgICAgKiBUaGUgcHJpbWl0aXZlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSBvdmVyIHdoaWNoIHRvIGl0ZXJhdGUKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgaW5kZXggdG8gZmluaXNoIGl0ZXJhdGluZyBhdAotICAgICAqIEByZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG92ZXIgcGFydCBvZiB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbm90IGFuIGFycmF5Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGFycmF5IGJvdW5kcyBhcmUgaW52YWxpZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVuZCBpcyBiZWZvcmUgc3RhcnQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc2V0dGFibGVMaXN0SXRlcmF0b3IgYXJyYXlMaXN0SXRlcmF0b3IoT2JqZWN0IGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcihhcnJheSwgc3RhcnQsIGVuZCk7Ci0gICAgfQotICAgIAotICAgIC8vIFVubW9kaWZpYWJsZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGltbXV0YWJsZSB2ZXJzaW9uIG9mIGFuIHtAbGluayBJdGVyYXRvcn0uIFRoZSByZXR1cm5lZCBvYmplY3QKLSAgICAgKiB3aWxsIGFsd2F5cyB0aHJvdyBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGZvcgotICAgICAqIHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBtYWtlIGltbXV0YWJsZQotICAgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIHZlcnNpb24gb2YgdGhlIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciB1bm1vZGlmaWFibGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlSXRlcmF0b3IuZGVjb3JhdGUoaXRlcmF0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGltbXV0YWJsZSB2ZXJzaW9uIG9mIGEge0BsaW5rIExpc3RJdGVyYXRvcn0uIFRoZSByZXR1cm5lZCBvYmplY3QKLSAgICAgKiB3aWxsIGFsd2F5cyB0aHJvdyBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGZvcgotICAgICAqIHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlfSwge0BsaW5rIExpc3RJdGVyYXRvciNhZGR9IGFuZAotICAgICAqIHtAbGluayBMaXN0SXRlcmF0b3Ijc2V0fSBtZXRob2RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RJdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIG1ha2UgaW1tdXRhYmxlCi0gICAgICogQHJldHVybiBhbiBpbW11dGFibGUgdmVyc2lvbiBvZiB0aGUgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3RJdGVyYXRvciB1bm1vZGlmaWFibGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcikgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmRlY29yYXRlKGxpc3RJdGVyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbW11dGFibGUgdmVyc2lvbiBvZiBhIHtAbGluayBNYXBJdGVyYXRvcn0uIFRoZSByZXR1cm5lZCBvYmplY3QKLSAgICAgKiB3aWxsIGFsd2F5cyB0aHJvdyBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGZvcgotICAgICAqIHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlfSwge0BsaW5rIE1hcEl0ZXJhdG9yI3NldFZhbHVlKE9iamVjdCl9IG1ldGhvZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwSXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBtYWtlIGltbXV0YWJsZQotICAgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIHZlcnNpb24gb2YgdGhlIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXBJdGVyYXRvciB1bm1vZGlmaWFibGVNYXBJdGVyYXRvcihNYXBJdGVyYXRvciBtYXBJdGVyYXRvcikgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IuZGVjb3JhdGUobWFwSXRlcmF0b3IpOwotICAgIH0KLQotICAgIC8vIENoYWluZWQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIHRocm91Z2ggdHdvIHtAbGluayBJdGVyYXRvcn1zIAotICAgICAqIG9uZSBhZnRlciBhbm90aGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yMSAgdGhlIGZpcnN0IGl0ZXJhdG9ycyB0byB1c2UsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yMiAgdGhlIGZpcnN0IGl0ZXJhdG9ycyB0byB1c2UsIG5vdCBudWxsCi0gICAgICogQHJldHVybiBhIGNvbWJpbmF0aW9uIGl0ZXJhdG9yIG92ZXIgdGhlIGl0ZXJhdG9ycwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoYWluZWRJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcjEsIEl0ZXJhdG9yIGl0ZXJhdG9yMikgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ2hhaW4oaXRlcmF0b3IxLCBpdGVyYXRvcjIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyB0aHJvdWdoIGFuIGFycmF5IG9mIHtAbGluayBJdGVyYXRvcn1zIAotICAgICAqIG9uZSBhZnRlciBhbm90aGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9ycyAgdGhlIGl0ZXJhdG9ycyB0byB1c2UsIG5vdCBudWxsIG9yIGVtcHR5IG9yIGNvbnRhaW4gbnVsbHMKLSAgICAgKiBAcmV0dXJuIGEgY29tYmluYXRpb24gaXRlcmF0b3Igb3ZlciB0aGUgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgYXJyYXkgaXMgbnVsbCBvciBjb250YWlucyBhIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoYWluZWRJdGVyYXRvcihJdGVyYXRvcltdIGl0ZXJhdG9ycykgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ2hhaW4oaXRlcmF0b3JzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgdGhyb3VnaCBhIGNvbGxlY3Rpb25zIG9mIHtAbGluayBJdGVyYXRvcn1zIAotICAgICAqIG9uZSBhZnRlciBhbm90aGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9ycyAgdGhlIGl0ZXJhdG9ycyB0byB1c2UsIG5vdCBudWxsIG9yIGVtcHR5IG9yIGNvbnRhaW4gbnVsbHMKLSAgICAgKiBAcmV0dXJuIGEgY29tYmluYXRpb24gaXRlcmF0b3Igb3ZlciB0aGUgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgY29sbGVjdGlvbiBpcyBudWxsIG9yIGNvbnRhaW5zIGEgbnVsbAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvcnMgY29sbGVjdGlvbiBjb250YWlucyB0aGUgd3Jvbmcgb2JqZWN0IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoYWluZWRJdGVyYXRvcihDb2xsZWN0aW9uIGl0ZXJhdG9ycykgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQ2hhaW4oaXRlcmF0b3JzKTsKLSAgICB9Ci0KLSAgICAvLyBDb2xsYXRlZAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIHRoYXQgcHJvdmlkZXMgYW4gb3JkZXJlZCBpdGVyYXRpb24gb3ZlciB0aGUgZWxlbWVudHMKLSAgICAgKiBjb250YWluZWQgaW4gYSBjb2xsZWN0aW9uIG9mIG9yZGVyZWQge0BsaW5rIEl0ZXJhdG9yfXMuCi0gICAgICogPHA+Ci0gICAgICogR2l2ZW4gdHdvIG9yZGVyZWQge0BsaW5rIEl0ZXJhdG9yfXMgPGNvZGU+QTwvY29kZT4gYW5kIDxjb2RlPkI8L2NvZGU+LAotICAgICAqIHRoZSB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxlc3NlciBvZiAKLSAgICAgKiA8Y29kZT5BLm5leHQoKTwvY29kZT4gYW5kIDxjb2RlPkIubmV4dCgpPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29tcGFyYXRvciBpcyBvcHRpb25hbC4gSWYgbnVsbCBpcyBzcGVjaWZpZWQgdGhlbiBuYXR1cmFsIG9yZGVyIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlLCBtYXkgYmUgbnVsbCBmb3IgbmF0dXJhbCBvcmRlcgotICAgICAqIEBwYXJhbSBpdGVyYXRvcjEgIHRoZSBmaXJzdCBpdGVyYXRvcnMgdG8gdXNlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBpdGVyYXRvcjIgIHRoZSBmaXJzdCBpdGVyYXRvcnMgdG8gdXNlLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYSBjb21iaW5hdGlvbiBpdGVyYXRvciBvdmVyIHRoZSBpdGVyYXRvcnMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBjb2xsYXRlZEl0ZXJhdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvciwgSXRlcmF0b3IgaXRlcmF0b3IxLCBJdGVyYXRvciBpdGVyYXRvcjIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsYXRpbmdJdGVyYXRvcihjb21wYXJhdG9yLCBpdGVyYXRvcjEsIGl0ZXJhdG9yMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IHByb3ZpZGVzIGFuIG9yZGVyZWQgaXRlcmF0aW9uIG92ZXIgdGhlIGVsZW1lbnRzCi0gICAgICogY29udGFpbmVkIGluIGFuIGFycmF5IG9mIHtAbGluayBJdGVyYXRvcn1zLgotICAgICAqIDxwPgotICAgICAqIEdpdmVuIHR3byBvcmRlcmVkIHtAbGluayBJdGVyYXRvcn1zIDxjb2RlPkE8L2NvZGU+IGFuZCA8Y29kZT5CPC9jb2RlPiwKLSAgICAgKiB0aGUge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsZXNzZXIgb2YgCi0gICAgICogPGNvZGU+QS5uZXh0KCk8L2NvZGU+IGFuZCA8Y29kZT5CLm5leHQoKTwvY29kZT4gYW5kIHNvIG9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjb21wYXJhdG9yIGlzIG9wdGlvbmFsLiBJZiBudWxsIGlzIHNwZWNpZmllZCB0aGVuIG5hdHVyYWwgb3JkZXIgaXMgdXNlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yICB0aGUgY29tcGFyYXRvciB0byB1c2UsIG1heSBiZSBudWxsIGZvciBuYXR1cmFsIG9yZGVyCi0gICAgICogQHBhcmFtIGl0ZXJhdG9ycyAgdGhlIGl0ZXJhdG9ycyB0byB1c2UsIG5vdCBudWxsIG9yIGVtcHR5IG9yIGNvbnRhaW4gbnVsbHMKLSAgICAgKiBAcmV0dXJuIGEgY29tYmluYXRpb24gaXRlcmF0b3Igb3ZlciB0aGUgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgYXJyYXkgaXMgbnVsbCBvciBjb250YWlucyBhIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNvbGxhdGVkSXRlcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yLCBJdGVyYXRvcltdIGl0ZXJhdG9ycykgewotICAgICAgICByZXR1cm4gbmV3IENvbGxhdGluZ0l0ZXJhdG9yKGNvbXBhcmF0b3IsIGl0ZXJhdG9ycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IHByb3ZpZGVzIGFuIG9yZGVyZWQgaXRlcmF0aW9uIG92ZXIgdGhlIGVsZW1lbnRzCi0gICAgICogY29udGFpbmVkIGluIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgSXRlcmF0b3J9cy4KLSAgICAgKiA8cD4KLSAgICAgKiBHaXZlbiB0d28gb3JkZXJlZCB7QGxpbmsgSXRlcmF0b3J9cyA8Y29kZT5BPC9jb2RlPiBhbmQgPGNvZGU+QjwvY29kZT4sCi0gICAgICogdGhlIHtAbGluayBJdGVyYXRvciNuZXh0KCl9IG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGVzc2VyIG9mIAotICAgICAqIDxjb2RlPkEubmV4dCgpPC9jb2RlPiBhbmQgPGNvZGU+Qi5uZXh0KCk8L2NvZGU+IGFuZCBzbyBvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29tcGFyYXRvciBpcyBvcHRpb25hbC4gSWYgbnVsbCBpcyBzcGVjaWZpZWQgdGhlbiBuYXR1cmFsIG9yZGVyIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlLCBtYXkgYmUgbnVsbCBmb3IgbmF0dXJhbCBvcmRlcgotICAgICAqIEBwYXJhbSBpdGVyYXRvcnMgIHRoZSBpdGVyYXRvcnMgdG8gdXNlLCBub3QgbnVsbCBvciBlbXB0eSBvciBjb250YWluIG51bGxzCi0gICAgICogQHJldHVybiBhIGNvbWJpbmF0aW9uIGl0ZXJhdG9yIG92ZXIgdGhlIGl0ZXJhdG9ycwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgaXRlcmF0b3JzIGNvbGxlY3Rpb24gaXMgbnVsbCBvciBjb250YWlucyBhIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3JzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHdyb25nIG9iamVjdCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBjb2xsYXRlZEl0ZXJhdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvciwgQ29sbGVjdGlvbiBpdGVyYXRvcnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsYXRpbmdJdGVyYXRvcihjb21wYXJhdG9yLCBpdGVyYXRvcnMpOwotICAgIH0KLSAgICAKLSAgICAvLyBPYmplY3QgR3JhcGgKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IG9wZXJhdGVzIG92ZXIgYW4gb2JqZWN0IGdyYXBoLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXRlcmF0b3IgY2FuIGV4dHJhY3QgbXVsdGlwbGUgb2JqZWN0cyBmcm9tIGEgY29tcGxleCB0cmVlLWxpa2Ugb2JqZWN0IGdyYXBoLgotICAgICAqIFRoZSBpdGVyYXRpb24gc3RhcnRzIGZyb20gYSBzaW5nbGUgcm9vdCBvYmplY3QuCi0gICAgICogSXQgdXNlcyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB0byBleHRyYWN0IHRoZSBpdGVyYXRvcnMgYW5kIGVsZW1lbnRzLgotICAgICAqIEl0cyBtYWluIGJlbmVmaXQgaXMgdGhhdCBubyBpbnRlcm1lZGlhdGUgPGNvZGU+TGlzdDwvY29kZT4gaXMgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYW4gb2JqZWN0IGdyYXBoOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgICAgICAgICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gICAgICogICAgICAgICAgICAgICAgIHwgICAgICAgICBcLSBMZWFmCi0gICAgICogICAgICAgICB8LSBUcmVlIHwgICAgICAgICAvLSBMZWFmCi0gICAgICogICAgICAgICB8ICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gICAgICogIEZvcmVzdCB8ICAgICAgICAgICAgICAgICBcLSBMZWFmCi0gICAgICogICAgICAgICB8ICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gICAgICogICAgICAgICB8ICAgICAgIHwgICAgICAgICBcLSBMZWFmCi0gICAgICogICAgICAgICB8LSBUcmVlIHwgICAgICAgICAvLSBMZWFmCi0gICAgICogICAgICAgICAgICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gICAgICogICAgICAgICAgICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmPC9wcmU+Ci0gICAgICogVGhlIGZvbGxvd2luZyA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4sIHVzZWQgaW4gdGhpcyBjbGFzcywgd2lsbCBleHRyYWN0IGFsbAotICAgICAqIHRoZSBMZWFmIG9iamVjdHMgd2l0aG91dCBjcmVhdGluZyBhIGNvbWJpbmVkIGludGVybWVkaWF0ZSBsaXN0OgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IGlucHV0KSB7Ci0gICAgICogICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGb3Jlc3QpIHsKLSAgICAgKiAgICAgcmV0dXJuICgoRm9yZXN0KSBpbnB1dCkudHJlZUl0ZXJhdG9yKCk7Ci0gICAgICogICB9Ci0gICAgICogICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUcmVlKSB7Ci0gICAgICogICAgIHJldHVybiAoKFRyZWUpIGlucHV0KS5icmFuY2hJdGVyYXRvcigpOwotICAgICAqICAgfQotICAgICAqICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQnJhbmNoKSB7Ci0gICAgICogICAgIHJldHVybiAoKEJyYW5jaCkgaW5wdXQpLmxlYWZJdGVyYXRvcigpOwotICAgICAqICAgfQotICAgICAqICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTGVhZikgewotICAgICAqICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICogICB9Ci0gICAgICogICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0gICAgICogfTwvcHJlPgotICAgICAqIDxwPgotICAgICAqIEludGVybmFsbHksIGl0ZXJhdGlvbiBzdGFydHMgZnJvbSB0aGUgcm9vdCBvYmplY3QuIFdoZW4gbmV4dCBpcyBjYWxsZWQsCi0gICAgICogdGhlIHRyYW5zZm9ybWVyIGlzIGNhbGxlZCB0byBleGFtaW5lIHRoZSBvYmplY3QuIFRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybgotICAgICAqIGVpdGhlciBhbiBpdGVyYXRvciBvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgYW4gSXRlcmF0b3IsIHRoZSBuZXh0IGVsZW1lbnQKLSAgICAgKiBmcm9tIHRoYXQgaXRlcmF0b3IgaXMgb2J0YWluZWQgYW5kIHRoZSBwcm9jZXNzIHJlcGVhdHMuIElmIHRoZSBlbGVtZW50IGlzIGFuIG9iamVjdAotICAgICAqIGl0IGlzIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIFVuZGVyIG1hbnkgY2lyY3Vtc3RhbmNlcywgbGlua2luZyBJdGVyYXRvcnMgdG9nZXRoZXIgaW4gdGhpcyBtYW5uZXIgaXMKLSAgICAgKiBtb3JlIGVmZmljaWVudCAoYW5kIGNvbnZlbmllbnQpIHRoYW4gdXNpbmcgbmVzdGVkIGZvciBsb29wcyB0byBleHRyYWN0IGEgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdCAgdGhlIHJvb3Qgb2JqZWN0IHRvIHN0YXJ0IGl0ZXJhdGluZyBmcm9tLCBudWxsIHJlc3VsdHMgaW4gYW4gZW1wdHkgaXRlcmF0b3IKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UsIHNlZSBhYm92ZSwgbnVsbCB1c2VzIG5vIGVmZmVjdCB0cmFuc2Zvcm1lcgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IGdyYXBoIGl0ZXJhdG9yCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBvYmplY3RHcmFwaEl0ZXJhdG9yKE9iamVjdCByb290LCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdEdyYXBoSXRlcmF0b3Iocm9vdCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyBUcmFuc2Zvcm1lZAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIHRoYXQgdHJhbnNmb3JtcyB0aGUgZWxlbWVudHMgb2YgYW5vdGhlciBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHJhbnNmb3JtYXRpb24gb2NjdXJzIGR1cmluZyB0aGUgbmV4dCgpIG1ldGhvZCBhbmQgdGhlIHVuZGVybHlpbmcKLSAgICAgKiBpdGVyYXRvciBpcyB1bmFmZmVjdGVkIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtICB0aGUgdHJhbnNmb3JtIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHRyYW5zZm9ybWluZyBpdGVyYXRvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciB0cmFuc2Zvcm1lZEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm0pIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFuc2Zvcm0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUcmFuc2Zvcm1lciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1JdGVyYXRvcihpdGVyYXRvciwgdHJhbnNmb3JtKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRmlsdGVyZWQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IGZpbHRlcnMgYW5vdGhlciBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmV0dXJuZWQgaXRlcmF0b3Igd2lsbCBvbmx5IHJldHVybiBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZAotICAgICAqIGZpbHRlcmluZyBwcmVkaWNhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgYXMgYSBmaWx0ZXIsIG5vdCBudWxsCi0gICAgICogQHJldHVybiBhIG5ldyBmaWx0ZXJlZCBpdGVyYXRvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBmaWx0ZXJlZEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZGljYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUHJlZGljYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbHRlckl0ZXJhdG9yKGl0ZXJhdG9yLCBwcmVkaWNhdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGlzdCBpdGVyYXRvciB0aGF0IGZpbHRlcnMgYW5vdGhlciBsaXN0IGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciB3aWxsIG9ubHkgcmV0dXJuIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkCi0gICAgICogZmlsdGVyaW5nIHByZWRpY2F0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0SXRlcmF0b3IgIHRoZSBsaXN0IGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBhcyBhIGZpbHRlciwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlcmVkIGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgcGFyYW1ldGVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3RJdGVyYXRvciBmaWx0ZXJlZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChsaXN0SXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJMaXN0SXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJQcmVkaWNhdGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsdGVyTGlzdEl0ZXJhdG9yKGxpc3RJdGVyYXRvciwgcHJlZGljYXRlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gTG9vcGluZwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIHRoYXQgbG9vcHMgY29udGludW91c2x5IG92ZXIgdGhlIHN1cHBsaWVkIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGl0ZXJhdG9yIHdpbGwgb25seSBzdG9wIGxvb3BpbmcgaWYgdGhlIHJlbW92ZSBtZXRob2QgaXMgY2FsbGVkCi0gICAgICogZW5vdWdoIHRpbWVzIHRvIGVtcHR5IHRoZSBjb2xsZWN0aW9uLCBvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eQotICAgICAqIHRvIHN0YXJ0IHdpdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgbG9vcGluZyBpdGVyYXRvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzZXR0YWJsZUl0ZXJhdG9yIGxvb3BpbmdJdGVyYXRvcihDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb2xsZWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExvb3BpbmdJdGVyYXRvcihjb2xsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciB0aGF0IGxvb3BzIGNvbnRpbnVvdXNseSBvdmVyIHRoZSBzdXBwbGllZCBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBpdGVyYXRvciB3aWxsIG9ubHkgc3RvcCBsb29waW5nIGlmIHRoZSByZW1vdmUgbWV0aG9kIGlzIGNhbGxlZAotICAgICAqIGVub3VnaCB0aW1lcyB0byBlbXB0eSB0aGUgbGlzdCwgb3IgaWYgdGhlIGxpc3QgaXMgZW1wdHkgdG8gc3RhcnQgd2l0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBpdGVyYXRlIG92ZXIsIG5vdCBudWxsCi0gICAgICogQHJldHVybiBhIG5ldyBsb29waW5nIGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIGxvb3BpbmdMaXN0SXRlcmF0b3IoTGlzdCBsaXN0KSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTGlzdCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMb29waW5nTGlzdEl0ZXJhdG9yKGxpc3QpOwotICAgIH0KLSAgICAKLSAgICAvLyBWaWV3cwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIHRoYXQgcHJvdmlkZXMgYW4gaXRlcmF0b3IgdmlldyBvZiB0aGUgZ2l2ZW4gZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bWVyYXRpb24gIHRoZSBlbnVtZXJhdGlvbiB0byB1c2UKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBhc0l0ZXJhdG9yKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uKSB7Ci0gICAgICAgIGlmIChlbnVtZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkVudW1lcmF0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3IoZW51bWVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3IgdGhhdCBwcm92aWRlcyBhbiBpdGVyYXRvciB2aWV3IG9mIHRoZSBnaXZlbiBlbnVtZXJhdGlvbiAKLSAgICAgKiB0aGF0IHdpbGwgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudW1lcmF0aW9uICB0aGUgZW51bWVyYXRpb24gdG8gdXNlCi0gICAgICogQHBhcmFtIHJlbW92ZUNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tCi0gICAgICogQHJldHVybiBhIG5ldyBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgYXNJdGVyYXRvcihFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiwgQ29sbGVjdGlvbiByZW1vdmVDb2xsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChlbnVtZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkVudW1lcmF0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVtb3ZlQ29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbGxlY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcihlbnVtZXJhdGlvbiwgcmVtb3ZlQ29sbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgYW4gZW51bWVyYXRpb24gdGhhdCB3cmFwcyBhbiBpdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGVudW1lcmF0aW9uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBhc0VudW1lcmF0aW9uKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb24oaXRlcmF0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGlzdCBpdGVyYXRvciBiYXNlZCBvbiBhIHNpbXBsZSBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBBcyB0aGUgd3JhcHBlZCBJdGVyYXRvciBpcyB0cmF2ZXJzZWQsIGEgTGlua2VkTGlzdCBvZiBpdHMgdmFsdWVzIGlzCi0gICAgICogY2FjaGVkLCBwZXJtaXR0aW5nIGFsbCByZXF1aXJlZCBvcGVyYXRpb25zIG9mIExpc3RJdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvciBwYXJhbWV0ZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdEl0ZXJhdG9yIHRvTGlzdEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcldyYXBwZXIoaXRlcmF0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IGJhc2VkIG9uIGFuIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIEFzIHRoZSB3cmFwcGVkIEl0ZXJhdG9yIGlzIHRyYXZlcnNlZCwgYW4gQXJyYXlMaXN0IG9mIGl0cyB2YWx1ZXMgaXMKLSAgICAgKiBjcmVhdGVkLiBBdCB0aGUgZW5kLCB0aGlzIGlzIGNvbnZlcnRlZCB0byBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpdGVyYXRvciBjb250ZW50cwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgaXRlcmF0b3IgcGFyYW1ldGVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIHRvQXJyYXkoSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgbGlzdCA9IHRvTGlzdChpdGVyYXRvciwgMTAwKTsKLSAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IGJhc2VkIG9uIGFuIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIEFzIHRoZSB3cmFwcGVkIEl0ZXJhdG9yIGlzIHRyYXZlcnNlZCwgYW4gQXJyYXlMaXN0IG9mIGl0cyB2YWx1ZXMgaXMKLSAgICAgKiBjcmVhdGVkLiBBdCB0aGUgZW5kLCB0aGlzIGlzIGNvbnZlcnRlZCB0byBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gYXJyYXlDbGFzcyAgdGhlIGNsYXNzIG9mIGFycmF5IHRvIGNyZWF0ZQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGl0ZXJhdG9yIGNvbnRlbnRzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvciBwYXJhbWV0ZXIgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXlDbGFzcyBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGFycmF5Q2xhc3MgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gdG9BcnJheShJdGVyYXRvciBpdGVyYXRvciwgQ2xhc3MgYXJyYXlDbGFzcykgewotICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJdGVyYXRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFycmF5Q2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBcnJheSBjbGFzcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBsaXN0ID0gdG9MaXN0KGl0ZXJhdG9yLCAxMDApOwotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlDbGFzcywgbGlzdC5zaXplKCkpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpc3QgYmFzZWQgb24gYW4gaXRlcmF0b3IuCi0gICAgICogPHA+Ci0gICAgICogQXMgdGhlIHdyYXBwZWQgSXRlcmF0b3IgaXMgdHJhdmVyc2VkLCBhbiBBcnJheUxpc3Qgb2YgaXRzIHZhbHVlcyBpcwotICAgICAqIGNyZWF0ZWQuIEF0IHRoZSBlbmQsIHRoZSBsaXN0IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBpdGVyYXRvciBjb250ZW50cwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgaXRlcmF0b3IgcGFyYW1ldGVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgdG9MaXN0KEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHJldHVybiB0b0xpc3QoaXRlcmF0b3IsIDEwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpc3QgYmFzZWQgb24gYW4gaXRlcmF0b3IuCi0gICAgICogPHA+Ci0gICAgICogQXMgdGhlIHdyYXBwZWQgSXRlcmF0b3IgaXMgdHJhdmVyc2VkLCBhbiBBcnJheUxpc3Qgb2YgaXRzIHZhbHVlcyBpcwotICAgICAqIGNyZWF0ZWQuIEF0IHRoZSBlbmQsIHRoZSBsaXN0IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBlc3RpbWF0ZWRTaXplICB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBBcnJheUxpc3QKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgaXRlcmF0b3IgY29udGVudHMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGl0ZXJhdG9yIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgdG9MaXN0KEl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgZXN0aW1hdGVkU2l6ZSkgewotICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJdGVyYXRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVzdGltYXRlZFNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFc3RpbWF0ZWQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChlc3RpbWF0ZWRTaXplKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIEdldHMgYSBzdWl0YWJsZSBJdGVyYXRvciBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gaGFuZGxlcyBvYmplY3RzIGFzIGZvbGxvd3MKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPm51bGwgLSBlbXB0eSBpdGVyYXRvcgotICAgICAqIDxsaT5JdGVyYXRvciAtIHJldHVybmVkIGRpcmVjdGx5Ci0gICAgICogPGxpPkVudW1lcmF0aW9uIC0gd3JhcHBlZAotICAgICAqIDxsaT5Db2xsZWN0aW9uIC0gaXRlcmF0b3IgZnJvbSBjb2xsZWN0aW9uIHJldHVybmVkCi0gICAgICogPGxpPk1hcCAtIHZhbHVlcyBpdGVyYXRvciByZXR1cm5lZAotICAgICAqIDxsaT5EaWN0aW9uYXJ5IC0gdmFsdWVzIChlbGVtZW50cykgZW51bWVyYXRpb24gcmV0dXJuZWQgYXMgaXRlcmF0b3IKLSAgICAgKiA8bGk+YXJyYXkgLSBpdGVyYXRvciBvdmVyIGFycmF5IHJldHVybmVkCi0gICAgICogPGxpPm9iamVjdCB3aXRoIGl0ZXJhdG9yKCkgcHVibGljIG1ldGhvZCBhY2Nlc3NlZCBieSByZWZsZWN0aW9uCi0gICAgICogPGxpPm9iamVjdCAtIHNpbmdsZXRvbiBpdGVyYXRvcgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdG9yCi0gICAgICogQHJldHVybiBhIHN1aXRhYmxlIGl0ZXJhdG9yLCBuZXZlciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRJdGVyYXRvcihPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGVtcHR5SXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEl0ZXJhdG9yKSBvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RBcnJheUl0ZXJhdG9yKChPYmplY3RbXSkgb2JqKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3IoKEVudW1lcmF0aW9uKSBvYmopOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNYXApIG9iaikudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3Rpb25hcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcigoKERpY3Rpb25hcnkpIG9iaikuZWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiBvYmouZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihvYmopOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIml0ZXJhdG9yIiwgKENsYXNzW10pIG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChJdGVyYXRvci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gKEl0ZXJhdG9yKSBtZXRob2QuaW52b2tlKG9iaiwgKE9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbkl0ZXJhdG9yKG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9LZXlWYWx1ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0tleVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhYTRjMTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0tleVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi0vKioKLSAqIERlZmluZXMgYSBzaW1wbGUga2V5IHZhbHVlIHBhaXIuCi0gKiA8cD4KLSAqIEEgTWFwIEVudHJ5IGhhcyBjb25zaWRlcmFibGUgYWRkaXRpb25hbCBzZW1hbnRpY3Mgb3ZlciBhbmQgYWJvdmUgYSBzaW1wbGUKLSAqIGtleS12YWx1ZSBwYWlyLiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtaW5pbXVtIGtleSB2YWx1ZSwgd2l0aCBqdXN0IHRoZQotICogdHdvIGdldCBtZXRob2RzLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2V5VmFsdWUgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUga2V5IGZyb20gdGhlIHBhaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgCi0gICAgICovCi0gICAgT2JqZWN0IGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgcGFpci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAgICovCi0gICAgT2JqZWN0IGdldFZhbHVlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9MUlVNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9MUlVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJkNjJlZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTFJVTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgTWFwIHdoaWNoIGhhcyBhIG1heGltdW0gc2l6ZSBhbmQgdXNlcyBhIExlYXN0IFJlY2VudGx5IFVzZWQKLSAqIGFsZ29yaXRobSB0byByZW1vdmUgaXRlbXMgZnJvbSB0aGUgTWFwIHdoZW4gdGhlIG1heGltdW0gc2l6ZSBpcyByZWFjaGVkIGFuZCBuZXcgaXRlbXMgYXJlIGFkZGVkLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEEgc3luY2hyb25pemVkIHZlcnNpb24gY2FuIGJlIG9idGFpbmVkIHdpdGg6Ci0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIHRoZU1hcFRvU3luY2hyb25pemUgKTwvY29kZT4KLSAqIElmIGl0IHdpbGwgYmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcywgeW91IF9tdXN0XyBzeW5jaHJvbml6ZSBhY2Nlc3MKLSAqIHRvIHRoaXMgTWFwLiAgRXZlbiBjb25jdXJyZW50IGdldChPYmplY3QpIG9wZXJhdGlvbnMgcHJvZHVjZSBpbmRldGVybWluYXRlCi0gKiBiZWhhdmlvdXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVW5saWtlIHRoZSBDb2xsZWN0aW9ucyAxLjAgdmVyc2lvbiwgdGhpcyB2ZXJzaW9uIG9mIExSVU1hcCBkb2VzIHVzZSBhIHRydWUKLSAqIExSVSBhbGdvcml0aG0uICBUaGUga2V5cyBmb3IgYWxsIGdldHMgYW5kIHB1dHMgYXJlIG1vdmVkIHRvIHRoZSBmcm9udCBvZgotICogdGhlIGxpc3QuICBMUlVNYXAgaXMgbm93IGEgc3ViY2xhc3Mgb2YgU2VxdWVuY2VkSGFzaE1hcCwgYW5kIHRoZSAiTFJVIgotICoga2V5IGlzIG5vdyBlcXVpdmFsZW50IHRvIExSVU1hcC5nZXRGaXJzdCgpLgotICogPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZCBNb3ZlZCB0byBtYXAgc3VicGFja2FnZS4gRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDEuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOSAkCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1vcmdhbmRAYXBhY2hlLm9yZyI+TW9yZ2FuIERlbGFncmFuZ2U8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMUlVNYXAgZXh0ZW5kcyBTZXF1ZW5jZWRIYXNoTWFwIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgewotICAgICAgICAKLSAgICBwcml2YXRlIGludCBtYXhpbXVtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBwcmltYXJpbHkgZm9yIHRoZSBwdXJwb3NlIG9mCi0gICAgICogZGUtZXh0ZXJuYWxpemF0aW9uLiAgVGhpcyBjb25zdHJ1Y3RvcnMgc2V0cyBhIGRlZmF1bHQKLSAgICAgKiBMUlUgbGltaXQgb2YgMTAwIGtleXMsIGJ1dCB0aGlzIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuCi0gICAgICogaW50ZXJuYWxseSBhcyBhIHJlc3VsdCBvZiBkZS1leHRlcm5hbGl6YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIExSVU1hcCgpIHsKLSAgICAgICAgdGhpcyggMTAwICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IExSVU1hcCB3aXRoIGEgbWF4aW11bSBjYXBhY2l0eSBvZiA8aT5pPC9pPi4KLSAgICAgKiBPbmNlIDxpPmk8L2k+IGNhcGFjaXR5IGlzIGFjaGlldmVkLCBzdWJzZXF1ZW50IGdldHMKLSAgICAgKiBhbmQgcHV0cyB3aWxsIHB1c2gga2V5cyBvdXQgb2YgdGhlIG1hcC4gIFNlZSAuCi0gICAgICogCi0gICAgICogQHBhcmFtIGkgICAgICBNYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBMUlVNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgTFJVTWFwKGludCBpKSB7Ci0gICAgICAgIHN1cGVyKCBpICk7Ci0gICAgICAgIG1heGltdW1TaXplID0gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXQgdGhlIHZhbHVlIGZvciBhIGtleSBmcm9tIHRoZSBNYXAuICBUaGUga2V5Ci0gICAgICogd2lsbCBiZSBwcm9tb3RlZCB0byB0aGUgTW9zdCBSZWNlbnRseSBVc2VkIHBvc2l0aW9uLgotICAgICAqIE5vdGUgdGhhdCBnZXQoT2JqZWN0KSBvcGVyYXRpb25zIHdpbGwgbW9kaWZ5Ci0gICAgICogdGhlIHVuZGVybHlpbmcgQ29sbGVjdGlvbi4gIENhbGxpbmcgZ2V0KE9iamVjdCkKLSAgICAgKiBpbnNpZGUgb2YgYW4gaXRlcmF0aW9uIG92ZXIga2V5cywgdmFsdWVzLCBldGMuIGlzCi0gICAgICogY3VycmVudGx5IHVuc3VwcG9ydGVkLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICAgIEtleSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUuICBSZXR1cm5zIG51bGwgaWYgdGhlIGtleSBoYXMgYQotICAgICAqICAgICAgICAgbnVsbCB2YWx1ZSA8aT5vcjwvaT4gaWYgdGhlIGtleSBoYXMgbm8gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZighY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVtb3ZlKGtleSk7Ci0gICAgICAgIHN1cGVyLnB1dChrZXksdmFsdWUpOwotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAgKiA8cD5SZW1vdmVzIHRoZSBrZXkgYW5kIGl0cyBPYmplY3QgZnJvbSB0aGUgTWFwLjwvcD4KLSAgICAgICogCi0gICAgICAqIDxwPihOb3RlOiB0aGlzIG1heSByZXN1bHQgaW4gdGhlICJMZWFzdCBSZWNlbnRseSBVc2VkIgotICAgICAgKiBvYmplY3QgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuICBJbiB0aGF0IGNhc2UsCi0gICAgICAqIHRoZSByZW1vdmVMUlUoKSBtZXRob2QgaXMgY2FsbGVkLiAgU2VlIGphdmFkb2MgZm9yCi0gICAgICAqIHJlbW92ZUxSVSgpIGZvciBtb3JlIGRldGFpbHMuKTwvcD4KLSAgICAgICogCi0gICAgICAqIEBwYXJhbSBrZXkgICAgS2V5IG9mIHRoZSBPYmplY3QgdG8gYWRkLgotICAgICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCB0byBhZGQKLSAgICAgICogQHJldHVybiBGb3JtZXIgdmFsdWUgb2YgdGhlIGtleQotICAgICAgKi8gICAgCi0gICAgcHVibGljIE9iamVjdCBwdXQoIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSApIHsKLQotICAgICAgICBpbnQgbWFwU2l6ZSA9IHNpemUoKTsKLSAgICAgICAgT2JqZWN0IHJldHZhbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCBtYXBTaXplID49IG1heGltdW1TaXplICkgewotCi0gICAgICAgICAgICAvLyBkb24ndCByZXRpcmUgTFJVIGlmIHlvdSBhcmUganVzdAotICAgICAgICAgICAgLy8gdXBkYXRpbmcgYW4gZXhpc3Rpbmcga2V5Ci0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICAvLyBsZXRzIHJldGlyZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtIGluIHRoZSBjYWNoZQotICAgICAgICAgICAgICAgIHJlbW92ZUxSVSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dmFsID0gc3VwZXIucHV0KGtleSx2YWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsYXNzIGZvciAKLSAgICAgKiBmaW5kaW5nIGFuZCByZW1vdmluZyB0aGUgTFJVIE9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMUlUoKSB7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBnZXRGaXJzdEtleSgpOwotICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgc3VwZXIuZ2V0KGtleSksIG9yIHlvdSdyZSBsaWtlbHkgdG8gCi0gICAgICAgIC8vIGdldCBpbmZpbml0ZSBwcm9tb3Rpb24gcmVjdXJzaW9uCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHN1cGVyLmdldChrZXkpOwotICAgICAgICAKLSAgICAgICAgcmVtb3ZlKGtleSk7Ci0KLSAgICAgICAgcHJvY2Vzc1JlbW92ZWRMUlUoa2V5LHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIG9mIExSVU1hcCBtYXkgaG9vayBpbnRvIHRoaXMgbWV0aG9kIHRvCi0gICAgICogcHJvdmlkZSBzcGVjaWFsaXplZCBhY3Rpb25zIHdoZW5ldmVyIGFuIE9iamVjdCBpcwotICAgICAqIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4gIEJ5IGRlZmF1bHQsCi0gICAgICogdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgICAga2V5IHRoYXQgd2FzIHJlbW92ZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHZhbHVlIG9mIHRoYXQga2V5IChjYW4gYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtb3ZlZExSVShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICB9Ci0gCi0gICAgLy8gRXh0ZXJuYWxpemFibGUgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoIE9iamVjdElucHV0IGluICkgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1heGltdW1TaXplID0gaW4ucmVhZEludCgpOwotICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrICkgIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBwdXQoa2V5LHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoIE9iamVjdE91dHB1dCBvdXQgKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGVJbnQoIG1heGltdW1TaXplICk7Ci0gICAgICAgIG91dC53cml0ZUludCggc2l6ZSgpICk7Ci0gICAgICAgIGZvciggSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCgga2V5ICk7Ci0gICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgc3VwZXIuZ2V0KGtleSksIG9yIHlvdSdyZSBsaWtlbHkgdG8gCi0gICAgICAgICAgICAvLyBnZXQgaW5maW5pdGUgcHJvbW90aW9uIHJlY3Vyc2lvbgotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0KCBrZXkgKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCggdmFsdWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKLSAgICAvKiogR2V0dGVyIGZvciBwcm9wZXJ0eSBtYXhpbXVtU2l6ZS4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IG1heGltdW1TaXplLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtYXhpbXVtU2l6ZTsKLSAgICB9Ci0gICAgLyoqIFNldHRlciBmb3IgcHJvcGVydHkgbWF4aW11bVNpemUuCi0gICAgICogQHBhcmFtIG1heGltdW1TaXplIE5ldyB2YWx1ZSBvZiBwcm9wZXJ0eSBtYXhpbXVtU2l6ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtU2l6ZShpbnQgbWF4aW11bVNpemUpIHsKLSAgICAgICAgdGhpcy5tYXhpbXVtU2l6ZSA9IG1heGltdW1TaXplOwotICAgICAgICB3aGlsZSAoc2l6ZSgpID4gbWF4aW11bVNpemUpIHsKLSAgICAgICAgICAgIHJlbW92ZUxSVSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBhZGQgYSBzZXJpYWwgdmVyc2lvbiB1aWQsIHNvIHRoYXQgaWYgd2UgY2hhbmdlIHRoaW5ncyBpbiB0aGUgZnV0dXJlCi0gICAgLy8gd2l0aG91dCBjaGFuZ2luZyB0aGUgZm9ybWF0LCB3ZSBjYW4gc3RpbGwgZGVzZXJpYWxpemUgcHJvcGVybHkuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE5NzQzMzE0MDc2OTk1NzA1MUw7Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTGlzdFV0aWxzLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTGlzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZmY4YmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0xpc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdC5GaXhlZFNpemVMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LkxhenlMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LlByZWRpY2F0ZWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LlN5bmNocm9uaXplZExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVHJhbnNmb3JtZWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LlR5cGVkTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdC5Vbm1vZGlmaWFibGVMaXN0OwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBhbmQgZGVjb3JhdG9ycyBmb3Ige0BsaW5rIExpc3R9IGluc3RhbmNlcy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIEZlZGVyaWNvIEJhcmJpZXJpCi0gKiBAYXV0aG9yIFBldGVyIERvbmFsZAotICogQGF1dGhvciBQYXVsIEphY2sKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBNYXR0aGV3IEhhd3Rob3JuZQotICovCi1wdWJsaWMgY2xhc3MgTGlzdFV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IHVubW9kaWZpYWJsZSBsaXN0LgotICAgICAqIFRoaXMgdXNlcyB0aGUge0BsaW5rIENvbGxlY3Rpb25zIENvbGxlY3Rpb25zfSBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiBhbmQgaXMgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgRU1QVFlfTElTVCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPGNvZGU+TGlzdFV0aWxzPC9jb2RlPiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdFV0aWxzKCkgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29udGFpbmVkIGluCi0gICAgICogYm90aCBnaXZlbiBsaXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0MSAgdGhlIGZpcnN0IGxpc3QKLSAgICAgKiBAcGFyYW0gbGlzdDIgIHRoZSBzZWNvbmQgbGlzdAotICAgICAqIEByZXR1cm4gIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhvc2UgdHdvIGxpc3RzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGludGVyc2VjdGlvbihmaW5hbCBMaXN0IGxpc3QxLCBmaW5hbCBMaXN0IGxpc3QyKSB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdDIuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGxpc3QxLmNvbnRhaW5zKG8pKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidHJhY3RzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2Vjb25kIGxpc3QgZnJvbSB0aGUgZmlyc3QgbGlzdCwKLSAgICAgKiBwbGFjaW5nIHRoZSByZXN1bHRzIGluIGEgbmV3IGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkaWZmZXJzIGZyb20ge0BsaW5rIExpc3QjcmVtb3ZlQWxsKENvbGxlY3Rpb24pfSBpbiB0aGF0Ci0gICAgICogY2FyZGluYWxpdHkgaXMgcmVzcGVjdGVkOyBpZiA8Q29kZT5saXN0MTwvQ29kZT4gY29udGFpbnMgdHdvCi0gICAgICogb2NjdXJyZW5jZXMgb2YgPENvZGU+bnVsbDwvQ29kZT4gYW5kIDxDb2RlPmxpc3QyPC9Db2RlPiBvbmx5Ci0gICAgICogY29udGFpbnMgb25lIG9jY3VycmVuY2UsIHRoZW4gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBzdGlsbCBjb250YWluCi0gICAgICogb25lIG9jY3VycmVuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgIHRoZSBsaXN0IHRvIHN1YnRyYWN0IGZyb20KLSAgICAgKiBAcGFyYW0gbGlzdDIgIHRoZSBsaXN0IHRvIHN1YnRyYWN0Ci0gICAgICogQHJldHVybiAgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSByZXN1bHRzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHN1YnRyYWN0KGZpbmFsIExpc3QgbGlzdDEsIGZpbmFsIExpc3QgbGlzdDIpIHsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobGlzdDEpOwotICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QyLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmVzdWx0LnJlbW92ZShpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGdpdmVuIGxpc3RzLiAgVGhpcyBpcyB0aGVpciBpbnRlcnNlY3Rpb24KLSAgICAgKiBzdWJ0cmFjdGVkIGZyb20gdGhlaXIgdW5pb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgIHRoZSBmaXJzdCBsaXN0IAotICAgICAqIEBwYXJhbSBsaXN0MiAgdGhlIHNlY29uZCBsaXN0Ci0gICAgICogQHJldHVybiAgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzdW0gb2YgdGhvc2UgbGlzdHMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBsaXN0IGlzIG51bGwKLSAgICAgKi8gCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHN1bShmaW5hbCBMaXN0IGxpc3QxLCBmaW5hbCBMaXN0IGxpc3QyKSB7Ci0gICAgICAgIHJldHVybiBzdWJ0cmFjdCh1bmlvbihsaXN0MSwgbGlzdDIpLCBpbnRlcnNlY3Rpb24obGlzdDEsIGxpc3QyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNlY29uZCBsaXN0IGFwcGVuZGVkIHRvIHRoZQotICAgICAqIGZpcnN0IGxpc3QuICBUaGUge0BsaW5rIExpc3QjYWRkQWxsKENvbGxlY3Rpb24pfSBvcGVyYXRpb24gaXMKLSAgICAgKiB1c2VkIHRvIGFwcGVuZCB0aGUgdHdvIGdpdmVuIGxpc3RzIGludG8gYSBuZXcgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0MSAgdGhlIGZpcnN0IGxpc3QgCi0gICAgICogQHBhcmFtIGxpc3QyICB0aGUgc2Vjb25kIGxpc3QKLSAgICAgKiBAcmV0dXJuICBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHVuaW9uIG9mIHRob3NlIGxpc3RzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHVuaW9uKGZpbmFsIExpc3QgbGlzdDEsIGZpbmFsIExpc3QgbGlzdDIpIHsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobGlzdDEpOwotICAgICAgICByZXN1bHQuYWRkQWxsKGxpc3QyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0d28gbGlzdHMgZm9yIHZhbHVlLWVxdWFsaXR5IGFzIHBlciB0aGUgZXF1YWxpdHkgY29udHJhY3QgaW4KLSAgICAgKiB7QGxpbmsgamF2YS51dGlsLkxpc3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyA8Y29kZT5MaXN0PC9jb2RlPiB3aGVuIHlvdSBjYW5ub3QKLSAgICAgKiBleHRlbmQgQWJzdHJhY3RMaXN0LiBUaGUgbWV0aG9kIHRha2VzIENvbGxlY3Rpb24gaW5zdGFuY2VzIHRvIGVuYWJsZSBvdGhlcgotICAgICAqIGNvbGxlY3Rpb24gdHlwZXMgdG8gdXNlIHRoZSBMaXN0IGltcGxlbWVudGF0aW9uIGFsZ29yaXRobS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVsZXZhbnQgdGV4dCAoc2xpZ2h0bHkgcGFyYXBocmFzZWQgYXMgdGhpcyBpcyBhIHN0YXRpYyBtZXRob2QpIGlzOgotICAgICAqIDxibG9ja3F1b3RlPgotICAgICAqIENvbXBhcmVzIHRoZSB0d28gbGlzdCBvYmplY3RzIGZvciBlcXVhbGl0eS4gIFJldHVybnMKLSAgICAgKiA8dHQ+dHJ1ZTwvdHQ+IGlmIGFuZCBvbmx5IGlmIGJvdGgKLSAgICAgKiBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbgotICAgICAqIHRoZSB0d28gbGlzdHMgYXJlIDxpPmVxdWFsPC9pPi4gIChUd28gZWxlbWVudHMgPHR0PmUxPC90dD4gYW5kCi0gICAgICogPHR0PmUyPC90dD4gYXJlIDxpPmVxdWFsPC9pPiBpZiA8dHQ+KGUxPT1udWxsID8gZTI9PW51bGwgOgotICAgICAqIGUxLmVxdWFscyhlMikpPC90dD4uKSAgSW4gb3RoZXIgd29yZHMsIHR3byBsaXN0cyBhcmUgZGVmaW5lZCB0byBiZQotICAgICAqIGVxdWFsIGlmIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4gIFRoaXMKLSAgICAgKiBkZWZpbml0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZXF1YWxzIG1ldGhvZCB3b3JrcyBwcm9wZXJseSBhY3Jvc3MKLSAgICAgKiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSA8dHQ+TGlzdDwvdHQ+IGludGVyZmFjZS4KLSAgICAgKiA8L2Jsb2NrcXVvdGU+Ci0gICAgICoKLSAgICAgKiA8Yj5Ob3RlOjwvYj4gVGhlIGJlaGF2aW91ciBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQgaWYgdGhlIGxpc3RzIGFyZQotICAgICAqIG1vZGlmaWVkIGR1cmluZyB0aGUgZXF1YWxzIGNvbXBhcmlzb24uCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdAotICAgICAqIEBwYXJhbSBsaXN0MSAgdGhlIGZpcnN0IGxpc3QsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGxpc3QyICB0aGUgc2Vjb25kIGxpc3QsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBsaXN0cyBhcmUgZXF1YWwgYnkgdmFsdWUgY29tcGFyaXNvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsTGlzdChmaW5hbCBDb2xsZWN0aW9uIGxpc3QxLCBmaW5hbCBDb2xsZWN0aW9uIGxpc3QyKSB7Ci0gICAgICAgIGlmIChsaXN0MSA9PSBsaXN0MikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpc3QxID09IG51bGwgfHwgbGlzdDIgPT0gbnVsbCB8fCBsaXN0MS5zaXplKCkgIT0gbGlzdDIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBpdDEgPSBsaXN0MS5pdGVyYXRvcigpOwotICAgICAgICBJdGVyYXRvciBpdDIgPSBsaXN0Mi5pdGVyYXRvcigpOwotICAgICAgICBPYmplY3Qgb2JqMSA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBvYmoyID0gbnVsbDsKLQotICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSAmJiBpdDIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBvYmoxID0gaXQxLm5leHQoKTsKLSAgICAgICAgICAgIG9iajIgPSBpdDIubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoIShvYmoxID09IG51bGwgPyBvYmoyID09IG51bGwgOiBvYmoxLmVxdWFscyhvYmoyKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIShpdDEuaGFzTmV4dCgpIHx8IGl0Mi5oYXNOZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBoYXNoIGNvZGUgdXNpbmcgdGhlIGFsZ29yaXRobSBzcGVjaWZpZWQgaW4gCi0gICAgICoge0BsaW5rIGphdmEudXRpbC5MaXN0I2hhc2hDb2RlKCl9LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIDxjb2RlPkxpc3Q8L2NvZGU+IHdoZW4geW91IGNhbm5vdAotICAgICAqIGV4dGVuZCBBYnN0cmFjdExpc3QuIFRoZSBtZXRob2QgdGFrZXMgQ29sbGVjdGlvbiBpbnN0YW5jZXMgdG8gZW5hYmxlIG90aGVyCi0gICAgICogY29sbGVjdGlvbiB0eXBlcyB0byB1c2UgdGhlIExpc3QgaW1wbGVtZW50YXRpb24gYWxnb3JpdGhtLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjaGFzaENvZGUoKQotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBnZW5lcmF0ZSB0aGUgaGFzaENvZGUgZm9yLCBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlRm9yTGlzdChmaW5hbCBDb2xsZWN0aW9uIGxpc3QpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGhhc2hDb2RlID0gMTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgKG9iaiA9PSBudWxsID8gMCA6IG9iai5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfSAgIAotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPgotICAgICAqIHRoYXQgYXJlIGFsc28gaW4gPGNvZGU+cmV0YWluPC9jb2RlPi4gVGhlIGNhcmRpbmFsaXR5IG9mIGFuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLSAgICAgKiBpbiB0aGUgcmV0dXJuZWQgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgY2FyZGluYWxpdHkgb2YgPGNvZGU+ZTwvY29kZT4KLSAgICAgKiBpbiA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPiB1bmxlc3MgPGNvZGU+cmV0YWluPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIDxjb2RlPmU8L2NvZGU+LCBpbiB3aGljaAotICAgICAqIGNhc2UgdGhlIGNhcmRpbmFsaXR5IGlzIHplcm8uIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3UgZG8gbm90IHdpc2ggdG8gbW9kaWZ5Ci0gICAgICogdGhlIGNvbGxlY3Rpb24gPGNvZGU+YzwvY29kZT4gYW5kIHRodXMgY2Fubm90IGNhbGwgPGNvZGU+Y29sbGVjdGlvbi5yZXRhaW5BbGwocmV0YWluKTs8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiB3aG9zZSBjb250ZW50cyBhcmUgdGhlIHRhcmdldCBvZiB0aGUgI3JldGFpbEFsbCBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gcmV0YWluICB0aGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBlbGVtZW50cyB0byBiZSByZXRhaW5lZCBpbiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+YzwvY29kZT4KLSAgICAgKiB0aGF0IG9jY3VyIGF0IGxlYXN0IG9uY2UgaW4gPGNvZGU+cmV0YWluPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBwYXJhbWV0ZXIgaXMgbnVsbAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDb2xsZWN0aW9uIHJldGFpbikgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KE1hdGgubWluKGNvbGxlY3Rpb24uc2l6ZSgpLCByZXRhaW4uc2l6ZSgpKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXRhaW4uY29udGFpbnMob2JqKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudHMgaW4gPGNvZGU+cmVtb3ZlPC9jb2RlPiBmcm9tIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+LiBUaGF0IGlzLCB0aGlzCi0gICAgICogbWV0aG9kIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiA8Y29kZT5jPC9jb2RlPgotICAgICAqIHRoYXQgYXJlIG5vdCBpbiA8Y29kZT5yZW1vdmU8L2NvZGU+LiBUaGUgY2FyZGluYWxpdHkgb2YgYW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBjYXJkaW5hbGl0eSBvZiA8Y29kZT5lPC9jb2RlPgotICAgICAqIGluIDxjb2RlPmNvbGxlY3Rpb248L2NvZGU+IHVubGVzcyA8Y29kZT5yZW1vdmU8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPmU8L2NvZGU+LCBpbiB3aGljaAotICAgICAqIGNhc2UgdGhlIGNhcmRpbmFsaXR5IGlzIHplcm8uIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3UgZG8gbm90IHdpc2ggdG8gbW9kaWZ5Ci0gICAgICogPGNvZGU+Y29sbGVjdGlvbjwvY29kZT4gYW5kIHRodXMgY2Fubm90IGNhbGwgPGNvZGU+Y29sbGVjdGlvbi5yZW1vdmVBbGwocmVtb3ZlKTs8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uICB0aGUgY29sbGVjdGlvbiBmcm9tIHdoaWNoIGl0ZW1zIGFyZSByZW1vdmVkIChpbiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbikKLSAgICAgKiBAcGFyYW0gcmVtb3ZlICB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXR1cm5lZCA8Y29kZT5jb2xsZWN0aW9uPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgb2YgPGNvZGU+YzwvY29kZT4gZXhjZXB0Ci0gICAgICogYW55IGVsZW1lbnRzIHRoYXQgYWxzbyBvY2N1ciBpbiA8Y29kZT5yZW1vdmU8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENvbGxlY3Rpb24gcmVtb3ZlKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZW1vdmUuY29udGFpbnMob2JqKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgbGlzdCBiYWNrZWQgYnkgdGhlIGdpdmVuIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogWW91IG11c3QgbWFudWFsbHkgc3luY2hyb25pemUgb24gdGhlIHJldHVybmVkIGJ1ZmZlcidzIGl0ZXJhdG9yIHRvIAotICAgICAqIGF2b2lkIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yOgotICAgICAqICAKLSAgICAgKiA8cHJlPgotICAgICAqIExpc3QgbGlzdCA9IExpc3RVdGlscy5zeW5jaHJvbml6ZWRMaXN0KG15TGlzdCk7Ci0gICAgICogc3luY2hyb25pemVkIChsaXN0KSB7Ci0gICAgICogICAgIEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgcHJvY2VzcyAoaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIHN5bmNocm9uaXplLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBsaXN0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gbGlzdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHN5bmNocm9uaXplZExpc3QoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHJldHVybiBTeW5jaHJvbml6ZWRMaXN0LmRlY29yYXRlKGxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmFja2VkIGJ5IHRoZSBnaXZlbiBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gbWFrZSB1bm1vZGlmaWFibGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gbGlzdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHVubW9kaWZpYWJsZUxpc3QoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVMaXN0LmRlY29yYXRlKGxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBsaXN0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGluIHRoZSBnaXZlbiBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0LgotICAgICAqIFRyeWluZyB0byBhZGQgYW4gaW52YWxpZCBvYmplY3QgcmVzdWx0cyBpbiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0gICAgICogSXQgaXMgaW1wb3J0YW50IG5vdCB0byB1c2UgdGhlIG9yaWdpbmFsIGxpc3QgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsCi0gICAgICogYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIGludmFsaWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIGZvciB0aGUgbGlzdCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBwcmVkaWNhdGVkIGxpc3QgYmFja2VkIGJ5IHRoZSBnaXZlbiBsaXN0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBMaXN0IG9yIFByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHByZWRpY2F0ZWRMaXN0KExpc3QgbGlzdCwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICByZXR1cm4gUHJlZGljYXRlZExpc3QuZGVjb3JhdGUobGlzdCwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHlwZWQgbGlzdCBiYWNrZWQgYnkgdGhlIGdpdmVuIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogT25seSBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGxpbWl0IHRvIGEgc3BlY2lmaWMgdHlwZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0eXBlICB0aGUgdHlwZSBvZiBvYmplY3RzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgbGlzdAotICAgICAqIEByZXR1cm4gYSB0eXBlZCBsaXN0IGJhY2tlZCBieSB0aGUgc3BlY2lmaWVkIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgdHlwZWRMaXN0KExpc3QgbGlzdCwgQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gVHlwZWRMaXN0LmRlY29yYXRlKGxpc3QsIHR5cGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHJhbnNmb3JtZWQgbGlzdCBiYWNrZWQgYnkgdGhlIGdpdmVuIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBvYmplY3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIHRyYW5zZm9ybWVyIGFzIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgICAqIExpc3QuIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBsaXN0IGFmdGVyIGludm9raW5nIHRoaXMgCi0gICAgICogbWV0aG9kLCBhcyBpdCBpcyBhIGJhY2tkb29yIGZvciBhZGRpbmcgdW50cmFuc2Zvcm1lZCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIHByZWRpY2F0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIGZvciB0aGUgbGlzdCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lZCBsaXN0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gbGlzdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgTGlzdCBvciBUcmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHRyYW5zZm9ybWVkTGlzdChMaXN0IGxpc3QsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lZExpc3QuZGVjb3JhdGUobGlzdCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgImxhenkiIGxpc3Qgd2hvc2UgZWxlbWVudHMgd2lsbCBiZSBjcmVhdGVkIG9uIGRlbWFuZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoZSBpbmRleCBwYXNzZWQgdG8gdGhlIHJldHVybmVkIGxpc3QncyB7QGxpbmsgTGlzdCNnZXQoaW50KSBnZXR9Ci0gICAgICogbWV0aG9kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGlzdCdzIHNpemUsIHRoZW4gdGhlIGZhY3Rvcnkgd2lsbCBiZSB1c2VkCi0gICAgICogdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgdGhhdCBvYmplY3Qgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGF0IGluZGV4LgotICAgICAqIDxwPgotICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgKgotICAgICAqIDxwcmU+Ci0gICAgICogRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKSB7Ci0gICAgICogICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotICAgICAqICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7Ci0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogTGlzdCBsYXp5ID0gTGlzdFV0aWxzLmxhenlMaXN0KG5ldyBBcnJheUxpc3QoKSwgZmFjdG9yeSk7Ci0gICAgICogT2JqZWN0IG9iaiA9IGxhenkuZ2V0KDMpOwotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQWZ0ZXIgdGhlIGFib3ZlIGNvZGUgaXMgZXhlY3V0ZWQsIDxjb2RlPm9iajwvY29kZT4gd2lsbCBjb250YWluCi0gICAgICogYSBuZXcgPGNvZGU+RGF0ZTwvY29kZT4gaW5zdGFuY2UuICBGdXJ0aGVybW9yZSwgdGhhdCA8Y29kZT5EYXRlPC9jb2RlPgotICAgICAqIGluc3RhbmNlIGlzIHRoZSBmb3VydGggZWxlbWVudCBpbiB0aGUgbGlzdC4gIFRoZSBmaXJzdCwgc2Vjb25kLCAKLSAgICAgKiBhbmQgdGhpcmQgZWxlbWVudCBhcmUgYWxsIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBtYWtlIGxhenksIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgdGhlIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBvYmplY3RzLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIGxhenkgbGlzdCBiYWNrZWQgYnkgdGhlIGdpdmVuIGxpc3QKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIExpc3Qgb3IgRmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGxhenlMaXN0KExpc3QgbGlzdCwgRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBMYXp5TGlzdC5kZWNvcmF0ZShsaXN0LCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZml4ZWQtc2l6ZWQgbGlzdCBiYWNrZWQgYnkgdGhlIGdpdmVuIGxpc3QuCi0gICAgICogRWxlbWVudHMgbWF5IG5vdCBiZSBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHJldHVybmVkIGxpc3QsIGJ1dCAKLSAgICAgKiBleGlzdGluZyBlbGVtZW50cyBjYW4gYmUgY2hhbmdlZCAoZm9yIGluc3RhbmNlLCB2aWEgdGhlIAotICAgICAqIHtAbGluayBMaXN0I3NldChpbnQsT2JqZWN0KX0gbWV0aG9kKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB3aG9zZSBzaXplIHRvIGZpeCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBmaXhlZC1zaXplIGxpc3QgYmFja2VkIGJ5IHRoYXQgbGlzdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgTGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGZpeGVkU2l6ZUxpc3QoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHJldHVybiBGaXhlZFNpemVMaXN0LmRlY29yYXRlKGxpc3QpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL01hcEl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTWFwSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk4NWJhOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTWFwSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERlZmluZXMgYW4gaXRlcmF0b3IgdGhhdCBvcGVyYXRlcyBvdmVyIGEgPGNvZGU+TWFwPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBpcyBhIHNwZWNpYWwgdmVyc2lvbiBkZXNpZ25lZCBmb3IgbWFwcy4gSXQgY2FuIGJlIG1vcmUKLSAqIGVmZmljaWVudCB0byB1c2UgdGhpcyByYXRoZXIgdGhhbiBhbiBlbnRyeSBzZXQgaXRlcmF0b3Igd2hlcmUgdGhlIG9wdGlvbgotICogaXMgYXZhaWxhYmxlLCBhbmQgaXQgaXMgY2VydGFpbmx5IG1vcmUgY29udmVuaWVudC4KLSAqIDxwPgotICogQSBtYXAgdGhhdCBwcm92aWRlcyB0aGlzIGludGVyZmFjZSBtYXkgbm90IGhvbGQgdGhlIGRhdGEgaW50ZXJuYWxseSB1c2luZwotICogTWFwIEVudHJ5IG9iamVjdHMsIHRodXMgdGhpcyBpbnRlcmZhY2UgY2FuIGF2b2lkIGxvdHMgb2Ygb2JqZWN0IGNyZWF0aW9uLgotICogPHA+Ci0gKiBJbiB1c2UsIHRoaXMgaXRlcmF0b3IgaXRlcmF0ZXMgdGhyb3VnaCB0aGUga2V5cyBpbiB0aGUgbWFwLiBBZnRlciBlYWNoIGNhbGwKLSAqIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sIHRoZSA8Y29kZT5nZXRWYWx1ZSgpPC9jb2RlPiBtZXRob2QgcHJvdmlkZXMgZGlyZWN0Ci0gKiBhY2Nlc3MgdG8gdGhlIHZhbHVlLiBUaGUgdmFsdWUgY2FuIGFsc28gYmUgc2V0IHVzaW5nIDxjb2RlPnNldFZhbHVlKCk8L2NvZGU+LgotICogPHByZT4KLSAqIE1hcEl0ZXJhdG9yIGl0ID0gbWFwLm1hcEl0ZXJhdG9yKCk7Ci0gKiB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gKiAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gKiAgIE9iamVjdCB2YWx1ZSA9IGl0LmdldFZhbHVlKCk7Ci0gKiAgIGl0LnNldFZhbHVlKG5ld1ZhbHVlKTsKLSAqIH0KLSAqIDwvcHJlPgotICogIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcEl0ZXJhdG9yIGV4dGVuZHMgSXRlcmF0b3IgewotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlcmUgYXJlIG1vcmUgZW50cmllcyBzdGlsbCB0byBiZSBpdGVyYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZXJhdG9yIGhhcyBtb3JlIGVsZW1lbnRzCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNOZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IDxlbT5rZXk8L2VtPiBmcm9tIHRoZSA8Y29kZT5NYXA8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBrZXkgaW4gdGhlIGl0ZXJhdGlvbgotICAgICAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZAotICAgICAqLwotICAgIE9iamVjdCBuZXh0KCk7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBrZXksIHdoaWNoIGlzIHRoZSBrZXkgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbAotICAgICAqIHRvIDxjb2RlPm5leHQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGtleQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPm5leHQoKTwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0S2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlLCB3aGljaCBpcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXN0IGtleQotICAgICAqIHJldHVybmVkIGJ5IDxjb2RlPm5leHQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+bmV4dCgpPC9jb2RlPiBoYXMgbm90IHlldCBiZWVuIGNhbGxlZAotICAgICAqLwotICAgIE9iamVjdCBnZXRWYWx1ZSgpOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGxhc3QgcmV0dXJuZWQga2V5IGZyb20gdGhlIHVuZGVybHlpbmcgPGNvZGU+TWFwPC9jb2RlPiAob3B0aW9uYWwgb3BlcmF0aW9uKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGNhbGwgdG8gPGNvZGU+bmV4dCgpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPm5leHQoKTwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5yZW1vdmUoKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKLSAgICAgKiAgc2luY2UgdGhlIGxhc3QgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+Ci0gICAgICovCi0gICAgdm9pZCByZW1vdmUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQga2V5IChvcHRpb25hbCBvcGVyYXRpb24pLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHNldFZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPm5leHQoKTwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5yZW1vdmUoKTwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIHNpbmNlIHRoZQotICAgICAqICBsYXN0IGNhbGwgdG8gPGNvZGU+bmV4dCgpPC9jb2RlPgotICAgICAqLwotICAgIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTWFwVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NYXBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMGJmZTU3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NYXBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5GaXhlZFNpemVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5GaXhlZFNpemVTb3J0ZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MYXp5TWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTGF6eVNvcnRlZE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxpc3RPcmRlcmVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuTXVsdGlWYWx1ZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLlByZWRpY2F0ZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5QcmVkaWNhdGVkU29ydGVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuVHJhbnNmb3JtZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5UcmFuc2Zvcm1lZFNvcnRlZE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLlR5cGVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuVHlwZWRTb3J0ZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5Vbm1vZGlmaWFibGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5Vbm1vZGlmaWFibGVTb3J0ZWRNYXA7Ci0KLS8qKiAKLSAqIFByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBhbmQgZGVjb3JhdG9ycyBmb3IKLSAqIHtAbGluayBNYXB9IGFuZCB7QGxpbmsgU29ydGVkTWFwfSBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHZhcmlvdXMgdHlwZSBzYWZlIG1ldGhvZHMKLSAqIGFzIHdlbGwgYXMgb3RoZXIgdXNlZnVsIGZlYXR1cmVzIGxpa2UgZGVlcCBjb3B5aW5nLgotICogPHA+Ci0gKiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZGVjb3JhdG9yczoKLSAqCi0gKiAgPHVsPgotICogIDxsaT57QGxpbmsgI2ZpeGVkU2l6ZU1hcChNYXApfQotICogIDxsaT57QGxpbmsgI2ZpeGVkU2l6ZVNvcnRlZE1hcChTb3J0ZWRNYXApfQotICogIDxsaT57QGxpbmsgI2xhenlNYXAoTWFwLEZhY3RvcnkpfQotICogIDxsaT57QGxpbmsgI2xhenlNYXAoTWFwLFRyYW5zZm9ybWVyKX0KLSAqICA8bGk+e0BsaW5rICNsYXp5U29ydGVkTWFwKFNvcnRlZE1hcCxGYWN0b3J5KX0KLSAqICA8bGk+e0BsaW5rICNsYXp5U29ydGVkTWFwKFNvcnRlZE1hcCxUcmFuc2Zvcm1lcil9Ci0gKiAgPGxpPntAbGluayAjcHJlZGljYXRlZE1hcChNYXAsUHJlZGljYXRlLFByZWRpY2F0ZSl9Ci0gKiAgPGxpPntAbGluayAjcHJlZGljYXRlZFNvcnRlZE1hcChTb3J0ZWRNYXAsUHJlZGljYXRlLFByZWRpY2F0ZSl9Ci0gKiAgPGxpPntAbGluayAjdHJhbnNmb3JtZWRNYXAoTWFwLCBUcmFuc2Zvcm1lciwgVHJhbnNmb3JtZXIpfQotICogIDxsaT57QGxpbmsgI3RyYW5zZm9ybWVkU29ydGVkTWFwKFNvcnRlZE1hcCwgVHJhbnNmb3JtZXIsIFRyYW5zZm9ybWVyKX0KLSAqICA8bGk+e0BsaW5rICN0eXBlZE1hcChNYXAsIENsYXNzLCBDbGFzcyl9Ci0gKiAgPGxpPntAbGluayAjdHlwZWRTb3J0ZWRNYXAoU29ydGVkTWFwLCBDbGFzcywgQ2xhc3MpfQotICogIDxsaT57QGxpbmsgI211bHRpVmFsdWVNYXAoIE1hcCApfQotICogIDxsaT57QGxpbmsgI211bHRpVmFsdWVNYXAoIE1hcCwgQ2xhc3MgKX0KLSAqICA8bGk+e0BsaW5rICNtdWx0aVZhbHVlTWFwKCBNYXAsIEZhY3RvcnkgKX0KLSAqICA8L3VsPgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDEuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pc3NpbUBua3N5c3RlbXMuY29tIj5OaXNzaW0gS2FycGVuc3RlaW48L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprbmllbHNlbkBhcGFjaGUub3JnIj5LYXNwZXIgTmllbHNlbjwvYT4KLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBNYXR0aGV3IEhhd3Rob3JuZQotICogQGF1dGhvciBBcnVuIE1hbW1lbiBUaG9tYXMKLSAqIEBhdXRob3IgSmFuZWsgQm9ndWNraQotICogQGF1dGhvciBNYXggUnlkYWhsIEFuZGVyc2VuCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzplcXVpbnVzMTAwQGhvdG1haWwuY29tIj5Bc2h3aW4gUzwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpjYXJtYW5AYXBhY2hlLm9yZyI+SmFtZXMgQ2FybWFuPC9hPgotICogQGF1dGhvciBOZWlsIE8nVG9vbGUKLSAqLwotcHVibGljIGNsYXNzIE1hcFV0aWxzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSB1bm1vZGlmaWFibGUgbWFwLgotICAgICAqIFRoaXMgd2FzIG5vdCBwcm92aWRlZCBpbiBKREsxLjIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgRU1QVFlfTUFQID0gVW5tb2RpZmlhYmxlTWFwLmRlY29yYXRlKG5ldyBIYXNoTWFwKDEpKTsKLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSB1bm1vZGlmaWFibGUgc29ydGVkIG1hcC4KLSAgICAgKiBUaGlzIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgSkRLLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU29ydGVkTWFwIEVNUFRZX1NPUlRFRF9NQVAgPSBVbm1vZGlmaWFibGVTb3J0ZWRNYXAuZGVjb3JhdGUobmV3IFRyZWVNYXAoKSk7Ci0gICAgLyoqCi0gICAgICogU3RyaW5nIHVzZWQgdG8gaW5kZW50IHRoZSB2ZXJib3NlIGFuZCBkZWJ1ZyBNYXAgcHJpbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRfU1RSSU5HID0gIiAgICAiOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+TWFwVXRpbHM8L2NvZGU+IHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgaW5zdGFudGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBNYXBVdGlscygpIHsKLSAgICB9ICAgIAotICAgIAotICAgIC8vIFR5cGUgc2FmZSBnZXR0ZXJzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRPYmplY3QoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIFN0cmluZyBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgU3RyaW5nIGlzIG9idGFpbmVkIHZpYSA8Y29kZT50b1N0cmluZzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBTdHJpbmcsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGFuc3dlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBCb29sZWFuIGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIDxjb2RlPkJvb2xlYW48L2NvZGU+IGl0IGlzIHJldHVybmVkIGRpcmVjdGx5LgotICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gYW5kIGl0IGVxdWFscyAndHJ1ZScgaWdub3JpbmcgY2FzZQotICAgICAqIHRoZW4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgcmV0dXJuZWQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgPGNvZGU+TnVtYmVyPC9jb2RlPiBhbiBpbnRlZ2VyIHplcm8gdmFsdWUgcmV0dXJucwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgbm9uLXplcm8gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiBPdGhlcndpc2UsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgQm9vbGVhbiwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihmaW5hbCBNYXAgbWFwLCBmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChhbnN3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgYW5zd2VyOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlciBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4oKFN0cmluZykgYW5zd2VyKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG4gPSAoTnVtYmVyKSBhbnN3ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobi5pbnRWYWx1ZSgpICE9IDApID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIE51bWJlciBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSA8Y29kZT5OdW1iZXI8L2NvZGU+IGl0IGlzIHJldHVybmVkIGRpcmVjdGx5LgotICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gaXQgaXMgY29udmVydGVkIHVzaW5nCi0gICAgICoge0BsaW5rIE51bWJlckZvcm1hdCNwYXJzZShTdHJpbmcpfSBvbiB0aGUgc3lzdGVtIGRlZmF1bHQgZm9ybWF0dGVyCi0gICAgICogcmV0dXJuaW5nIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLgotICAgICAqIE90aGVyd2lzZSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBOdW1iZXIsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOdW1iZXIgZ2V0TnVtYmVyKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGFuc3dlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFuc3dlciBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE51bWJlcikgYW5zd2VyOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlciBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBhbnN3ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCkucGFyc2UodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgQnl0ZSBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgQnl0ZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIEJ5dGUsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCeXRlIGdldEJ5dGUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBOdW1iZXIgYW5zd2VyID0gZ2V0TnVtYmVyKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIgaW5zdGFuY2VvZiBCeXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJ5dGUpIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEJ5dGUoYW5zd2VyLmJ5dGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hvcnQgZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIFNob3J0IGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgU2hvcnQsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTaG9ydCBnZXRTaG9ydChmaW5hbCBNYXAgbWFwLCBmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIE51bWJlciBhbnN3ZXIgPSBnZXROdW1iZXIobWFwLCBrZXkpOwotICAgICAgICBpZiAoYW5zd2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKGFuc3dlciBpbnN0YW5jZW9mIFNob3J0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKFNob3J0KSBhbnN3ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChhbnN3ZXIuc2hvcnRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgSW50ZWdlciBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgSW50ZWdlciBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIEludGVnZXIsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldEludGVnZXIoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBOdW1iZXIgYW5zd2VyID0gZ2V0TnVtYmVyKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoYW5zd2VyLmludFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBMb25nIGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLgotICAgICAqIDxwPgotICAgICAqIFRoZSBMb25nIGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgTG9uZywgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExvbmcgZ2V0TG9uZyhmaW5hbCBNYXAgbWFwLCBmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIE51bWJlciBhbnN3ZXIgPSBnZXROdW1iZXIobWFwLCBrZXkpOwotICAgICAgICBpZiAoYW5zd2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKGFuc3dlciBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoTG9uZykgYW5zd2VyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTG9uZyhhbnN3ZXIubG9uZ1ZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBGbG9hdCBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgRmxvYXQgaXMgb2J0YWluZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiB7QGxpbmsgI2dldE51bWJlcihNYXAsT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBGbG9hdCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZsb2F0IGdldEZsb2F0KGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgTnVtYmVyIGFuc3dlciA9IGdldE51bWJlcihtYXAsIGtleSk7Ci0gICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyIGluc3RhbmNlb2YgRmxvYXQpIHsKLSAgICAgICAgICAgIHJldHVybiAoRmxvYXQpIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGFuc3dlci5mbG9hdFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBEb3VibGUgZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIERvdWJsZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIERvdWJsZSwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvdWJsZSBnZXREb3VibGUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBOdW1iZXIgYW5zd2VyID0gZ2V0TnVtYmVyKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIgaW5zdGFuY2VvZiBEb3VibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRG91YmxlKSBhbnN3ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYW5zd2VyLmRvdWJsZVZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBNYXAgZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIHNwZWNpZmllZCBtYXAgaXMgbm90IGEgTWFwIHRoZW4KLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIE1hcCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRNYXAoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoYW5zd2VyICE9IG51bGwgJiYgYW5zd2VyIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNYXApIGFuc3dlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBUeXBlIHNhZmUgZ2V0dGVycyB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIG1hcCwgY29udmVydGluZyBudWxsIGludG8gdGhlCi0gICAgICogIGdpdmVuIGRlZmF1bHQgdmFsdWUuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgb3JpZ2luYWwgdmFsdWUKLSAgICAgKiAgICBpcyBudWxsIG9yIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE9iamVjdCggTWFwIG1hcCwgT2JqZWN0IGtleSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSApIHsKLSAgICAgICAgaWYgKCBtYXAgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtYXAuZ2V0KCBrZXkgKTsKLSAgICAgICAgICAgIGlmICggYW5zd2VyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb29rcyB1cCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBtYXAsIGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBpbnRvCi0gICAgICogIGEgc3RyaW5nLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBzdHJpbmcsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgCi0gICAgICogICAgb3JpZ2luYWwgdmFsdWUgaXMgbnVsbCwgdGhlIG1hcCBpcyBudWxsIG9yIHRoZSBzdHJpbmcgY29udmVyc2lvbgotICAgICAqICAgIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCBNYXAgbWFwLCBPYmplY3Qga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlICkgewotICAgICAgICBTdHJpbmcgYW5zd2VyID0gZ2V0U3RyaW5nKCBtYXAsIGtleSApOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIG1hcCwgY29udmVydGluZyB0aGUgcmVzdWx0IGludG8KLSAgICAgKiAgYSBib29sZWFuLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBib29sZWFuLCBvciBkZWZhdWx0VmFsdWUgaWYgdGhlIAotICAgICAqICAgIG9yaWdpbmFsIHZhbHVlIGlzIG51bGwsIHRoZSBtYXAgaXMgbnVsbCBvciB0aGUgYm9vbGVhbiBjb252ZXJzaW9uCi0gICAgICogICAgZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhbiggTWFwIG1hcCwgT2JqZWN0IGtleSwgQm9vbGVhbiBkZWZhdWx0VmFsdWUgKSB7Ci0gICAgICAgIEJvb2xlYW4gYW5zd2VyID0gZ2V0Qm9vbGVhbiggbWFwLCBrZXkgKTsKLSAgICAgICAgaWYgKCBhbnN3ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb29rcyB1cCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBtYXAsIGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBpbnRvCi0gICAgICogIGEgbnVtYmVyLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBudW1iZXIsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgCi0gICAgICogICAgb3JpZ2luYWwgdmFsdWUgaXMgbnVsbCwgdGhlIG1hcCBpcyBudWxsIG9yIHRoZSBudW1iZXIgY29udmVyc2lvbgotICAgICAqICAgIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOdW1iZXIgZ2V0TnVtYmVyKCBNYXAgbWFwLCBPYmplY3Qga2V5LCBOdW1iZXIgZGVmYXVsdFZhbHVlICkgewotICAgICAgICBOdW1iZXIgYW5zd2VyID0gZ2V0TnVtYmVyKCBtYXAsIGtleSApOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIG1hcCwgY29udmVydGluZyB0aGUgcmVzdWx0IGludG8KLSAgICAgKiAgYSBieXRlLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBudW1iZXIsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgCi0gICAgICogICAgb3JpZ2luYWwgdmFsdWUgaXMgbnVsbCwgdGhlIG1hcCBpcyBudWxsIG9yIHRoZSBudW1iZXIgY29udmVyc2lvbgotICAgICAqICAgIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCeXRlIGdldEJ5dGUoIE1hcCBtYXAsIE9iamVjdCBrZXksIEJ5dGUgZGVmYXVsdFZhbHVlICkgewotICAgICAgICBCeXRlIGFuc3dlciA9IGdldEJ5dGUoIG1hcCwga2V5ICk7Ci0gICAgICAgIGlmICggYW5zd2VyID09IG51bGwgKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9va3MgdXAgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gbWFwLCBjb252ZXJ0aW5nIHRoZSByZXN1bHQgaW50bwotICAgICAqICBhIHNob3J0LCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBudW1iZXIsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgCi0gICAgICogICAgb3JpZ2luYWwgdmFsdWUgaXMgbnVsbCwgdGhlIG1hcCBpcyBudWxsIG9yIHRoZSBudW1iZXIgY29udmVyc2lvbgotICAgICAqICAgIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTaG9ydCBnZXRTaG9ydCggTWFwIG1hcCwgT2JqZWN0IGtleSwgU2hvcnQgZGVmYXVsdFZhbHVlICkgewotICAgICAgICBTaG9ydCBhbnN3ZXIgPSBnZXRTaG9ydCggbWFwLCBrZXkgKTsKLSAgICAgICAgaWYgKCBhbnN3ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb29rcyB1cCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBtYXAsIGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBpbnRvCi0gICAgICogIGFuIGludGVnZXIsIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB0aGUgY29udmVyc2lvbiBmYWlscy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbWFwICB0aGUgbWFwIHdob3NlIHZhbHVlIHRvIGxvb2sgdXAKLSAgICAgKiAgQHBhcmFtIGtleSAgdGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbG9vayB1cCBpbiB0aGF0IG1hcAotICAgICAqICBAcGFyYW0gZGVmYXVsdFZhbHVlICB3aGF0IHRvIHJldHVybiBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBpZiB0aGUKLSAgICAgKiAgICAgY29udmVyc2lvbiBmYWlscwotICAgICAqICBAcmV0dXJuICB0aGUgdmFsdWUgaW4gdGhlIG1hcCBhcyBhIG51bWJlciwgb3IgZGVmYXVsdFZhbHVlIGlmIHRoZSAKLSAgICAgKiAgICBvcmlnaW5hbCB2YWx1ZSBpcyBudWxsLCB0aGUgbWFwIGlzIG51bGwgb3IgdGhlIG51bWJlciBjb252ZXJzaW9uCi0gICAgICogICAgZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0SW50ZWdlciggTWFwIG1hcCwgT2JqZWN0IGtleSwgSW50ZWdlciBkZWZhdWx0VmFsdWUgKSB7Ci0gICAgICAgIEludGVnZXIgYW5zd2VyID0gZ2V0SW50ZWdlciggbWFwLCBrZXkgKTsKLSAgICAgICAgaWYgKCBhbnN3ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb29rcyB1cCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBtYXAsIGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBpbnRvCi0gICAgICogIGEgbG9uZywgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHRoZSBjb252ZXJzaW9uIGZhaWxzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2UgdmFsdWUgdG8gbG9vayB1cAotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IG9mIHRoZSB2YWx1ZSB0byBsb29rIHVwIGluIHRoYXQgbWFwCi0gICAgICogIEBwYXJhbSBkZWZhdWx0VmFsdWUgIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogIEByZXR1cm4gIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIGFzIGEgbnVtYmVyLCBvciBkZWZhdWx0VmFsdWUgaWYgdGhlIAotICAgICAqICAgIG9yaWdpbmFsIHZhbHVlIGlzIG51bGwsIHRoZSBtYXAgaXMgbnVsbCBvciB0aGUgbnVtYmVyIGNvbnZlcnNpb24KLSAgICAgKiAgICBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9uZyBnZXRMb25nKCBNYXAgbWFwLCBPYmplY3Qga2V5LCBMb25nIGRlZmF1bHRWYWx1ZSApIHsKLSAgICAgICAgTG9uZyBhbnN3ZXIgPSBnZXRMb25nKCBtYXAsIGtleSApOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIG1hcCwgY29udmVydGluZyB0aGUgcmVzdWx0IGludG8KLSAgICAgKiAgYSBmbG9hdCwgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHRoZSBjb252ZXJzaW9uIGZhaWxzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2UgdmFsdWUgdG8gbG9vayB1cAotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IG9mIHRoZSB2YWx1ZSB0byBsb29rIHVwIGluIHRoYXQgbWFwCi0gICAgICogIEBwYXJhbSBkZWZhdWx0VmFsdWUgIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogIEByZXR1cm4gIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIGFzIGEgbnVtYmVyLCBvciBkZWZhdWx0VmFsdWUgaWYgdGhlIAotICAgICAqICAgIG9yaWdpbmFsIHZhbHVlIGlzIG51bGwsIHRoZSBtYXAgaXMgbnVsbCBvciB0aGUgbnVtYmVyIGNvbnZlcnNpb24KLSAgICAgKiAgICBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmxvYXQgZ2V0RmxvYXQoIE1hcCBtYXAsIE9iamVjdCBrZXksIEZsb2F0IGRlZmF1bHRWYWx1ZSApIHsKLSAgICAgICAgRmxvYXQgYW5zd2VyID0gZ2V0RmxvYXQoIG1hcCwga2V5ICk7Ci0gICAgICAgIGlmICggYW5zd2VyID09IG51bGwgKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9va3MgdXAgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gbWFwLCBjb252ZXJ0aW5nIHRoZSByZXN1bHQgaW50bwotICAgICAqICBhIGRvdWJsZSwgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHRoZSBjb252ZXJzaW9uIGZhaWxzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2UgdmFsdWUgdG8gbG9vayB1cAotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IG9mIHRoZSB2YWx1ZSB0byBsb29rIHVwIGluIHRoYXQgbWFwCi0gICAgICogIEBwYXJhbSBkZWZhdWx0VmFsdWUgIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogIEByZXR1cm4gIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIGFzIGEgbnVtYmVyLCBvciBkZWZhdWx0VmFsdWUgaWYgdGhlIAotICAgICAqICAgIG9yaWdpbmFsIHZhbHVlIGlzIG51bGwsIHRoZSBtYXAgaXMgbnVsbCBvciB0aGUgbnVtYmVyIGNvbnZlcnNpb24KLSAgICAgKiAgICBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG91YmxlIGdldERvdWJsZSggTWFwIG1hcCwgT2JqZWN0IGtleSwgRG91YmxlIGRlZmF1bHRWYWx1ZSApIHsKLSAgICAgICAgRG91YmxlIGFuc3dlciA9IGdldERvdWJsZSggbWFwLCBrZXkgKTsKLSAgICAgICAgaWYgKCBhbnN3ZXIgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIGFuc3dlciA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb29rcyB1cCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBtYXAsIGNvbnZlcnRpbmcgdGhlIHJlc3VsdCBpbnRvCi0gICAgICogIGEgbWFwLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSB2YWx1ZSB0byBsb29rIHVwCi0gICAgICogIEBwYXJhbSBrZXkgIHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAgaW4gdGhhdCBtYXAKLSAgICAgKiAgQHBhcmFtIGRlZmF1bHRWYWx1ZSAgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiAgQHJldHVybiAgdGhlIHZhbHVlIGluIHRoZSBtYXAgYXMgYSBudW1iZXIsIG9yIGRlZmF1bHRWYWx1ZSBpZiB0aGUgCi0gICAgICogICAgb3JpZ2luYWwgdmFsdWUgaXMgbnVsbCwgdGhlIG1hcCBpcyBudWxsIG9yIHRoZSBtYXAgY29udmVyc2lvbgotICAgICAqICAgIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0TWFwKCBNYXAgbWFwLCBPYmplY3Qga2V5LCBNYXAgZGVmYXVsdFZhbHVlICkgewotICAgICAgICBNYXAgYW5zd2VyID0gZ2V0TWFwKCBtYXAsIGtleSApOwotICAgICAgICBpZiAoIGFuc3dlciA9PSBudWxsICkgewotICAgICAgICAgICAgYW5zd2VyID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotICAgIAotCi0gICAgLy8gVHlwZSBzYWZlIHByaW1pdGl2ZSBnZXR0ZXJzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJvb2xlYW4gZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gaXRzIHZhbHVlIGlzIHJldHVybmVkLgotICAgICAqIElmIHRoZSB2YWx1ZSBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gYW5kIGl0IGVxdWFscyAndHJ1ZScgaWdub3JpbmcgY2FzZQotICAgICAqIHRoZW4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgcmV0dXJuZWQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgPGNvZGU+TnVtYmVyPC9jb2RlPiBhbiBpbnRlZ2VyIHplcm8gdmFsdWUgcmV0dXJucwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgbm9uLXplcm8gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiBPdGhlcndpc2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIEJvb2xlYW4sIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBCb29sZWFuIGJvb2xlYW5PYmplY3QgPSBnZXRCb29sZWFuKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGJvb2xlYW5PYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBib29sZWFuT2JqZWN0LmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBieXRlIGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLgotICAgICAqIDxwPgotICAgICAqIFRoZSBieXRlIGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgYnl0ZSwgPGNvZGU+MDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgQnl0ZSBieXRlT2JqZWN0ID0gZ2V0Qnl0ZShtYXAsIGtleSk7Ci0gICAgICAgIGlmIChieXRlT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBieXRlT2JqZWN0LmJ5dGVWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzaG9ydCBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2hvcnQgaXMgb2J0YWluZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiB7QGxpbmsgI2dldE51bWJlcihNYXAsT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBzaG9ydCwgPGNvZGU+MDwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldFNob3J0VmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBTaG9ydCBzaG9ydE9iamVjdCA9IGdldFNob3J0KG1hcCwga2V5KTsKLSAgICAgICAgaWYgKHNob3J0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG9ydE9iamVjdC5zaG9ydFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnQgZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGludCBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhbiBpbnQsIDxjb2RlPjA8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBJbnRlZ2VyIGludGVnZXJPYmplY3QgPSBnZXRJbnRlZ2VyKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGludGVnZXJPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludGVnZXJPYmplY3QuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbG9uZyBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbG9uZyBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIGxvbmcsIDxjb2RlPjBMPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nVmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBMb25nIGxvbmdPYmplY3QgPSBnZXRMb25nKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGxvbmdPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDBMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb25nT2JqZWN0LmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBmbG9hdCBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxvYXQgaXMgb2J0YWluZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiB7QGxpbmsgI2dldE51bWJlcihNYXAsT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBmbG9hdCwgPGNvZGU+MC4wRjwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IGdldEZsb2F0VmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICBGbG9hdCBmbG9hdE9iamVjdCA9IGdldEZsb2F0KG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGZsb2F0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwZjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmxvYXRPYmplY3QuZmxvYXRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBkb3VibGUgZnJvbSBhIE1hcCBpbiBhIG51bGwtc2FmZSBtYW5uZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRvdWJsZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIGRvdWJsZSwgPGNvZGU+MC4wPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldERvdWJsZVZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgRG91YmxlIGRvdWJsZU9iamVjdCA9IGdldERvdWJsZShtYXAsIGtleSk7Ci0gICAgICAgIGlmIChkb3VibGVPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDBkOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb3VibGVPYmplY3QuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvLyBUeXBlIHNhZmUgcHJpbWl0aXZlIGdldHRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgYSBib29sZWFuIGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLAotICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB0aGUgY29udmVyc2lvbiBmYWlscy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiBpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICAgICogSWYgdGhlIHZhbHVlIGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBhbmQgaXQgZXF1YWxzICd0cnVlJyBpZ25vcmluZyBjYXNlCi0gICAgICogdGhlbiA8Y29kZT50cnVlPC9jb2RlPiBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSA8Y29kZT5OdW1iZXI8L2NvZGU+IGFuIGludGVnZXIgemVybyB2YWx1ZSByZXR1cm5zCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCBub24temVybyByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIE90aGVyd2lzZSwgPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIEJvb2xlYW4sIDxjb2RlPmRlZmF1bHRWYWx1ZTwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIEJvb2xlYW4gYm9vbGVhbk9iamVjdCA9IGdldEJvb2xlYW4obWFwLCBrZXkpOwotICAgICAgICBpZiAoYm9vbGVhbk9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBib29sZWFuT2JqZWN0LmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBieXRlIGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLAotICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB0aGUgY29udmVyc2lvbiBmYWlscy4gICAgIAotICAgICAqIDxwPgotICAgICAqIFRoZSBieXRlIGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgYnl0ZSwgPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBnZXRCeXRlVmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSwgYnl0ZSBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgQnl0ZSBieXRlT2JqZWN0ID0gZ2V0Qnl0ZShtYXAsIGtleSk7Ci0gICAgICAgIGlmIChieXRlT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ5dGVPYmplY3QuYnl0ZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHNob3J0IGZyb20gYSBNYXAgaW4gYSBudWxsLXNhZmUgbWFubmVyLAotICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB0aGUgY29udmVyc2lvbiBmYWlscy4gICAgIAotICAgICAqIDxwPgotICAgICAqIFRoZSBzaG9ydCBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIHNob3J0LCA8Y29kZT5kZWZhdWx0VmFsdWU8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXksIHNob3J0IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBTaG9ydCBzaG9ydE9iamVjdCA9IGdldFNob3J0KG1hcCwga2V5KTsKLSAgICAgICAgaWYgKHNob3J0T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3J0T2JqZWN0LnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGludCBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lciwKLSAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuICAgICAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgaW50IGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGFuIGludCwgPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEludFZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgSW50ZWdlciBpbnRlZ2VyT2JqZWN0ID0gZ2V0SW50ZWdlcihtYXAsIGtleSk7Ci0gICAgICAgIGlmIChpbnRlZ2VyT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludGVnZXJPYmplY3QuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbG9uZyBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lciwKLSAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuICAgICAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbG9uZyBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZXN1bHRzIG9mIHtAbGluayAjZ2V0TnVtYmVyKE1hcCxPYmplY3QpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBsb29rIHVwCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGlmIHRoZQotICAgICAqICAgICBjb252ZXJzaW9uIGZhaWxzCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgaW4gdGhlIE1hcCBhcyBhIGxvbmcsIDxjb2RlPmRlZmF1bHRWYWx1ZTwvY29kZT4gaWYgbnVsbCBtYXAgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKGZpbmFsIE1hcCBtYXAsIGZpbmFsIE9iamVjdCBrZXksIGxvbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIExvbmcgbG9uZ09iamVjdCA9IGdldExvbmcobWFwLCBrZXkpOwotICAgICAgICBpZiAobG9uZ09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb25nT2JqZWN0LmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBmbG9hdCBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lciwKLSAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuICAgICAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxvYXQgaXMgb2J0YWluZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiB7QGxpbmsgI2dldE51bWJlcihNYXAsT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gbG9vayB1cAotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIHJldHVybiBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBpZiB0aGUKLSAgICAgKiAgICAgY29udmVyc2lvbiBmYWlscwotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBNYXAgYXMgYSBmbG9hdCwgPGNvZGU+ZGVmYXVsdFZhbHVlPC9jb2RlPiBpZiBudWxsIG1hcCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZShmaW5hbCBNYXAgbWFwLCBmaW5hbCBPYmplY3Qga2V5LCBmbG9hdCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgRmxvYXQgZmxvYXRPYmplY3QgPSBnZXRGbG9hdChtYXAsIGtleSk7Ci0gICAgICAgIGlmIChmbG9hdE9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmbG9hdE9iamVjdC5mbG9hdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGRvdWJsZSBmcm9tIGEgTWFwIGluIGEgbnVsbC1zYWZlIG1hbm5lciwKLSAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdGhlIGNvbnZlcnNpb24gZmFpbHMuICAgICAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZG91YmxlIGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNnZXROdW1iZXIoTWFwLE9iamVjdCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB1c2UKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgaWYgdGhlCi0gICAgICogICAgIGNvbnZlcnNpb24gZmFpbHMKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgTWFwIGFzIGEgZG91YmxlLCA8Y29kZT5kZWZhdWx0VmFsdWU8L2NvZGU+IGlmIG51bGwgbWFwIGlucHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoZmluYWwgTWFwIG1hcCwgZmluYWwgT2JqZWN0IGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBEb3VibGUgZG91YmxlT2JqZWN0ID0gZ2V0RG91YmxlKG1hcCwga2V5KTsKLSAgICAgICAgaWYgKGRvdWJsZU9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb3VibGVPYmplY3QuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJzaW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbmV3IFByb3BlcnRpZXMgb2JqZWN0IGluaXRpYWxpc2VkIHdpdGggdGhlIHZhbHVlcyBmcm9tIGEgTWFwLgotICAgICAqIEEgbnVsbCBpbnB1dCB3aWxsIHJldHVybiBhbiBlbXB0eSBwcm9wZXJ0aWVzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNvbnZlcnQgdG8gYSBQcm9wZXJ0aWVzIG9iamVjdCwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgdG9Qcm9wZXJ0aWVzKGZpbmFsIE1hcCBtYXApIHsKLSAgICAgICAgUHJvcGVydGllcyBhbnN3ZXIgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGFuc3dlci5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEhhc2hNYXAgdXNpbmcgZGF0YSBjb3BpZWQgZnJvbSBhIFJlc291cmNlQnVuZGxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSAgdGhlIHJlc291cmNlIGJ1bmRsZSB0byBjb252ZXJ0LCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNobWFwIGNvbnRhaW5pbmcgdGhlIGRhdGEKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBidW5kbGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIHRvTWFwKGZpbmFsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlKSB7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VCdW5kbGUuZ2V0S2V5cygpOwotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVzb3VyY2VCdW5kbGUuZ2V0T2JqZWN0KGtleSk7Ci0gICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLSAKLSAgICAvLyBQcmludGluZyBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBnaXZlbiBtYXAgd2l0aCBuaWNlIGxpbmUgYnJlYWtzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHByaW50cyBhIG5pY2VseSBmb3JtYXR0ZWQgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIE1hcC4KLSAgICAgKiBFYWNoIG1hcCBlbnRyeSB3aWxsIGJlIHByaW50ZWQgd2l0aCBrZXkgYW5kIHZhbHVlLgotICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIGEgTWFwLCByZWN1cnNpdmUgYmVoYXZpb3VyIG9jY3Vycy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBOT1QgdGhyZWFkLXNhZmUgaW4gYW55IHNwZWNpYWwgd2F5LiBZb3UgbXVzdCBtYW51YWxseQotICAgICAqIHN5bmNocm9uaXplIG9uIGVpdGhlciB0aGlzIGNsYXNzIG9yIHRoZSBzdHJlYW0gYXMgcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgc3RyZWFtIHRvIHByaW50IHRvLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGxhYmVsICBUaGUgbGFiZWwgdG8gYmUgdXNlZCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqICBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGxhYmVsIGlzIG5vdCBvdXRwdXQuCi0gICAgICogIEl0IHR5cGljYWxseSByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiBhIGJlYW4gb3Igc2ltaWxhci4KLSAgICAgKiBAcGFyYW0gbWFwICBUaGUgbWFwIHRvIHByaW50LCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgdGV4dCAnbnVsbCcgaXMgb3V0cHV0LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJib3NlUHJpbnQoCi0gICAgICAgIGZpbmFsIFByaW50U3RyZWFtIG91dCwKLSAgICAgICAgZmluYWwgT2JqZWN0IGxhYmVsLAotICAgICAgICBmaW5hbCBNYXAgbWFwKSB7Ci0KLSAgICAgICAgdmVyYm9zZVByaW50SW50ZXJuYWwob3V0LCBsYWJlbCwgbWFwLCBuZXcgQXJyYXlTdGFjaygpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBnaXZlbiBtYXAgd2l0aCBuaWNlIGxpbmUgYnJlYWtzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHByaW50cyBhIG5pY2VseSBmb3JtYXR0ZWQgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIE1hcC4KLSAgICAgKiBFYWNoIG1hcCBlbnRyeSB3aWxsIGJlIHByaW50ZWQgd2l0aCBrZXksIHZhbHVlIGFuZCB2YWx1ZSBjbGFzc25hbWUuCi0gICAgICogV2hlbiB0aGUgdmFsdWUgaXMgYSBNYXAsIHJlY3Vyc2l2ZSBiZWhhdmlvdXIgb2NjdXJzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIE5PVCB0aHJlYWQtc2FmZSBpbiBhbnkgc3BlY2lhbCB3YXkuIFlvdSBtdXN0IG1hbnVhbGx5Ci0gICAgICogc3luY2hyb25pemUgb24gZWl0aGVyIHRoaXMgY2xhc3Mgb3IgdGhlIHN0cmVhbSBhcyByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBzdHJlYW0gdG8gcHJpbnQgdG8sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbGFiZWwgIFRoZSBsYWJlbCB0byBiZSB1c2VkLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgbGFiZWwgaXMgbm90IG91dHB1dC4KLSAgICAgKiAgSXQgdHlwaWNhbGx5IHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIGEgYmVhbiBvciBzaW1pbGFyLgotICAgICAqIEBwYXJhbSBtYXAgIFRoZSBtYXAgdG8gcHJpbnQsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAgSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSB0ZXh0ICdudWxsJyBpcyBvdXRwdXQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnUHJpbnQoCi0gICAgICAgIGZpbmFsIFByaW50U3RyZWFtIG91dCwKLSAgICAgICAgZmluYWwgT2JqZWN0IGxhYmVsLAotICAgICAgICBmaW5hbCBNYXAgbWFwKSB7Ci0KLSAgICAgICAgdmVyYm9zZVByaW50SW50ZXJuYWwob3V0LCBsYWJlbCwgbWFwLCBuZXcgQXJyYXlTdGFjaygpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIHRvIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyBhcyBKYWthcnRhIENvbGxlY3Rpb25zIGRvZXMgbm90IGRlcGVuZCBvbiBsb2dnaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4ICB0aGUgZXhjZXB0aW9uIHRvIGxvZwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2dJbmZvKGZpbmFsIEV4Y2VwdGlvbiBleCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklORk86IEV4Y2VwdGlvbjogIiArIGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBwcm92aWRpbmcgZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rICNkZWJ1Z1ByaW50fSBhbmQgZm9yIAotICAgICAqIHtAbGluayAjdmVyYm9zZVByaW50fS4gIFRoaXMgcHJpbnRzIHRoZSBnaXZlbiBtYXAgd2l0aCBuaWNlIGxpbmUgYnJlYWtzLgotICAgICAqIElmIHRoZSBkZWJ1ZyBmbGFnIGlzIHRydWUsIGl0IGFkZGl0aW9uYWxseSBwcmludHMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCAKLSAgICAgKiB2YWx1ZS4gIElmIHRoZSBjb250ZW50cyBvZiBhIG1hcCBpbmNsdWRlIHRoZSBtYXAgaXRzZWxmLCB0aGVuIHRoZSB0ZXh0IAotICAgICAqIDxlbT4odGhpcyBNYXApPC9lbT4gaXMgcHJpbnRlZCBvdXQuICBJZiB0aGUgY29udGVudHMgaW5jbHVkZSBhIAotICAgICAqIHBhcmVudCBjb250YWluZXIgb2YgdGhlIG1hcCwgdGhlIHRoZSB0ZXh0IDxlbT4oYW5jZXN0b3JbaV0gTWFwKTwvZW0+IGlzIAotICAgICAqIHByaW50ZWQsIHdoZXJlIGkgYWN0dWFsbHkgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbGV2ZWxzIHdoaWNoIG11c3QgYmUgCi0gICAgICogdHJhdmVyc2VkIGluIHRoZSBzZXF1ZW50aWFsIGxpc3Qgb2YgYW5jZXN0b3JzIChlLmcuIGZhdGhlciwgZ3JhbmRmYXRoZXIsIAotICAgICAqIGdyZWF0LWdyYW5kZmF0aGVyLCBldGMpLiAgCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgc3RyZWFtIHRvIHByaW50IHRvCi0gICAgICogQHBhcmFtIGxhYmVsICB0aGUgbGFiZWwgdG8gYmUgdXNlZCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqICBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGxhYmVsIGlzIG5vdCBvdXRwdXQuCi0gICAgICogIEl0IHR5cGljYWxseSByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiBhIGJlYW4gb3Igc2ltaWxhci4KLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHByaW50LCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgdGV4dCAnbnVsbCcgaXMgb3V0cHV0Ci0gICAgICogQHBhcmFtIGxpbmVhZ2UgIGEgc3RhY2sgY29uc2lzdGluZyBvZiBhbnkgbWFwcyBpbiB3aGljaCB0aGUgcHJldmlvdXMgCi0gICAgICogIGFyZ3VtZW50IGlzIGNvbnRhaW5lZC4gVGhpcyBpcyBjaGVja2VkIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuCi0gICAgICogIHByaW50aW5nIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gZGVidWcgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHR5cGUgbmFtZXMgc2hvdWxkIGJlIG91dHB1dC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmJvc2VQcmludEludGVybmFsKAotICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBvdXQsCi0gICAgICAgIGZpbmFsIE9iamVjdCBsYWJlbCwKLSAgICAgICAgZmluYWwgTWFwIG1hcCwKLSAgICAgICAgZmluYWwgQXJyYXlTdGFjayBsaW5lYWdlLAotICAgICAgICBmaW5hbCBib29sZWFuIGRlYnVnKSB7Ci0gICAgICAgIAotICAgICAgICBwcmludEluZGVudChvdXQsIGxpbmVhZ2Uuc2l6ZSgpKTsKLQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGxhYmVsKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LnByaW50KGxhYmVsKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50SW5kZW50KG91dCwgbGluZWFnZS5zaXplKCkpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotCi0gICAgICAgIGxpbmVhZ2UucHVzaChtYXApOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGRLZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCBjaGlsZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZFZhbHVlIGluc3RhbmNlb2YgTWFwICYmICFsaW5lYWdlLmNvbnRhaW5zKGNoaWxkVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgdmVyYm9zZVByaW50SW50ZXJuYWwoCi0gICAgICAgICAgICAgICAgICAgIG91dCwKLSAgICAgICAgICAgICAgICAgICAgKGNoaWxkS2V5ID09IG51bGwgPyAibnVsbCIgOiBjaGlsZEtleSksCi0gICAgICAgICAgICAgICAgICAgIChNYXApIGNoaWxkVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGxpbmVhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRJbmRlbnQob3V0LCBsaW5lYWdlLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGNoaWxkS2V5KTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIGludCBsaW5lYWdlSW5kZXggPSBsaW5lYWdlLmluZGV4T2YoY2hpbGRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVhZ2VJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoY2hpbGRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lYWdlLnNpemUoKSAtIDEgPT0gbGluZWFnZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiKHRoaXMgTWFwKSIpOyAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiKGFuY2VzdG9yWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChsaW5lYWdlLnNpemUoKSAtIDEgLSBsaW5lYWdlSW5kZXggLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gTWFwKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZGVidWcgJiYgY2hpbGRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnICcpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihjaGlsZFZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbGluZWFnZS5wb3AoKTsKLQotICAgICAgICBwcmludEluZGVudChvdXQsIGxpbmVhZ2Uuc2l6ZSgpKTsKLSAgICAgICAgb3V0LnByaW50bG4oZGVidWcgPyAifSAiICsgbWFwLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogIn0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgaW5kZW50YXRpb24gdG8gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBzdHJlYW0gdG8gaW5kZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEluZGVudChmaW5hbCBQcmludFN0cmVhbSBvdXQsIGZpbmFsIGludCBpbmRlbnQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LnByaW50KElOREVOVF9TVFJJTkcpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIE1pc2MKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW52ZXJ0cyB0aGUgc3VwcGxpZWQgbWFwIHJldHVybmluZyBhIG5ldyBIYXNoTWFwIHN1Y2ggdGhhdCB0aGUga2V5cyBvZgotICAgICAqIHRoZSBpbnB1dCBhcmUgc3dhcHBlZCB3aXRoIHRoZSB2YWx1ZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvcGVyYXRpb24gYXNzdW1lcyB0aGF0IHRoZSBpbnZlcnNlIG1hcHBpbmcgaXMgd2VsbCBkZWZpbmVkLgotICAgICAqIElmIHRoZSBpbnB1dCBtYXAgaGFkIG11bHRpcGxlIGVudHJpZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSBtYXBwZWQgdG8KLSAgICAgKiBkaWZmZXJlbnQga2V5cywgdGhlIHJldHVybmVkIG1hcCB3aWxsIG1hcCBvbmUgb2YgdGhvc2Uga2V5cyB0byB0aGUgCi0gICAgICogdmFsdWUsIGJ1dCB0aGUgZXhhY3Qga2V5IHdoaWNoIHdpbGwgYmUgbWFwcGVkIGlzIHVuZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gaW52ZXJ0LCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEhhc2hNYXAgY29udGFpbmluZyB0aGUgaW52ZXJ0ZWQgZGF0YQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgaW52ZXJ0TWFwKE1hcCBtYXApIHsKLSAgICAgICAgTWFwIG91dCA9IG5ldyBIYXNoTWFwKG1hcC5zaXplKCkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgb3V0LnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0gICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQcm90ZWN0cyBhZ2FpbnN0IGFkZGluZyBudWxsIHZhbHVlcyB0byBhIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIHZhbHVlIGJlaW5nIGFkZGVkIHRvIHRoZSBtYXAsIGFuZCBpZiBpdCBpcyBudWxsCi0gICAgICogaXQgaXMgcmVwbGFjZWQgYnkgYW4gZW1wdHkgc3RyaW5nLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY291bGQgYmUgdXNlZnVsIGlmIHRoZSBtYXAgZG9lcyBub3QgYWNjZXB0IG51bGwgdmFsdWVzLCBvciBmb3IKLSAgICAgKiByZWNlaXZpbmcgZGF0YSBmcm9tIGEgc291cmNlIHRoYXQgbWF5IHByb3ZpZGUgbnVsbCBvciBlbXB0eSBzdHJpbmcKLSAgICAgKiB3aGljaCBzaG91bGQgYmUgaGVsZCBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBLZXlzIGFyZSBub3QgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gYWRkIHRvLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUsIG51bGwgY29udmVydGVkIHRvICIiCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2FmZUFkZFRvTWFwKE1hcCBtYXAsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcC5wdXQoa2V5LCAiIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFB1dHMgYWxsIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGludG8gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUge0BsaW5rIGphdmEudXRpbC5NYXAjcHV0QWxsKGphdmEudXRpbC5NYXApfQotICAgICAqIG1ldGhvZCBhbmQgY29uc3RydWN0b3JzLiBJdCBhbGxvd3MgeW91IHRvIGJ1aWxkIGEgbWFwIGZyb20gYW4gb2JqZWN0IGFycmF5Ci0gICAgICogb2YgdmFyaW91cyBwb3NzaWJsZSBzdHlsZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvYmplY3QgYXJyYXkgaW1wbGVtZW50cyB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeX0KLSAgICAgKiBvciB7QGxpbmsgS2V5VmFsdWV9IHRoZW4gdGhlIGtleSBhbmQgdmFsdWUgYXJlIGFkZGVkIGZyb20gdGhhdCBvYmplY3QuCi0gICAgICogSWYgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvYmplY3QgYXJyYXkgaXMgYW4gb2JqZWN0IGFycmF5IGl0c2VsZiwgdGhlbgotICAgICAqIGl0IGlzIGFzc3VtZWQgdGhhdCBpbmRleCAwIGluIHRoZSBzdWItYXJyYXkgaXMgdGhlIGtleSBhbmQgaW5kZXggMSBpcyB0aGUgdmFsdWUuCi0gICAgICogT3RoZXJ3aXNlLCB0aGUgYXJyYXkgaXMgdHJlYXRlZCBhcyBrZXlzIGFuZCB2YWx1ZXMgaW4gYWx0ZXJuYXRlIGluZGljZXMuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNvbG9yIG1hcDoKLSAgICAgKiA8cHJlPgotICAgICAqIE1hcCBjb2xvck1hcCA9IE1hcFV0aWxzLnB1dEFsbChuZXcgSGFzaE1hcCgpLCBuZXcgU3RyaW5nW11bXSB7Ci0gICAgICogICAgIHsiUkVEIiwgIiNGRjAwMDAifSwKLSAgICAgKiAgICAgeyJHUkVFTiIsICIjMDBGRjAwIn0sCi0gICAgICogICAgIHsiQkxVRSIsICIjMDAwMEZGIn0KLSAgICAgKiB9KTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiBvcjoKLSAgICAgKiA8cHJlPgotICAgICAqIE1hcCBjb2xvck1hcCA9IE1hcFV0aWxzLnB1dEFsbChuZXcgSGFzaE1hcCgpLCBuZXcgU3RyaW5nW10gewotICAgICAqICAgICAiUkVEIiwgIiNGRjAwMDAiLAotICAgICAqICAgICAiR1JFRU4iLCAiIzAwRkYwMCIsCi0gICAgICogICAgICJCTFVFIiwgIiMwMDAwRkYiCi0gICAgICogfSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogb3I6Ci0gICAgICogPHByZT4KLSAgICAgKiBNYXAgY29sb3JNYXAgPSBNYXBVdGlscy5wdXRBbGwobmV3IEhhc2hNYXAoKSwgbmV3IE1hcC5FbnRyeVtdIHsKLSAgICAgKiAgICAgbmV3IERlZmF1bHRNYXBFbnRyeSgiUkVEIiwgIiNGRjAwMDAiKSwKLSAgICAgKiAgICAgbmV3IERlZmF1bHRNYXBFbnRyeSgiR1JFRU4iLCAiIzAwRkYwMCIpLAotICAgICAqICAgICBuZXcgRGVmYXVsdE1hcEVudHJ5KCJCTFVFIiwgIiMwMDAwRkYiKQotICAgICAqIH0pOwotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBwb3B1bGF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBhcnJheSAgYW4gYXJyYXkgdG8gcG9wdWxhdGUgZnJvbSwgbnVsbCBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgaW5wdXQgbWFwCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgc3ViLWFycmF5IG9yIGVudHJ5IG1hdGNoaW5nIHVzZWQgYW5kIGFuCi0gICAgICogIGVudHJ5IGlzIGludmFsaWQKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgY29udGVudHMgaXMgbWl4ZWQKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBwdXRBbGwoTWFwIG1hcCwgT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgbWFwLnNpemUoKTsgIC8vIGZvcmNlIE5QRQotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2JqID0gYXJyYXlbMF07Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBhcnJheVtpXTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBLZXlWYWx1ZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEtleVZhbHVlIGtleXZhbCA9IChLZXlWYWx1ZSkgYXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXl2YWwuZ2V0S2V5KCksIGtleXZhbC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIHN1YiA9IChPYmplY3RbXSkgYXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN1YiA9PSBudWxsIHx8IHN1Yi5sZW5ndGggPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXJyYXkgZWxlbWVudDogIiArIGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KHN1YlswXSwgc3ViWzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoIC0gMTspIHsKLSAgICAgICAgICAgICAgICBtYXAucHV0KGFycmF5W2krK10sIGFycmF5W2krK10pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIE51bGwtc2FmZSBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIG1hcCBpcyBlbXB0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBOdWxsIHJldHVybnMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNoZWNrLCBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbXB0eSBvciBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gKG1hcCA9PSBudWxsIHx8IG1hcC5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE51bGwtc2FmZSBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIG1hcCBpcyBub3QgZW1wdHkuCi0gICAgICogPHA+Ci0gICAgICogTnVsbCByZXR1cm5zIGZhbHNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gY2hlY2ssIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vbi1udWxsIGFuZCBub24tZW1wdHkKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOb3RFbXB0eShNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiAhTWFwVXRpbHMuaXNFbXB0eShtYXApOwotICAgIH0KLQotICAgIC8vIE1hcCBkZWNvcmF0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwLgotICAgICAqIDxwPgotICAgICAqIFlvdSBtdXN0IG1hbnVhbGx5IHN5bmNocm9uaXplIG9uIHRoZSByZXR1cm5lZCBidWZmZXIncyBpdGVyYXRvciB0byAKLSAgICAgKiBhdm9pZCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvcjoKLSAgICAgKiAgCi0gICAgICogPHByZT4KLSAgICAgKiBNYXAgbSA9IE1hcFV0aWxzLnN5bmNocm9uaXplZE1hcChteU1hcCk7Ci0gICAgICogU2V0IHMgPSBtLmtleVNldCgpOyAgLy8gb3V0c2lkZSBzeW5jaHJvbml6ZWQgYmxvY2sKLSAgICAgKiBzeW5jaHJvbml6ZWQgKG0pIHsgIC8vIHN5bmNocm9uaXplZCBvbiBNQVAhCi0gICAgICogICAgIEl0ZXJhdG9yIGkgPSBzLml0ZXJhdG9yKCk7Ci0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgcHJvY2VzcyAoaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgQ29sbGVjdGlvbnN9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gc3luY2hyb25pemUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIG1hcCBiYWNrZWQgYnkgdGhlIGdpdmVuIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBzeW5jaHJvbml6ZWRNYXAoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIG1ha2UgdW5tb2RpZmlhYmxlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIHVubW9kaWZpYWJsZU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVNYXAuZGVjb3JhdGUobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwLgotICAgICAqIDxwPgotICAgICAqIE9ubHkgb2JqZWN0cyB0aGF0IHBhc3MgdGhlIHRlc3RzIGluIHRoZSBnaXZlbiBwcmVkaWNhdGVzIGNhbiBiZSBhZGRlZCB0byB0aGUgbWFwLgotICAgICAqIFRyeWluZyB0byBhZGQgYW4gaW52YWxpZCBvYmplY3QgcmVzdWx0cyBpbiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0gICAgICogS2V5cyBtdXN0IHBhc3MgdGhlIGtleSBwcmVkaWNhdGUsIHZhbHVlcyBtdXN0IHBhc3MgdGhlIHZhbHVlIHByZWRpY2F0ZS4KLSAgICAgKiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgbWFwIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLAotICAgICAqIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyBpbnZhbGlkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHByZWRpY2F0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlQcmVkICB0aGUgcHJlZGljYXRlIGZvciBrZXlzLCBudWxsIG1lYW5zIG5vIGNoZWNrCi0gICAgICogQHBhcmFtIHZhbHVlUHJlZCAgdGhlIHByZWRpY2F0ZSBmb3IgdmFsdWVzLCBudWxsIG1lYW5zIG5vIGNoZWNrCi0gICAgICogQHJldHVybiBhIHByZWRpY2F0ZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIHByZWRpY2F0ZWRNYXAoTWFwIG1hcCwgUHJlZGljYXRlIGtleVByZWQsIFByZWRpY2F0ZSB2YWx1ZVByZWQpIHsKLSAgICAgICAgcmV0dXJuIFByZWRpY2F0ZWRNYXAuZGVjb3JhdGUobWFwLCBrZXlQcmVkLCB2YWx1ZVByZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0eXBlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogT25seSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGxpbWl0IHRvIGEgc3BlY2lmaWMgdHlwZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiBrZXlzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgbWFwLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgdmFsdWVzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgbWFwLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHR5cGVkIG1hcCBiYWNrZWQgYnkgdGhlIHNwZWNpZmllZCBtYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIE1hcCBvciBDbGFzcyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgdHlwZWRNYXAoTWFwIG1hcCwgQ2xhc3Mga2V5VHlwZSwgQ2xhc3MgdmFsdWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBUeXBlZE1hcC5kZWNvcmF0ZShtYXAsIGtleVR5cGUsIHZhbHVlVHlwZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0cmFuc2Zvcm1lZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBtYXAgKGRlY29yYXRpbmcgdGhlIHNwZWNpZmllZCBtYXApIHRoYXQKLSAgICAgKiB3aWxsIHRyYW5zZm9ybSBhbnkgbmV3IGVudHJpZXMgYWRkZWQgdG8gaXQuCi0gICAgICogRXhpc3RpbmcgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIG1hcCB3aWxsIG5vdCBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBJZiB5b3Ugd2FudCB0aGF0IGJlaGF2aW91ciwgc2VlIHtAbGluayBUcmFuc2Zvcm1lZE1hcCNkZWNvcmF0ZVRyYW5zZm9ybX0uCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBvYmplY3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIHRyYW5zZm9ybWVycyBhcyBpdCBpcyBhZGRlZCB0byB0aGUKLSAgICAgKiBNYXAuIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBtYXAgYWZ0ZXIgaW52b2tpbmcgdGhpcyAKLSAgICAgKiBtZXRob2QsIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyB1bnRyYW5zZm9ybWVkIG9iamVjdHMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdHJhbnNmb3JtLCBtdXN0IG5vdCBiZSBudWxsLCB0eXBpY2FsbHkgZW1wdHkKLSAgICAgKiBAcGFyYW0ga2V5VHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciBmb3IgdGhlIG1hcCBrZXlzLCBudWxsIG1lYW5zIG5vIHRyYW5zZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIHZhbHVlVHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciBmb3IgdGhlIG1hcCB2YWx1ZXMsIG51bGwgbWVhbnMgbm8gdHJhbnNmb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIGEgdHJhbnNmb3JtZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIHRyYW5zZm9ybWVkTWFwKE1hcCBtYXAsIFRyYW5zZm9ybWVyIGtleVRyYW5zZm9ybWVyLCBUcmFuc2Zvcm1lciB2YWx1ZVRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lZE1hcC5kZWNvcmF0ZShtYXAsIGtleVRyYW5zZm9ybWVyLCB2YWx1ZVRyYW5zZm9ybWVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZpeGVkLXNpemVkIG1hcCBiYWNrZWQgYnkgdGhlIGdpdmVuIG1hcC4KLSAgICAgKiBFbGVtZW50cyBtYXkgbm90IGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmV0dXJuZWQgbWFwLCBidXQgCi0gICAgICogZXhpc3RpbmcgZWxlbWVudHMgY2FuIGJlIGNoYW5nZWQgKGZvciBpbnN0YW5jZSwgdmlhIHRoZSAKLSAgICAgKiB7QGxpbmsgTWFwI3B1dChPYmplY3QsT2JqZWN0KX0gbWV0aG9kKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2Ugc2l6ZSB0byBmaXgsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgZml4ZWQtc2l6ZSBtYXAgYmFja2VkIGJ5IHRoYXQgbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpeGVkU2l6ZU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiBGaXhlZFNpemVNYXAuZGVjb3JhdGUobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgImxhenkiIG1hcCB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBjcmVhdGVkIG9uIGRlbWFuZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoZSBrZXkgcGFzc2VkIHRvIHRoZSByZXR1cm5lZCBtYXAncyB7QGxpbmsgTWFwI2dldChPYmplY3QpfQotICAgICAqIG1ldGhvZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwLCB0aGVuIHRoZSBmYWN0b3J5IHdpbGwgYmUgdXNlZAotICAgICAqIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QgYW5kIHRoYXQgb2JqZWN0IHdpbGwgYmVjb21lIHRoZSB2YWx1ZQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleS4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICogPHByZT4KLSAgICAgKiBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpIHsKLSAgICAgKiAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB7Ci0gICAgICogICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiBNYXAgbGF6eU1hcCA9IE1hcFV0aWxzLmxhenlNYXAobmV3IEhhc2hNYXAoKSwgZmFjdG9yeSk7Ci0gICAgICogT2JqZWN0IG9iaiA9IGxhenlNYXAuZ2V0KCJ0ZXN0Iik7Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBBZnRlciB0aGUgYWJvdmUgY29kZSBpcyBleGVjdXRlZCwgPGNvZGU+b2JqPC9jb2RlPiB3aWxsIGNvbnRhaW4KLSAgICAgKiBhIG5ldyA8Y29kZT5EYXRlPC9jb2RlPiBpbnN0YW5jZS4gIEZ1cnRoZXJtb3JlLCB0aGF0IDxjb2RlPkRhdGU8L2NvZGU+Ci0gICAgICogaW5zdGFuY2UgaXMgdGhlIHZhbHVlIGZvciB0aGUgPGNvZGU+InRlc3QiPC9jb2RlPiBrZXkgaW4gdGhlIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gbWFrZSBsYXp5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGZhY3RvcnkgIHRoZSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgb2JqZWN0cywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBsYXp5IG1hcCBiYWNrZWQgYnkgdGhlIGdpdmVuIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgTWFwIG9yIEZhY3RvcnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGxhenlNYXAoTWFwIG1hcCwgRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBMYXp5TWFwLmRlY29yYXRlKG1hcCwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhICJsYXp5IiBtYXAgd2hvc2UgdmFsdWVzIHdpbGwgYmUgY3JlYXRlZCBvbiBkZW1hbmQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUga2V5IHBhc3NlZCB0byB0aGUgcmV0dXJuZWQgbWFwJ3Mge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0KLSAgICAgKiBtZXRob2QgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCwgdGhlbiB0aGUgZmFjdG9yeSB3aWxsIGJlIHVzZWQKLSAgICAgKiB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGFuZCB0aGF0IG9iamVjdCB3aWxsIGJlY29tZSB0aGUgdmFsdWUKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkuIFRoZSBmYWN0b3J5IGlzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICAgICAqIHRoYXQgd2lsbCBiZSBwYXNzZWQgdGhlIGtleSB3aGljaCBpdCBtdXN0IHRyYW5zZm9ybSBpbnRvIHRoZSB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICogPHByZT4KLSAgICAgKiBUcmFuc2Zvcm1lciBmYWN0b3J5ID0gbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAqICAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgbWFwS2V5KSB7Ci0gICAgICogICAgICAgICByZXR1cm4gbmV3IEZpbGUobWFwS2V5KTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiBNYXAgbGF6eU1hcCA9IE1hcFV0aWxzLmxhenlNYXAobmV3IEhhc2hNYXAoKSwgZmFjdG9yeSk7Ci0gICAgICogT2JqZWN0IG9iaiA9IGxhenlNYXAuZ2V0KCJDOi9kZXYiKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEFmdGVyIHRoZSBhYm92ZSBjb2RlIGlzIGV4ZWN1dGVkLCA8Y29kZT5vYmo8L2NvZGU+IHdpbGwgY29udGFpbgotICAgICAqIGEgbmV3IDxjb2RlPkZpbGU8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgQyBkcml2ZSBkZXYgZGlyZWN0b3J5LgotICAgICAqIEZ1cnRoZXJtb3JlLCB0aGF0IDxjb2RlPkZpbGU8L2NvZGU+IGluc3RhbmNlIGlzIHRoZSB2YWx1ZSBmb3IgdGhlCi0gICAgICogPGNvZGU+IkM6L2RldiI8L2NvZGU+IGtleSBpbiB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIGEgbGF6eSBtYXAgaXMgd3JhcHBlZCBieSBhIHN5bmNocm9uaXplZCBtYXAsIHRoZSByZXN1bHQgaXMgYSBzaW1wbGUKLSAgICAgKiBzeW5jaHJvbml6ZWQgY2FjaGUuIFdoZW4gYW4gb2JqZWN0IGlzIG5vdCBpcyB0aGUgY2FjaGUsIHRoZSBjYWNoZSBpdHNlbGYKLSAgICAgKiBjYWxscyBiYWNrIHRvIHRoZSBmYWN0b3J5IFRyYW5zZm9ybWVyIHRvIHBvcHVsYXRlIGl0c2VsZiwgYWxsIHdpdGhpbiB0aGUKLSAgICAgKiBzYW1lIHN5bmNocm9uaXplZCBibG9jay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gbWFrZSBsYXp5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyRmFjdG9yeSAgdGhlIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBvYmplY3RzLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIGxhenkgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgb3IgVHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGxhenlNYXAoTWFwIG1hcCwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXJGYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBMYXp5TWFwLmRlY29yYXRlKG1hcCwgdHJhbnNmb3JtZXJGYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIHRoYXQgbWFpbnRhaW5zIHRoZSBvcmRlciBvZiBrZXlzIHRoYXQgYXJlIGFkZGVkCi0gICAgICogYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBrZXkgaXMgYWRkZWQgdHdpY2UsIHRoZSBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhZGQuCi0gICAgICogVGhlIG9yZGVyIGlzIG9ic2VydmVkIHRocm91Z2ggdGhlIGtleVNldCwgdmFsdWVzIGFuZCBlbnRyeVNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gb3JkZXIsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIG9yZGVyZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIG9yZGVyZWRNYXAoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gTGlzdE9yZGVyZWRNYXAuZGVjb3JhdGUobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbXVsdC12YWx1ZSBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAgd2hpY2ggcmV0dXJucwotICAgICAqIGNvbGxlY3Rpb25zIG9mIHR5cGUgQXJyYXlMaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZQotICAgICAqIEByZXR1cm4gYSBtdWx0aS12YWx1ZSBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAgd2hpY2ggcmV0dXJucyBBcnJheUxpc3RzIG9mIHZhbHVlcy4KLSAgICAgKiBAc2VlIE11bHRpVmFsdWVNYXAKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBtdWx0aVZhbHVlTWFwKE1hcCBtYXApIHsKLSAgICAgICAgcmV0dXJuIE11bHRpVmFsdWVNYXAuZGVjb3JhdGUobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbXVsdGktdmFsdWUgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwIHdoaWNoIHJldHVybnMKLSAgICAgKiBjb2xsZWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb25DbGFzcyAgdGhlIHR5cGUgb2YgY29sbGVjdGlvbnMgdG8gcmV0dXJuIGZyb20gdGhlIG1hcCAobXVzdCBjb250YWluIHB1YmxpYyBuby1hcmcgY29uc3RydWN0b3IKLSAgICAgKiAgYW5kIGV4dGVuZCBDb2xsZWN0aW9uKS4KLSAgICAgKiBAcmV0dXJuIGEgbXVsdGktdmFsdWUgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwIHdoaWNoIHJldHVybnMgY29sbGVjdGlvbnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlCi0gICAgICogQHNlZSBNdWx0aVZhbHVlTWFwCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgbXVsdGlWYWx1ZU1hcChNYXAgbWFwLCBDbGFzcyBjb2xsZWN0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIE11bHRpVmFsdWVNYXAuZGVjb3JhdGUobWFwLCBjb2xsZWN0aW9uQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtdWx0aS12YWx1ZSBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAgd2hpY2ggcmV0dXJucwotICAgICAqIGNvbGxlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGZhY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb25GYWN0b3J5ICBhIGZhY3RvciB3aGljaCBjcmVhdGVzIGNvbGxlY3Rpb24gb2JqZWN0cwotICAgICAqIEByZXR1cm4gYSBtdWx0aS12YWx1ZSBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAgd2hpY2ggcmV0dXJucyBjb2xsZWN0aW9ucwotICAgICAqIGNyZWF0ZWQgYnkgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGZhY3RvcnkKLSAgICAgKiBAc2VlIE11bHRpVmFsdWVNYXAKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBtdWx0aVZhbHVlTWFwKE1hcCBtYXAsIEZhY3RvcnkgY29sbGVjdGlvbkZhY3RvcnkpIHsKLSAgICAgICAgcmV0dXJuIE11bHRpVmFsdWVNYXAuZGVjb3JhdGUobWFwLCBjb2xsZWN0aW9uRmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gU29ydGVkTWFwIGRlY29yYXRvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN5bmNocm9uaXplZCBzb3J0ZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gc29ydGVkIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBZb3UgbXVzdCBtYW51YWxseSBzeW5jaHJvbml6ZSBvbiB0aGUgcmV0dXJuZWQgYnVmZmVyJ3MgaXRlcmF0b3IgdG8gCi0gICAgICogYXZvaWQgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3I6Ci0gICAgICogIAotICAgICAqIDxwcmU+Ci0gICAgICogTWFwIG0gPSBNYXBVdGlscy5zeW5jaHJvbml6ZWRTb3J0ZWRNYXAobXlNYXApOwotICAgICAqIFNldCBzID0gbS5rZXlTZXQoKTsgIC8vIG91dHNpZGUgc3luY2hyb25pemVkIGJsb2NrCi0gICAgICogc3luY2hyb25pemVkIChtKSB7ICAvLyBzeW5jaHJvbml6ZWQgb24gTUFQIQotICAgICAqICAgICBJdGVyYXRvciBpID0gcy5pdGVyYXRvcigpOwotICAgICAqICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgKiAgICAgICAgIHByb2Nlc3MgKGkubmV4dCgpKTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zIENvbGxlY3Rpb25zfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHN5bmNocm9uaXplLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgc3luY2hyb25pemVkU29ydGVkTWFwKFNvcnRlZE1hcCBtYXApIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNvcnRlZE1hcChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHNvcnRlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBzb3J0ZWQgbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgc29ydGVkIG1hcCB0byBtYWtlIHVubW9kaWZpYWJsZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIG1hcCBiYWNrZWQgYnkgdGhlIGdpdmVuIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCB1bm1vZGlmaWFibGVTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU29ydGVkTWFwLmRlY29yYXRlKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByZWRpY2F0ZWQgKHZhbGlkYXRpbmcpIHNvcnRlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogT25seSBvYmplY3RzIHRoYXQgcGFzcyB0aGUgdGVzdHMgaW4gdGhlIGdpdmVuIHByZWRpY2F0ZXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBtYXAuCi0gICAgICogVHJ5aW5nIHRvIGFkZCBhbiBpbnZhbGlkIG9iamVjdCByZXN1bHRzIGluIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLSAgICAgKiBLZXlzIG11c3QgcGFzcyB0aGUga2V5IHByZWRpY2F0ZSwgdmFsdWVzIG11c3QgcGFzcyB0aGUgdmFsdWUgcHJlZGljYXRlLgotICAgICAqIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBtYXAgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsCi0gICAgICogYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIGludmFsaWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gcHJlZGljYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGtleVByZWQgIHRoZSBwcmVkaWNhdGUgZm9yIGtleXMsIG51bGwgbWVhbnMgbm8gY2hlY2sKLSAgICAgKiBAcGFyYW0gdmFsdWVQcmVkICB0aGUgcHJlZGljYXRlIGZvciB2YWx1ZXMsIG51bGwgbWVhbnMgbm8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIGEgcHJlZGljYXRlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIFNvcnRlZE1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgcHJlZGljYXRlZFNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwLCBQcmVkaWNhdGUga2V5UHJlZCwgUHJlZGljYXRlIHZhbHVlUHJlZCkgewotICAgICAgICByZXR1cm4gUHJlZGljYXRlZFNvcnRlZE1hcC5kZWNvcmF0ZShtYXAsIGtleVByZWQsIHZhbHVlUHJlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHR5cGVkIHNvcnRlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogT25seSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGxpbWl0IHRvIGEgc3BlY2lmaWMgdHlwZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiBrZXlzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgbWFwLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgdmFsdWVzIHdoaWNoIG1heSBiZSBhZGRlZCB0byB0aGUgbWFwLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIHR5cGVkIG1hcCBiYWNrZWQgYnkgdGhlIHNwZWNpZmllZCBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCB0eXBlZFNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwLCBDbGFzcyBrZXlUeXBlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIFR5cGVkU29ydGVkTWFwLmRlY29yYXRlKG1hcCwga2V5VHlwZSwgdmFsdWVUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRyYW5zZm9ybWVkIHNvcnRlZCBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBzb3J0ZWQgbWFwIChkZWNvcmF0aW5nIHRoZSBzcGVjaWZpZWQgbWFwKSB0aGF0Ci0gICAgICogd2lsbCB0cmFuc2Zvcm0gYW55IG5ldyBlbnRyaWVzIGFkZGVkIHRvIGl0LgotICAgICAqIEV4aXN0aW5nIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZCBtYXAgd2lsbCBub3QgYmUgdHJhbnNmb3JtZWQuCi0gICAgICogSWYgeW91IHdhbnQgdGhhdCBiZWhhdmlvdXIsIHNlZSB7QGxpbmsgVHJhbnNmb3JtZWRTb3J0ZWRNYXAjZGVjb3JhdGVUcmFuc2Zvcm19LgotICAgICAqIDxwPgotICAgICAqIEVhY2ggb2JqZWN0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1lcnMgYXMgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICAgICogTWFwLiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgbWFwIGFmdGVyIGludm9raW5nIHRoaXMgCi0gICAgICogbWV0aG9kLCBhcyBpdCBpcyBhIGJhY2tkb29yIGZvciBhZGRpbmcgdW50cmFuc2Zvcm1lZCBvYmplY3RzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHRyYW5zZm9ybSwgbXVzdCBub3QgYmUgbnVsbCwgdHlwaWNhbGx5IGVtcHR5Ci0gICAgICogQHBhcmFtIGtleVRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgZm9yIHRoZSBtYXAga2V5cywgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZVRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgZm9yIHRoZSBtYXAgdmFsdWVzLCBudWxsIG1lYW5zIG5vIHRyYW5zZm9ybWF0aW9uCi0gICAgICogQHJldHVybiBhIHRyYW5zZm9ybWVkIG1hcCBiYWNrZWQgYnkgdGhlIGdpdmVuIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgU29ydGVkTWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCB0cmFuc2Zvcm1lZFNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwLCBUcmFuc2Zvcm1lciBrZXlUcmFuc2Zvcm1lciwgVHJhbnNmb3JtZXIgdmFsdWVUcmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZWRTb3J0ZWRNYXAuZGVjb3JhdGUobWFwLCBrZXlUcmFuc2Zvcm1lciwgdmFsdWVUcmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmaXhlZC1zaXplZCBzb3J0ZWQgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gc29ydGVkIG1hcC4KLSAgICAgKiBFbGVtZW50cyBtYXkgbm90IGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmV0dXJuZWQgbWFwLCBidXQgCi0gICAgICogZXhpc3RpbmcgZWxlbWVudHMgY2FuIGJlIGNoYW5nZWQgKGZvciBpbnN0YW5jZSwgdmlhIHRoZSAKLSAgICAgKiB7QGxpbmsgTWFwI3B1dChPYmplY3QsT2JqZWN0KX0gbWV0aG9kKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2Ugc2l6ZSB0byBmaXgsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgZml4ZWQtc2l6ZSBtYXAgYmFja2VkIGJ5IHRoYXQgbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBTb3J0ZWRNYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGZpeGVkU2l6ZVNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiBGaXhlZFNpemVTb3J0ZWRNYXAuZGVjb3JhdGUobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgImxhenkiIHNvcnRlZCBtYXAgd2hvc2UgdmFsdWVzIHdpbGwgYmUgY3JlYXRlZCBvbiBkZW1hbmQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUga2V5IHBhc3NlZCB0byB0aGUgcmV0dXJuZWQgbWFwJ3Mge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0KLSAgICAgKiBtZXRob2QgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCwgdGhlbiB0aGUgZmFjdG9yeSB3aWxsIGJlIHVzZWQKLSAgICAgKiB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGFuZCB0aGF0IG9iamVjdCB3aWxsIGJlY29tZSB0aGUgdmFsdWUKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGluc3RhbmNlOgotICAgICAqCi0gICAgICogPHByZT4KLSAgICAgKiBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpIHsKLSAgICAgKiAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB7Ci0gICAgICogICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiBTb3J0ZWRNYXAgbGF6eSA9IE1hcFV0aWxzLmxhenlTb3J0ZWRNYXAobmV3IFRyZWVNYXAoKSwgZmFjdG9yeSk7Ci0gICAgICogT2JqZWN0IG9iaiA9IGxhenkuZ2V0KCJ0ZXN0Iik7Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBBZnRlciB0aGUgYWJvdmUgY29kZSBpcyBleGVjdXRlZCwgPGNvZGU+b2JqPC9jb2RlPiB3aWxsIGNvbnRhaW4KLSAgICAgKiBhIG5ldyA8Y29kZT5EYXRlPC9jb2RlPiBpbnN0YW5jZS4gIEZ1cnRoZXJtb3JlLCB0aGF0IDxjb2RlPkRhdGU8L2NvZGU+Ci0gICAgICogaW5zdGFuY2UgaXMgdGhlIHZhbHVlIGZvciB0aGUgPGNvZGU+InRlc3QiPC9jb2RlPiBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIG1ha2UgbGF6eSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IG9iamVjdHMsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbGF6eSBtYXAgYmFja2VkIGJ5IHRoZSBnaXZlbiBtYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIFNvcnRlZE1hcCBvciBGYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBsYXp5U29ydGVkTWFwKFNvcnRlZE1hcCBtYXAsIEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICByZXR1cm4gTGF6eVNvcnRlZE1hcC5kZWNvcmF0ZShtYXAsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgImxhenkiIHNvcnRlZCBtYXAgd2hvc2UgdmFsdWVzIHdpbGwgYmUgY3JlYXRlZCBvbiBkZW1hbmQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUga2V5IHBhc3NlZCB0byB0aGUgcmV0dXJuZWQgbWFwJ3Mge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0KLSAgICAgKiBtZXRob2QgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCwgdGhlbiB0aGUgZmFjdG9yeSB3aWxsIGJlIHVzZWQKLSAgICAgKiB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGFuZCB0aGF0IG9iamVjdCB3aWxsIGJlY29tZSB0aGUgdmFsdWUKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkuIFRoZSBmYWN0b3J5IGlzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICAgICAqIHRoYXQgd2lsbCBiZSBwYXNzZWQgdGhlIGtleSB3aGljaCBpdCBtdXN0IHRyYW5zZm9ybSBpbnRvIHRoZSB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICogPHByZT4KLSAgICAgKiBUcmFuc2Zvcm1lciBmYWN0b3J5ID0gbmV3IFRyYW5zZm9ybWVyKCkgewotICAgICAqICAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgbWFwS2V5KSB7Ci0gICAgICogICAgICAgICByZXR1cm4gbmV3IEZpbGUobWFwS2V5KTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiBTb3J0ZWRNYXAgbGF6eSA9IE1hcFV0aWxzLmxhenlTb3J0ZWRNYXAobmV3IFRyZWVNYXAoKSwgZmFjdG9yeSk7Ci0gICAgICogT2JqZWN0IG9iaiA9IGxhenkuZ2V0KCJDOi9kZXYiKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEFmdGVyIHRoZSBhYm92ZSBjb2RlIGlzIGV4ZWN1dGVkLCA8Y29kZT5vYmo8L2NvZGU+IHdpbGwgY29udGFpbgotICAgICAqIGEgbmV3IDxjb2RlPkZpbGU8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgQyBkcml2ZSBkZXYgZGlyZWN0b3J5LgotICAgICAqIEZ1cnRoZXJtb3JlLCB0aGF0IDxjb2RlPkZpbGU8L2NvZGU+IGluc3RhbmNlIGlzIHRoZSB2YWx1ZSBmb3IgdGhlCi0gICAgICogPGNvZGU+IkM6L2RldiI8L2NvZGU+IGtleSBpbiB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIGEgbGF6eSBtYXAgaXMgd3JhcHBlZCBieSBhIHN5bmNocm9uaXplZCBtYXAsIHRoZSByZXN1bHQgaXMgYSBzaW1wbGUKLSAgICAgKiBzeW5jaHJvbml6ZWQgY2FjaGUuIFdoZW4gYW4gb2JqZWN0IGlzIG5vdCBpcyB0aGUgY2FjaGUsIHRoZSBjYWNoZSBpdHNlbGYKLSAgICAgKiBjYWxscyBiYWNrIHRvIHRoZSBmYWN0b3J5IFRyYW5zZm9ybWVyIHRvIHBvcHVsYXRlIGl0c2VsZiwgYWxsIHdpdGhpbiB0aGUKLSAgICAgKiBzYW1lIHN5bmNocm9uaXplZCBibG9jay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gbWFrZSBsYXp5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyRmFjdG9yeSAgdGhlIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBvYmplY3RzLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIGxhenkgbWFwIGJhY2tlZCBieSB0aGUgZ2l2ZW4gbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBNYXAgb3IgVHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGxhenlTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXJGYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBMYXp5U29ydGVkTWFwLmRlY29yYXRlKG1hcCwgdHJhbnNmb3JtZXJGYWN0b3J5KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9NdWx0aUhhc2hNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTViOGVhNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlIYXNoTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqIAotICogPGNvZGU+TXVsdGlIYXNoTWFwPC9jb2RlPiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk11bHRpTWFwIE11bHRpTWFwfSBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIEEgPGNvZGU+TXVsdGlNYXA8L2NvZGU+IGlzIGEgTWFwIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljcy4KLSAqIFB1dHRpbmcgYSB2YWx1ZSBpbnRvIHRoZSBtYXAgd2lsbCBhZGQgdGhlIHZhbHVlIHRvIGEgQ29sbGVjdGlvbiBhdCB0aGF0IGtleS4KLSAqIEdldHRpbmcgYSB2YWx1ZSB3aWxsIHJldHVybiBhIENvbGxlY3Rpb24sIGhvbGRpbmcgYWxsIHRoZSB2YWx1ZXMgcHV0IHRvIHRoYXQga2V5LgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBhcyB0aGUgY29sbGVjdGlvbi4KLSAqIFRoZSBpbnRlcm5hbCBzdG9yYWdlIGxpc3QgaXMgbWFkZSBhdmFpbGFibGUgd2l0aG91dCBjbG9uaW5nIHZpYSB0aGUKLSAqIDxjb2RlPmdldChPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+ZW50cnlTZXQoKTwvY29kZT4gbWV0aG9kcy4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhlcmUgYXJlIG5vIHZhbHVlcyBtYXBwZWQgdG8gYSBrZXkuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIE11bHRpTWFwIG1obSA9IG5ldyBNdWx0aUhhc2hNYXAoKTsKLSAqIG1obS5wdXQoa2V5LCAiQSIpOwotICogbWhtLnB1dChrZXksICJCIik7Ci0gKiBtaG0ucHV0KGtleSwgIkMiKTsKLSAqIExpc3QgbGlzdCA9IChMaXN0KSBtaG0uZ2V0KGtleSk7PC9wcmU+Ci0gKiA8cD4KLSAqIDxjb2RlPmxpc3Q8L2NvZGU+IHdpbGwgYmUgYSBsaXN0IGNvbnRhaW5pbmcgIkEiLCAiQiIsICJDIi4KLSAqCi0gKiBAZGVwcmVjYXRlZCBDbGFzcyBub3cgYXZhaWxhYmxlIGFzIE11bHRpVmFsdWVNYXAgaW4gbWFwIHN1YnBhY2thZ2UuCi0gKiBUaGlzIHZlcnNpb24gaXMgZHVlIHRvIGJlIHJlbW92ZWQgaW4gY29sbGVjdGlvbnMgdjQuMC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIENocmlzdG9waGVyIEJlcnJ5Ci0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIFN0ZXZlIERvd25leQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSnVsaWVuIEJ1cmV0Ci0gKiBAYXV0aG9yIFNlcmhpeSBZZXZ0dXNoZW5rbwotICogQGF1dGhvciBSb2JlcnQgUmlibml0egotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlIYXNoTWFwIGV4dGVuZHMgSGFzaE1hcCBpbXBsZW1lbnRzIE11bHRpTWFwIHsKLSAgICAKLSAgICAvLyBiYWNrZWQgdmFsdWVzIGNvbGxlY3Rpb24KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uIHZhbHVlcyA9IG51bGw7Ci0gICAgCi0gICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGNvbW1vbnMtY29sbGVjdGlvbiByZWxlYXNlcyAyLjAvMi4xCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTk0MzU2MzgyODMwNzAzNTM0OUw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlIYXNoTWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIG1hcCBjYXBhY2l0eQotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aUhhc2hNYXAoaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIG1hcCBjYXBhY2l0eQotICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yICB0aGUgYW1vdW50IDAuMC0xLjAgYXQgd2hpY2ggdG8gcmVzaXplIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlIYXNoTWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGNvcGllcyB0aGUgaW5wdXQgbWFwIGNyZWF0aW5nIGFuIGluZGVwZW5kZW50IGNvcHkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgZGlmZmVyZW50IGJlaGF2aW91ciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbWFwCi0gICAgICogc3BlY2lmaWVkIGlzIGEgTXVsdGlNYXAgb3Igbm90LiBJZiBhIE11bHRpTWFwIGlzIHNwZWNpZmllZCwgZWFjaCBpbnRlcm5hbAotICAgICAqIGNvbGxlY3Rpb24gaXMgYWxzbyBjbG9uZWQuIElmIHRoZSBzcGVjaWZpZWQgbWFwIG9ubHkgaW1wbGVtZW50cyBNYXAsIHRoZW4KLSAgICAgKiB0aGUgdmFsdWVzIGFyZSBub3QgY2xvbmVkLgotICAgICAqIDxwPgotICAgICAqIE5PVEU6IEZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEgdGhpcyBtZXRob2QgY29ycmVjdGx5IGNvcGllcyBhIE11bHRpTWFwCi0gICAgICogdG8gZm9ybSBhIHRydWx5IGluZGVwZW5kZW50IG5ldyBtYXAuCi0gICAgICogTk9URTogRnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMiB0aGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIG5ld2x5Ci0gICAgICogYWRkZWQgcHV0QWxsKE1hcCkgb3ZlcnJpZGUgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXBUb0NvcHkgIGEgTWFwIHRvIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlIYXNoTWFwKE1hcCBtYXBUb0NvcHkpIHsKLSAgICAgICAgLy8gYmUgY2FyZWZ1bCBvZiBKREsgMS4zIHZzIDEuNCBkaWZmZXJlbmNlcwotICAgICAgICBzdXBlcigoaW50KSAobWFwVG9Db3B5LnNpemUoKSAqIDEuNGYpKTsKLSAgICAgICAgcHV0QWxsKG1hcFRvQ29weSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgb2JqZWN0IGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIDEuMi8xLjMgSmF2YSBkZXNlcmlhbGlzYXRpb24gY2FsbGVkCi0gICAgICAgIC8vIHB1dCBhbmQgdGh1cyBtZXNzZWQgdXAgdGhhdCBtZXRob2QKLSAgICAgICAgCi0gICAgICAgIC8vIGRlZmF1bHQgcmVhZCBvYmplY3QKLSAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIHByb2JsZW0gb25seSB3aXRoIGp2bSA8MS40Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gIjEuMiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbmQgdHJlYXQgYXMgMS4yLzEuMwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcnNpb24uc3RhcnRzV2l0aCgiMS4yIikgfHwgdmVyc2lvbi5zdGFydHNXaXRoKCIxLjMiKSkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAvLyBwdXQgaGFzIGNyZWF0ZWQgYSBleHRyYSBjb2xsZWN0aW9uIGxldmVsLCByZW1vdmUgaXQKLSAgICAgICAgICAgICAgICBzdXBlci5wdXQoZW50cnkuZ2V0S2V5KCksICgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKS5uZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIG1hcCBieSBjb3VudGluZyBhbGwgdGhlIHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBtYXAgY291bnRpbmcgYWxsIHZhbHVlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdG90YWxTaXplKCkgewotICAgICAgICBpbnQgdG90YWwgPSAwOwotICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IHN1cGVyLnZhbHVlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICB0b3RhbCArPSBjb2xsLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29sbGVjdGlvbiBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogVGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gdHlwZWNhc3QgdGhlIHJlc3VsdCBvZiA8Y29kZT5nZXQoa2V5KTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBrZXksIG51bGwgaWYgbm8gbWFwcGluZwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKENvbGxlY3Rpb24pIGdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZ2V0IHNpemUgZm9yCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbiBhdCB0aGUga2V5LCB6ZXJvIGlmIGtleSBub3QgaW4gbWFwCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKE9iamVjdCBrZXkpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sbC5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBmb3IgdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZ2V0IGFuIGl0ZXJhdG9yIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yIG9mIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBrZXksIGVtcHR5IGl0ZXJhdG9yIGlmIGtleSBub3QgaW4gbWFwCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKE9iamVjdCBrZXkpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gRW1wdHlJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sbC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiA8cD4KLSAgICAgKiBVbmxpa2UgYSBub3JtYWwgPGNvZGU+TWFwPC9jb2RlPiB0aGUgcHJldmlvdXMgdmFsdWUgaXMgbm90IHJlcGxhY2VkLgotICAgICAqIEluc3RlYWQgdGhlIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbiBzdG9yZWQgYWdhaW5zdCB0aGUga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzdG9yZSBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhZGRlZCBpZiB0aGUgbWFwIGNoYW5nZWQgYW5kIG51bGwgaWYgdGhlIG1hcCBkaWQgbm90IGNoYW5nZQotICAgICAqLyAgICAKLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gTk9URTo6IHB1dCBpcyBjYWxsZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiBpbiBKREsgPCAxLjQgISEhISEhCi0gICAgICAgIC8vICAgICAgICBzbyB3ZSBtdXN0IGhhdmUgYSByZWFkT2JqZWN0KCkKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb2xsID0gY3JlYXRlQ29sbGVjdGlvbihudWxsKTsKLSAgICAgICAgICAgIHN1cGVyLnB1dChrZXksIGNvbGwpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0cyA9IGNvbGwuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIChyZXN1bHRzID8gdmFsdWUgOiBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSBzdXBlcmNsYXNzIHRvIGVuc3VyZSB0aGF0IE11bHRpTWFwIGluc3RhbmNlcyBhcmUKLSAgICAgKiBjb3JyZWN0bHkgaGFuZGxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBOT1RFOiBQcmlvciB0byB2ZXJzaW9uIDMuMiwgcHV0QWxsKG1hcCkgZGlkIG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgICogd2hlbiBwYXNzZWQgYSBNdWx0aU1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNvcHkgKGVpdGhlciBhIG5vcm1hbCBvciBtdWx0aSBtYXApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXApIHsKLSAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE11bHRpTWFwKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBwdXRBbGwoZW50cnkuZ2V0S2V5KCksIGNvbGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcyB0byB0aGUgY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHN0b3JlIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gdmFsdWVzICB0aGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUga2V5LCBudWxsIGlnbm9yZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtYXAgY2hhbmdlZAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLyAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBwdXRBbGwoT2JqZWN0IGtleSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbCA9IGdldENvbGxlY3Rpb24oa2V5KTsKLSAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgY29sbCA9IGNyZWF0ZUNvbGxlY3Rpb24odmFsdWVzKTsKLSAgICAgICAgICAgIGlmIChjb2xsLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIucHV0KGtleSwgY29sbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsLmFkZEFsbCh2YWx1ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgdmFsdWUgc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY2hlY2tzIGFsbCBjb2xsZWN0aW9ucyBhZ2FpbnN0IGFsbCBrZXlzIGZvciB0aGUgdmFsdWUsIGFuZCB0aHVzIGNvdWxkIGJlIHNsb3cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFNldCBwYWlycyA9IHN1cGVyLmVudHJ5U2V0KCk7Ci0KLSAgICAgICAgaWYgKHBhaXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBwYWlyc0l0ZXJhdG9yID0gcGFpcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBhaXJzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkga2V5VmFsdWVQYWlyID0gKE1hcC5FbnRyeSkgcGFpcnNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSAoQ29sbGVjdGlvbikga2V5VmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoY29sbC5jb250YWlucyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBrZXkgY29udGFpbnMgdGhlIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUgdmFsdWUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBnZXRDb2xsZWN0aW9uKGtleSk7Ci0gICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sbC5jb250YWlucyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHNwZWNpZmljIHZhbHVlIGZyb20gbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoZSBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbiBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogT3RoZXIgdmFsdWVzIGF0dGFjaGVkIHRvIHRoYXQga2V5IGFyZSB1bmFmZmVjdGVkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBsYXN0IHZhbHVlIGZvciBhIGtleSBpcyByZW1vdmVkLCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkCi0gICAgICogZnJvbSBhIHN1YnNlcXVhbnQgPGNvZGU+Z2V0KGtleSk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gcmVtb3ZlIGZyb20KLSAgICAgKiBAcGFyYW0gaXRlbSAgdGhlIHZhbHVlIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJlbW92ZWQgKHdoaWNoIHdhcyBwYXNzZWQgaW4pLCBudWxsIGlmIG5vdGhpbmcgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXksIE9iamVjdCBpdGVtKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gdmFsdWVzRm9yS2V5ID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAodmFsdWVzRm9yS2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IHZhbHVlc0ZvcktleS5yZW1vdmUoaXRlbSk7Ci0gICAgICAgIGlmIChyZW1vdmVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3QgaWYgaXQgaXMgbm93IGVtcHR5Ci0gICAgICAgIC8vIChzYXZlcyBzcGFjZSwgYW5kIGFsbG93cyBlcXVhbHMgdG8gd29yaykKLSAgICAgICAgaWYgKHZhbHVlc0ZvcktleS5pc0VtcHR5KCkpewotICAgICAgICAgICAgcmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGNsZWFycyBlYWNoIGNvbGxlY3Rpb24gaW4gdGhlIG1hcCwgYW5kIHNvIG1heSBiZSBzbG93LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAvLyBGb3IgZ2MsIGNsZWFyIGVhY2ggbGlzdCBpbiB0aGUgbWFwCi0gICAgICAgIFNldCBwYWlycyA9IHN1cGVyLmVudHJ5U2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIHBhaXJzSXRlcmF0b3IgPSBwYWlycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGFpcnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBrZXlWYWx1ZVBhaXIgPSAoTWFwLkVudHJ5KSBwYWlyc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBrZXlWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGNvbGwuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJldHVybnMgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGNvbWJpbmF0aW9uIG9mIHZhbHVlcyBmcm9tIGFsbCBrZXlzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiB2cyA9IHZhbHVlczsKLSAgICAgICAgcmV0dXJuICh2cyAhPSBudWxsID8gdnMgOiAodmFsdWVzID0gbmV3IFZhbHVlcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWVzIGl0ZXJhdG9yIGZyb20gdGhlIHN1cGVyY2xhc3MsIGFzIHVzZWQgYnkgaW5uZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGl0ZXJhdG9yCi0gICAgICovCi0gICAgSXRlcmF0b3Igc3VwZXJWYWx1ZXNJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIHRvIHZpZXcgdGhlIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIHsKLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIGludCBjb21wdCA9IDA7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGNvbXB0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIE11bHRpSGFzaE1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElubmVyIGl0ZXJhdG9yIHRvIHZpZXcgdGhlIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVmFsdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBiYWNrZWRJdGVyYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciB0ZW1wSXRlcmF0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBWYWx1ZUl0ZXJhdG9yKCkgewotICAgICAgICAgICAgYmFja2VkSXRlcmF0b3IgPSBNdWx0aUhhc2hNYXAudGhpcy5zdXBlclZhbHVlc0l0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VhcmNoTmV4dEl0ZXJhdG9yKCkgewotICAgICAgICAgICAgd2hpbGUgKHRlbXBJdGVyYXRvciA9PSBudWxsIHx8IHRlbXBJdGVyYXRvci5oYXNOZXh0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFja2VkSXRlcmF0b3IuaGFzTmV4dCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVtcEl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKSBiYWNrZWRJdGVyYXRvci5uZXh0KCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VhcmNoTmV4dEl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBpZiAoc2VhcmNoTmV4dEl0ZXJhdG9yKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRlbXBJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAodGVtcEl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wSXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbG9uZXMgdGhlIG1hcCBjcmVhdGluZyBhbiBpbmRlcGVuZGVudCBjb3B5LgotICAgICAqIDxwPgotICAgICAqIFRoZSBjbG9uZSB3aWxsIHNoYWxsb3cgY2xvbmUgdGhlIGNvbGxlY3Rpb25zIGFzIHdlbGwgYXMgdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgTXVsdGlIYXNoTWFwIGNsb25lZCA9IChNdWx0aUhhc2hNYXApIHN1cGVyLmNsb25lKCk7Ci0KLSAgICAgICAgLy8gY2xvbmUgZWFjaCBDb2xsZWN0aW9uIGNvbnRhaW5lcgotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2xvbmVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIG5ld0NvbGwgPSBjcmVhdGVDb2xsZWN0aW9uKGNvbGwpOwotICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUobmV3Q29sbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsb25lZDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbWFwIHZhbHVlIENvbGxlY3Rpb24gY29udGFpbmVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIHVzZSB5b3VyIG93biBjb2xsZWN0aW9uIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY29weSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29sbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChjb2xsKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL011bHRpTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJkMjczMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvTXVsdGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIAotICogRGVmaW5lcyBhIG1hcCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYWdhaW5zdCBlYWNoIGtleS4KLSAqIDxwPgotICogQSA8Y29kZT5NdWx0aU1hcDwvY29kZT4gaXMgYSBNYXAgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgc2VtYW50aWNzLgotICogUHV0dGluZyBhIHZhbHVlIGludG8gdGhlIG1hcCB3aWxsIGFkZCB0aGUgdmFsdWUgdG8gYSBDb2xsZWN0aW9uIGF0IHRoYXQga2V5LgotICogR2V0dGluZyBhIHZhbHVlIHdpbGwgcmV0dXJuIGEgQ29sbGVjdGlvbiwgaG9sZGluZyBhbGwgdGhlIHZhbHVlcyBwdXQgdG8gdGhhdCBrZXkuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIE11bHRpTWFwIG1obSA9IG5ldyBNdWx0aUhhc2hNYXAoKTsKLSAqIG1obS5wdXQoa2V5LCAiQSIpOwotICogbWhtLnB1dChrZXksICJCIik7Ci0gKiBtaG0ucHV0KGtleSwgIkMiKTsKLSAqIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBtaG0uZ2V0KGtleSk7PC9wcmU+Ci0gKiA8cD4KLSAqIDxjb2RlPmNvbGw8L2NvZGU+IHdpbGwgYmUgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgIkEiLCAiQiIsICJDIi4KLSAqIDxwPgotICogTk9URTogQWRkaXRpb25hbCBtZXRob2RzIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnRlcmZhY2UgaW4gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKiBUaGVzZSB3ZXJlIGFkZGVkIHNvbGVseSBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBhbmQgZG8gbm90IGNoYW5nZSB0aGUgaW50ZXJmYWNlCi0gKiBhcyB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgc3VwZXJpbnRlcmZhY2UgPGNvZGU+TWFwPC9jb2RlPiBhbnl3YXkuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBDaHJpc3RvcGhlciBCZXJyeQotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGludGVyZmFjZSBNdWx0aU1hcCBleHRlbmRzIE1hcCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdmFsdWUgZnJvbSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIG1hcHBlZCB0byB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiBPdGhlciB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhhdCBrZXkgYXJlIHVuYWZmZWN0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGxhc3QgdmFsdWUgZm9yIGEga2V5IGlzIHJlbW92ZWQsIGltcGxlbWVudGF0aW9ucyB0eXBpY2FsbHkKLSAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSBhIHN1YnNlcXVhbnQgPGNvZGU+Z2V0KE9iamVjdCk8L2NvZGU+LCBob3dldmVyCi0gICAgICogdGhleSBtYXkgY2hvb3NlIHRvIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gcmVtb3ZlIGZyb20KLSAgICAgKiBAcGFyYW0gaXRlbSAgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcmVtb3ZlZCAod2hpY2ggd2FzIHBhc3NlZCBpbiksIG51bGwgaWYgbm90aGluZyByZW1vdmVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIHVubW9kaWZpYWJsZQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXkgb3IgdmFsdWUgaXMgb2YgYW4gaW52YWxpZCB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IG9yIHZhbHVlIGlzIG51bGwgYW5kIG51bGwgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXksIE9iamVjdCBpdGVtKTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgdHlwaWNhbGx5IHJldHVybiBvbmx5IHRoZSBjb3VudCBvZiBrZXlzIGluIHRoZSBtYXAKLSAgICAgKiBUaGlzIGNhbm5vdCBiZSBtYW5kYXRlZCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgb2YgdGhpcyBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5LWNvbGxlY3Rpb24gbWFwcGluZ3MgaW4gdGhpcyBtYXAKLSAgICAgKi8KLSAgICBpbnQgc2l6ZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGltcGxlbWVudCA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPi4gSW1wbGVtZW50YXRpb25zCi0gICAgICogYXJlIGZyZWUgdG8gZGVjbGFyZSB0aGF0IHRoZXkgcmV0dXJuIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IHN1YmNsYXNzZXMKLSAgICAgKiBzdWNoIGFzIDxjb2RlPkxpc3Q8L2NvZGU+IG9yIDxjb2RlPlNldDwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHR5cGljYWxseSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsdWVzIGhhdmUKLSAgICAgKiBiZWVuIG1hcHBlZCB0byB0aGUga2V5LCBob3dldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvCi0gICAgICogcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8gcmV0dXJuIGEgY2xvbmUgb2YgdGhlIGludGVybmFsIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gb2YgdmFsdWVzLCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCi0gICAgICogIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gbWFwcGluZywgYnV0IG1heSByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgb2YgYW4gaW52YWxpZCB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG51bGwgYW5kIG51bGwga2V5cyBhcmUgaW52YWxpZAotICAgICAqLwotICAgIE9iamVjdCBnZXQoT2JqZWN0IGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFwIGNvbnRhaW5zIHRoZSB2YWx1ZSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHR5cGljYWxseSBjaGVjayBhbGwgY29sbGVjdGlvbnMgYWdhaW5zdCBhbGwga2V5cyBmb3IgdGhlIHZhbHVlLgotICAgICAqIFRoaXMgY2Fubm90IGJlIG1hbmRhdGVkIGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBvZiB0aGlzIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUgdmFsdWUKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgb2YgYW4gaW52YWxpZCB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbnVsbCBhbmQgbnVsbCB2YWx1ZSBhcmUgaW52YWxpZAotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIDxwPgotICAgICAqIFVubGlrZSBhIG5vcm1hbCA8Y29kZT5NYXA8L2NvZGU+IHRoZSBwcmV2aW91cyB2YWx1ZSBpcyBub3QgcmVwbGFjZWQuCi0gICAgICogSW5zdGVhZCB0aGUgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uIHN0b3JlZCBhZ2FpbnN0IHRoZSBrZXkuCi0gICAgICogVGhlIGNvbGxlY3Rpb24gbWF5IGJlIGEgPGNvZGU+TGlzdDwvY29kZT4sIDxjb2RlPlNldDwvY29kZT4gb3Igb3RoZXIKLSAgICAgKiBjb2xsZWN0aW9uIGRlcGVuZGVudCBvbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc3RvcmUgYWdhaW5zdAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUga2V5Ci0gICAgICogQHJldHVybiB0eXBpY2FsbHkgdGhlIHZhbHVlIGFkZGVkIGlmIHRoZSBtYXAgY2hhbmdlZCBhbmQgbnVsbCBpZiB0aGUgbWFwIGRpZCBub3QgY2hhbmdlCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIHVubW9kaWZpYWJsZQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXkgb3IgdmFsdWUgaXMgb2YgYW4gaW52YWxpZCB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IG9yIHZhbHVlIGlzIG51bGwgYW5kIG51bGwgaXMgaW52YWxpZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBrZXkgb3IgdmFsdWUgaXMgaW52YWxpZAotICAgICAqLwotICAgIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHR5cGljYWxseSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSBhIHN1YnNlcXVhbnQKLSAgICAgKiA8Y29kZT5nZXQoT2JqZWN0KTwvY29kZT4sIGhvd2V2ZXIgdGhleSBtYXkgY2hvb3NlIHRvIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byByZW1vdmUgdmFsdWVzIGZyb20KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBvZiB2YWx1ZXMgcmVtb3ZlZCwgaW1wbGVtZW50YXRpb25zIHNob3VsZAotICAgICAqICByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIG1hcHBpbmcgZm91bmQsIGJ1dCBtYXkgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgdW5tb2RpZmlhYmxlCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBvZiBhbiBpbnZhbGlkIHR5cGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgbnVsbCBhbmQgbnVsbCBrZXlzIGFyZSBpbnZhbGlkCi0gICAgICovCi0gICAgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbnBsZW1lbnRhdGlvbnMgdHlwaWNhbGx5IHJldHVybiBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgY29tYmluYXRpb24KLSAgICAgKiBvZiB2YWx1ZXMgZnJvbSBhbGwga2V5cy4KLSAgICAgKiBUaGlzIGNhbm5vdCBiZSBtYW5kYXRlZCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgb2YgdGhpcyBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwCi0gICAgICovCi0gICAgQ29sbGVjdGlvbiB2YWx1ZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRCaWRpTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZEJpZGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZjNjIxNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIG1hcCB0aGF0IGFsbG93cyBiaWRpcmVjdGlvbmFsIGxvb2t1cCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVzCi0gKiBhbmQgcmV0YWlucyBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGFuIG9yZGVyaW5nLgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsbG93IGEgdmFsdWUgdG8gYmUgbG9va2VkIHVwIGZyb20gYSBrZXkgYW5kCi0gKiBhIGtleSB0byBiZSBsb29rZWQgdXAgZnJvbSBhIHZhbHVlIHdpdGggZXF1YWwgcGVyZm9ybWFuY2UuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOSAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlcmVkQmlkaU1hcCBleHRlbmRzIEJpZGlNYXAsIE9yZGVyZWRNYXAgewotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgb2YgdGhpcyBtYXAgd2hlcmUgdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgcmV2ZXJzZWQuCi0gICAgICogPHA+Ci0gICAgICogQ2hhbmdlcyB0byBvbmUgbWFwIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgb3RoZXIgYW5kIHZpY2UgdmVyc2EuCi0gICAgICogVGhpcyBlbmFibGVzIGJvdGggZGlyZWN0aW9ucyBvZiB0aGUgbWFwIHRvIGJlIGFjY2Vzc2VkIGVxdWFsbHkuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZWVrIHRvIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBldmVyeSB0aW1lIHRoaXMKLSAgICAgKiBtZXRob2QgaXMgY2FsbGVkLiBTZWUgPGNvZGU+QWJzdHJhY3RNYXAudmFsdWVzKCk8L2NvZGU+IGV0Yy4gQ2FsbGluZyB0aGlzCi0gICAgICogbWV0aG9kIG9uIHRoZSBpbnZlcnNlIG1hcCBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCByZXR1cm4gYW4gPGNvZGU+T3JkZXJlZEJpZGlNYXA8L2NvZGU+IGluc3RhbmNlLAotICAgICAqIHVzdWFsbHkgYnkgZm9yd2FyZGluZyB0byA8Y29kZT5pbnZlcnNlT3JkZXJlZEJpZGlNYXAoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGludmVydGVkIGJpZGlyZWN0aW9uYWwgbWFwCi0gICAgICovCi0gICAgcHVibGljIEJpZGlNYXAgaW52ZXJzZUJpZGlNYXAoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmlldyBvZiB0aGlzIG1hcCB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSByZXZlcnNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBDaGFuZ2VzIHRvIG9uZSBtYXAgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBvdGhlciBhbmQgdmljZSB2ZXJzYS4KLSAgICAgKiBUaGlzIGVuYWJsZXMgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBtYXAgdG8gYmUgYWNjZXNzZWQgZXF1YWxseS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHNlZWsgdG8gYXZvaWQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGV2ZXJ5IHRpbWUgdGhpcwotICAgICAqIG1ldGhvZCBpcyBjYWxsZWQuIFNlZSA8Y29kZT5BYnN0cmFjdE1hcC52YWx1ZXMoKTwvY29kZT4gZXRjLiBDYWxsaW5nIHRoaXMKLSAgICAgKiBtZXRob2Qgb24gdGhlIGludmVyc2UgbWFwIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpbnZlcnRlZCBiaWRpcmVjdGlvbmFsIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBPcmRlcmVkQmlkaU1hcCBpbnZlcnNlT3JkZXJlZEJpZGlNYXAoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFiMWEyMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERlZmluZXMgYW4gaXRlcmF0b3IgdGhhdCBvcGVyYXRlcyBvdmVyIGFuIG9yZGVyZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBhbGxvd3MgYm90aCBmb3J3YXJkIGFuZCByZXZlcnNlIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uLgotICogIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVyZWRJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBlbGVtZW50IHRoYXQgY2FuIGJlIGl0ZXJhdGVkIHRvLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlcmF0b3IgaGFzIGEgcHJldmlvdXMgZWxlbWVudAotICAgICAqLwotICAgIGJvb2xlYW4gaGFzUHJldmlvdXMoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZXZpb3VzIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGl0ZXJhdGlvbgotICAgICAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZAotICAgICAqLwotICAgIE9iamVjdCBwcmV2aW91cygpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL09yZGVyZWRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdmYjRjMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotLyoqCi0gKiBEZWZpbmVzIGEgbWFwIHRoYXQgbWFpbnRhaW5zIG9yZGVyIGFuZCBhbGxvd3MgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZAotICogaXRlcmF0aW9uIHRocm91Z2ggdGhhdCBvcmRlci4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVyZWRNYXAgZXh0ZW5kcyBJdGVyYWJsZU1hcCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhbiA8Y29kZT5PcmRlcmVkTWFwSXRlcmF0b3I8L2NvZGU+IG92ZXIgdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIG9yZGVyZWQgbWFwIGl0ZXJhdG9yIGlzIGFuIGVmZmljaWVudCB3YXkgb2YgaXRlcmF0aW5nIG92ZXIgbWFwcwotICAgICAqIGluIGJvdGggZGlyZWN0aW9ucy4KLSAgICAgKiA8cHJlPgotICAgICAqIEJpZGlNYXAgbWFwID0gbmV3IFRyZWVCaWRpTWFwKCk7Ci0gICAgICogTWFwSXRlcmF0b3IgaXQgPSBtYXAubWFwSXRlcmF0b3IoKTsKLSAgICAgKiB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICogICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAqICAgT2JqZWN0IHZhbHVlID0gaXQuZ2V0VmFsdWUoKTsKLSAgICAgKiAgIGl0LnNldFZhbHVlKCJuZXdWYWx1ZSIpOwotICAgICAqICAgT2JqZWN0IHByZXZpb3VzS2V5ID0gaXQucHJldmlvdXMoKTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmaXJzdCBrZXkgY3VycmVudGx5IGluIHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmlyc3Qga2V5IGN1cnJlbnRseSBpbiB0aGlzIG1hcAotICAgICAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtYXAgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0S2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsYXN0IGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAKLSAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoaXMgbWFwIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBsYXN0S2V5KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBrZXkgYWZ0ZXIgdGhlIG9uZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHNlYXJjaCBmb3IgbmV4dCBmcm9tCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBrZXksIG51bGwgaWYgbm8gbWF0Y2ggb3IgYXQgZW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0S2V5KE9iamVjdCBrZXkpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJldmlvdXMga2V5IGJlZm9yZSB0aGUgb25lIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc2VhcmNoIGZvciBwcmV2aW91cyBmcm9tCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMga2V5LCBudWxsIGlmIG5vIG1hdGNoIG9yIGF0IHN0YXJ0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91c0tleShPYmplY3Qga2V5KTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkTWFwSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9PcmRlcmVkTWFwSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTllYTNhYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvT3JkZXJlZE1hcEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi0vKioKLSAqIERlZmluZXMgYW4gaXRlcmF0b3IgdGhhdCBvcGVyYXRlcyBvdmVyIGFuIG9yZGVyZWQgPGNvZGU+TWFwPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBhbGxvd3MgYm90aCBmb3J3YXJkIGFuZCByZXZlcnNlIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBtYXAuCi0gKiAgCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JkZXJlZE1hcEl0ZXJhdG9yIGV4dGVuZHMgTWFwSXRlcmF0b3IsIE9yZGVyZWRJdGVyYXRvciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGVudHJ5IHRoYXQgY2FuIGJlIGl0ZXJhdGVkIHRvLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlcmF0b3IgaGFzIGEgcHJldmlvdXMgZWxlbWVudAotICAgICAqLwotICAgIGJvb2xlYW4gaGFzUHJldmlvdXMoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZXZpb3VzIDxlbT5rZXk8L2VtPiBmcm9tIHRoZSA8Y29kZT5NYXA8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMga2V5IGluIHRoZSBpdGVyYXRpb24KLSAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRpb24gaXMgZmluaXNoZWQKLSAgICAgKi8KLSAgICBPYmplY3QgcHJldmlvdXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTJkYzYzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIGZ1bmN0b3IgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBwZXJmb3JtIGEgcHJlZGljYXRlCi0gKiB0ZXN0IG9uIGFuIG9iamVjdC4KLSAqIDxwPgotICogQSA8Y29kZT5QcmVkaWNhdGU8L2NvZGU+IGlzIHRoZSBvYmplY3QgZXF1aXZhbGVudCBvZiBhbiA8Y29kZT5pZjwvY29kZT4gc3RhdGVtZW50LgotICogSXQgdXNlcyB0aGUgaW5wdXQgb2JqZWN0IHRvIHJldHVybiBhIHRydWUgb3IgZmFsc2UgdmFsdWUsIGFuZCBpcyBvZnRlbiB1c2VkIGluCi0gKiB2YWxpZGF0aW9uIG9yIGZpbHRlcmluZy4KLSAqIDxwPgotICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIGNvbW1vbiBwcmVkaWNhdGVzIGFyZSBwcm92aWRlZCBieQotICoge0BsaW5rIFByZWRpY2F0ZVV0aWxzfS4gVGhlc2UgaW5jbHVkZSB0cnVlLCBmYWxzZSwgaW5zdGFuY2VvZiwgZXF1YWxzLCBhbmQsCi0gKiBvciwgbm90LCBtZXRob2QgaW52b2thdGlvbiBhbmQgbnVsbCB0ZXN0aW5nLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWRpY2F0ZSB7Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gcGVyZm9ybSBhIHRlc3QgdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGV2YWx1YXRlLCBzaG91bGQgbm90IGJlIGNoYW5nZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgb3IgZmFsc2UKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAocnVudGltZSkgaWYgdGhlIGlucHV0IGlzIHRoZSB3cm9uZyBjbGFzcwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIChydW50aW1lKSBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZAotICAgICAqIEB0aHJvd3MgRnVuY3RvckV4Y2VwdGlvbiAocnVudGltZSkgaWYgdGhlIHByZWRpY2F0ZSBlbmNvdW50ZXJzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUHJlZGljYXRlVXRpbHMuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWQ3MmEzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9QcmVkaWNhdGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkFsbFByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQW5kUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5BbnlQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkVxdWFsUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5FeGNlcHRpb25QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkZhbHNlUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JZGVudGl0eVByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW5zdGFuY2VvZlByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Ob25lUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Ob3ROdWxsUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Ob3RQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk51bGxJc0V4Y2VwdGlvblByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTnVsbElzRmFsc2VQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk51bGxJc1RydWVQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk51bGxQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk9uZVByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuT3JQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLlRyYW5zZm9ybWVkUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5UcmFuc2Zvcm1lclByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVHJ1ZVByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVW5pcXVlUHJlZGljYXRlOwotCi0vKioKLSAqIDxjb2RlPlByZWRpY2F0ZVV0aWxzPC9jb2RlPiBwcm92aWRlcyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zIGFuZCB1dGlsaXRpZXMKLSAqIGZvciB0aGUgUHJlZGljYXRlIGZ1bmN0b3IgaW50ZXJmYWNlLiBUaGUgc3VwcGxpZWQgcHJlZGljYXRlcyBhcmU6Ci0gKiA8dWw+Ci0gKiA8bGk+SW52b2tlciAtIHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCBjYWxsIG9uIHRoZSBpbnB1dCBvYmplY3QKLSAqIDxsaT5JbnN0YW5jZU9mIC0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlb2YgYSBjbGFzcwotICogPGxpPkVxdWFsIC0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGVxdWFscygpIGEgc3BlY2lmaWVkIG9iamVjdAotICogPGxpPklkZW50aXR5IC0gdHJ1ZSBpZiB0aGUgb2JqZWN0ID09IGEgc3BlY2lmaWVkIG9iamVjdAotICogPGxpPk51bGwgLSB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbnVsbAotICogPGxpPk5vdE51bGwgLSB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbm90IG51bGwKLSAqIDxsaT5VbmlxdWUgLSB0cnVlIGlmIHRoZSBvYmplY3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkCi0gKiA8bGk+QW5kL0FsbCAtIHRydWUgaWYgYWxsIG9mIHRoZSBwcmVkaWNhdGVzIGFyZSB0cnVlCi0gKiA8bGk+T3IvQW55IC0gdHJ1ZSBpZiBhbnkgb2YgdGhlIHByZWRpY2F0ZXMgaXMgdHJ1ZQotICogPGxpPkVpdGhlci9PbmUgLSB0cnVlIGlmIG9ubHkgb25lIG9mIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZQotICogPGxpPk5laXRoZXIvTm9uZSAtIHRydWUgaWYgbm9uZSBvZiB0aGUgcHJlZGljYXRlcyBhcmUgdHJ1ZQotICogPGxpPk5vdCAtIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBpcyBmYWxzZSwgYW5kIHZpY2UgdmVyc2EKLSAqIDxsaT5UcmFuc2Zvcm1lciAtIHdyYXBzIGEgVHJhbnNmb3JtZXIgYXMgYSBQcmVkaWNhdGUKLSAqIDxsaT5UcnVlIC0gYWx3YXlzIHJldHVybiB0cnVlCi0gKiA8bGk+RmFsc2UgLSBhbHdheXMgcmV0dXJuIGZhbHNlCi0gKiA8bGk+RXhjZXB0aW9uIC0gYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24KLSAqIDxsaT5OdWxsSXNFeGNlcHRpb24vTnVsbElzRmFsc2UvTnVsbElzVHJ1ZSAtIGNoZWNrIGZvciBudWxsIGlucHV0Ci0gKiA8bGk+VHJhbnNmb3JtZWQgLSB0cmFuc2Zvcm1zIHRoZSBpbnB1dCBiZWZvcmUgY2FsbGluZyB0aGUgcHJlZGljYXRlCi0gKiA8L3VsPgotICogQWxsIHRoZSBzdXBwbGllZCBwcmVkaWNhdGVzIGFyZSBTZXJpYWxpemFibGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgT2xhIEJlcmcKLSAqLwotcHVibGljIGNsYXNzIFByZWRpY2F0ZVV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlVXRpbHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIHByZWRpY2F0ZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogCi0gICAgICogR2V0cyBhIFByZWRpY2F0ZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uLgotICAgICAqIFRoaXMgY291bGQgYmUgdXNlZnVsIGR1cmluZyB0ZXN0aW5nIGFzIGEgcGxhY2Vob2xkZXIuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5FeGNlcHRpb25QcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBleGNlcHRpb25QcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBFeGNlcHRpb25QcmVkaWNhdGUuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIFByZWRpY2F0ZSB0aGF0IGFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVHJ1ZVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIHRydWVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBUcnVlUHJlZGljYXRlLklOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBQcmVkaWNhdGUgdGhhdCBhbHdheXMgcmV0dXJucyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5GYWxzZVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGZhbHNlUHJlZGljYXRlKCkgewotICAgICAgICByZXR1cm4gRmFsc2VQcmVkaWNhdGUuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIFByZWRpY2F0ZSB0aGF0IGNoZWNrcyBpZiB0aGUgaW5wdXQgb2JqZWN0IHBhc3NlZCBpbiBpcyBudWxsLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk51bGxQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBudWxsUHJlZGljYXRlKCkgewotICAgICAgICByZXR1cm4gTnVsbFByZWRpY2F0ZS5JTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgUHJlZGljYXRlIHRoYXQgY2hlY2tzIGlmIHRoZSBpbnB1dCBvYmplY3QgcGFzc2VkIGluIGlzIG5vdCBudWxsLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk5vdE51bGxQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBub3ROdWxsUHJlZGljYXRlKCkgewotICAgICAgICByZXR1cm4gTm90TnVsbFByZWRpY2F0ZS5JTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUHJlZGljYXRlIHRoYXQgY2hlY2tzIGlmIHRoZSBpbnB1dCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIG9iamVjdCB1c2luZyBlcXVhbHMoKS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5FcXVhbFByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGVxdWFsUHJlZGljYXRlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gRXF1YWxQcmVkaWNhdGUuZ2V0SW5zdGFuY2UodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcmVkaWNhdGUgdGhhdCBjaGVja3MgaWYgdGhlIGlucHV0IG9iamVjdCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgb2JqZWN0IGJ5IGlkZW50aXR5LgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLklkZW50aXR5UHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0Ci0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgaWRlbnRpdHlQcmVkaWNhdGUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBJZGVudGl0eVByZWRpY2F0ZS5nZXRJbnN0YW5jZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcmVkaWNhdGUgdGhhdCBjaGVja3MgaWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaXMgb2YKLSAgICAgKiBhIHBhcnRpY3VsYXIgdHlwZSwgdXNpbmcgaW5zdGFuY2VvZi4gQSA8Y29kZT5udWxsPC9jb2RlPiBpbnB1dAotICAgICAqIG9iamVjdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW5zdGFuY2VvZlByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlICB0aGUgdHlwZSB0byBjaGVjayBmb3IsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgaW5zdGFuY2VvZlByZWRpY2F0ZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgdGhlIGZpcnN0IHRpbWUgYW4gb2JqZWN0IGlzCi0gICAgICogZW5jb3VudGVyZWQsIGFuZCBmYWxzZSBpZiB0aGUgc2FtZSBvYmplY3QgaXMgcmVjZWl2ZWQgCi0gICAgICogYWdhaW4uIFRoZSBjb21wYXJpc29uIGlzIGJ5IGVxdWFscygpLiBBIDxjb2RlPm51bGw8L2NvZGU+IGlucHV0IG9iamVjdAotICAgICAqIGlzIGFjY2VwdGVkIGFuZCB3aWxsIHJldHVybiB0cnVlIHRoZSBmaXJzdCB0aW1lLCBhbmQgZmFsc2Ugc3Vic2VxdWVudGx5Ci0gICAgICogYXMgd2VsbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5VbmlxdWVQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSB1bmlxdWVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIC8vIG11c3QgcmV0dXJuIG5ldyBpbnN0YW5jZSBlYWNoIHRpbWUKLSAgICAgICAgcmV0dXJuIFVuaXF1ZVByZWRpY2F0ZS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBQcmVkaWNhdGUgdGhhdCBpbnZva2VzIGEgbWV0aG9kIG9uIHRoZSBpbnB1dCBvYmplY3QuCi0gICAgICogVGhlIG1ldGhvZCBtdXN0IHJldHVybiBlaXRoZXIgYSBib29sZWFuIG9yIGEgbm9uLW51bGwgQm9vbGVhbiwKLSAgICAgKiBhbmQgaGF2ZSBubyBwYXJhbWV0ZXJzLiBJZiB0aGUgaW5wdXQgb2JqZWN0IGlzIG51bGwsIGEgCi0gICAgICogUHJlZGljYXRlRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZSwgPGNvZGU+UHJlZGljYXRlVXRpbHMuaW52b2tlclByZWRpY2F0ZSgiaXNFbXB0eSIpOzwvY29kZT4KLSAgICAgKiB3aWxsIGNhbGwgdGhlIDxjb2RlPmlzRW1wdHk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgaW5wdXQgb2JqZWN0IHRvIAotICAgICAqIGRldGVybWluZSB0aGUgcHJlZGljYXRlIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnZva2VyVHJhbnNmb3JtZXIKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5UcmFuc2Zvcm1lclByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lICB0aGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgaW5wdXQgb2JqZWN0LCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kTmFtZSBpcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGludm9rZXJQcmVkaWNhdGUoU3RyaW5nIG1ldGhvZE5hbWUpewotICAgICAgICAvLyByZXVzZSB0cmFuc2Zvcm1lciBhcyBpdCBoYXMgY2FjaGluZyAtIHRoaXMgaXMgbGF6eSByZWFsbHksIHNob3VsZCBoYXZlIGlubmVyIGNsYXNzIGhlcmUKLSAgICAgICAgcmV0dXJuIGFzUHJlZGljYXRlKEludm9rZXJUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtZXRob2ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFByZWRpY2F0ZSB0aGF0IGludm9rZXMgYSBtZXRob2Qgb24gdGhlIGlucHV0IG9iamVjdC4KLSAgICAgKiBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIGVpdGhlciBhIGJvb2xlYW4gb3IgYSBub24tbnVsbCBCb29sZWFuLAotICAgICAqIGFuZCBoYXZlIG5vIHBhcmFtZXRlcnMuIElmIHRoZSBpbnB1dCBvYmplY3QgaXMgbnVsbCwgYSAKLSAgICAgKiBQcmVkaWNhdGVFeGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCA8Y29kZT5QcmVkaWNhdGVVdGlscy5pbnZva2VyUHJlZGljYXRlKCJpc0VtcHR5Iik7PC9jb2RlPgotICAgICAqIHdpbGwgY2FsbCB0aGUgPGNvZGU+aXNFbXB0eTwvY29kZT4gbWV0aG9kIG9uIHRoZSBpbnB1dCBvYmplY3QgdG8gCi0gICAgICogZGV0ZXJtaW5lIHRoZSBwcmVkaWNhdGUgcmVzdWx0LgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLlRyYW5zZm9ybWVyUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgIHRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBpbnB1dCBvYmplY3QsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgcGFyYW1ldGVyIHR5cGVzCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIG5hbWUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwYXJhbVR5cGVzIGFuZCBhcmdzIGRvbid0IG1hdGNoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgaW52b2tlclByZWRpY2F0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKXsKLSAgICAgICAgLy8gcmV1c2UgdHJhbnNmb3JtZXIgYXMgaXQgaGFzIGNhY2hpbmcgLSB0aGlzIGlzIGxhenkgcmVhbGx5LCBzaG91bGQgaGF2ZSBpbm5lciBjbGFzcyBoZXJlCi0gICAgICAgIHJldHVybiBhc1ByZWRpY2F0ZShJbnZva2VyVHJhbnNmb3JtZXIuZ2V0SW5zdGFuY2UobWV0aG9kTmFtZSwgcGFyYW1UeXBlcywgYXJncykpOwotICAgIH0KLQotICAgIC8vIEJvb2xlYW4gY29tYmluYXRpb25zCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBvbmx5IGlmIGJvdGggb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHByZWRpY2F0ZXMgYXJlIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQW5kUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZTEgIHRoZSBmaXJzdCBwcmVkaWNhdGUsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUyICB0aGUgc2Vjb25kIHByZWRpY2F0ZSwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YW5kPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBhbmRQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZTEsIFByZWRpY2F0ZSBwcmVkaWNhdGUyKSB7Ci0gICAgICAgIHJldHVybiBBbmRQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlMSwgcHJlZGljYXRlMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBvbmx5IGlmIGFsbCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJlZGljYXRlcyBhcmUgdHJ1ZS4KLSAgICAgKiBJZiB0aGUgYXJyYXkgb2YgcHJlZGljYXRlcyBpcyBlbXB0eSwgdGhlbiB0aGlzIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQWxsUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIGFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2ssIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmFsbDwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwcmVkaWNhdGUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBhbGxQcmVkaWNhdGUoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICByZXR1cm4gQWxsUHJlZGljYXRlLmdldEluc3RhbmNlKHByZWRpY2F0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgb25seSBpZiBhbGwgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHByZWRpY2F0ZXMgYXJlIHRydWUuIFRoZSBwcmVkaWNhdGVzIGFyZSBjaGVja2VkIGluIGl0ZXJhdG9yIG9yZGVyLgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIG9mIHByZWRpY2F0ZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkFsbFByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhIGNvbGxlY3Rpb24gb2YgcHJlZGljYXRlcyB0byBjaGVjaywgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YWxsPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlcyBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBhbGxQcmVkaWNhdGUoQ29sbGVjdGlvbiBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIHJldHVybiBBbGxQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHByZWRpY2F0ZXMgYXJlIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuT3JQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMSAgdGhlIGZpcnN0IHByZWRpY2F0ZSwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZTIgIHRoZSBzZWNvbmQgcHJlZGljYXRlLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5vcjwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgb3JQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZTEsIFByZWRpY2F0ZSBwcmVkaWNhdGUyKSB7Ci0gICAgICAgIHJldHVybiBPclByZWRpY2F0ZS5nZXRJbnN0YW5jZShwcmVkaWNhdGUxLCBwcmVkaWNhdGUyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUHJlZGljYXRlIHRoYXQgcmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJlZGljYXRlcyBhcmUgdHJ1ZS4KLSAgICAgKiBJZiB0aGUgYXJyYXkgb2YgcHJlZGljYXRlcyBpcyBlbXB0eSwgdGhlbiB0aGlzIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkFueVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5hbnk8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgYW55UHJlZGljYXRlKFByZWRpY2F0ZVtdIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgcmV0dXJuIEFueVByZWRpY2F0ZS5nZXRJbnN0YW5jZShwcmVkaWNhdGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUHJlZGljYXRlIHRoYXQgcmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJlZGljYXRlcyBhcmUgdHJ1ZS4gVGhlIHByZWRpY2F0ZXMgYXJlIGNoZWNrZWQgaW4gaXRlcmF0b3Igb3JkZXIuCi0gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gb2YgcHJlZGljYXRlcyBpcyBlbXB0eSwgdGhlbiB0aGlzIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkFueVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhIGNvbGxlY3Rpb24gb2YgcHJlZGljYXRlcyB0byBjaGVjaywgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YW55PC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlcyBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBhbnlQcmVkaWNhdGUoQ29sbGVjdGlvbiBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIHJldHVybiBBbnlQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBpZiBvbmUsIGJ1dCBub3QgYm90aCwgb2YgdGhlCi0gICAgICogc3BlY2lmaWVkIHByZWRpY2F0ZXMgYXJlIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuT25lUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZTEgIHRoZSBmaXJzdCBwcmVkaWNhdGUsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUyICB0aGUgc2Vjb25kIHByZWRpY2F0ZSwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+ZWl0aGVyPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBlaXRoZXJQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZTEsIFByZWRpY2F0ZSBwcmVkaWNhdGUyKSB7Ci0gICAgICAgIHJldHVybiBvbmVQcmVkaWNhdGUobmV3IFByZWRpY2F0ZVtdIHsgcHJlZGljYXRlMSwgcHJlZGljYXRlMiB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUHJlZGljYXRlIHRoYXQgcmV0dXJucyB0cnVlIGlmIG9ubHkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwcmVkaWNhdGVzIGFyZSB0cnVlLgotICAgICAqIElmIHRoZSBhcnJheSBvZiBwcmVkaWNhdGVzIGlzIGVtcHR5LCB0aGVuIHRoaXMgcHJlZGljYXRlIHJldHVybnMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuT25lUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIGFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2ssIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm9uZTwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwcmVkaWNhdGUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBvbmVQcmVkaWNhdGUoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICByZXR1cm4gT25lUHJlZGljYXRlLmdldEluc3RhbmNlKHByZWRpY2F0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgaWYgb25seSBvbmUgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHByZWRpY2F0ZXMgYXJlIHRydWUuIFRoZSBwcmVkaWNhdGVzIGFyZSBjaGVja2VkIGluIGl0ZXJhdG9yIG9yZGVyLgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIG9mIHByZWRpY2F0ZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBwcmVkaWNhdGUgcmV0dXJucyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5PbmVQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyAgYSBjb2xsZWN0aW9uIG9mIHByZWRpY2F0ZXMgdG8gY2hlY2ssIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm9uZTwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHByZWRpY2F0ZSBpbiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgb25lUHJlZGljYXRlKENvbGxlY3Rpb24gcHJlZGljYXRlcykgewotICAgICAgICByZXR1cm4gT25lUHJlZGljYXRlLmdldEluc3RhbmNlKHByZWRpY2F0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgaWYgbmVpdGhlciBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHByZWRpY2F0ZXMgYXJlIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTm9uZVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUxICB0aGUgZmlyc3QgcHJlZGljYXRlLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMiAgdGhlIHNlY29uZCBwcmVkaWNhdGUsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm5laXRoZXI8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlciBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIG5laXRoZXJQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZTEsIFByZWRpY2F0ZSBwcmVkaWNhdGUyKSB7Ci0gICAgICAgIHJldHVybiBub25lUHJlZGljYXRlKG5ldyBQcmVkaWNhdGVbXSB7IHByZWRpY2F0ZTEsIHByZWRpY2F0ZTIgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBpZiBub25lIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwcmVkaWNhdGVzIGFyZSB0cnVlLgotICAgICAqIElmIHRoZSBhcnJheSBvZiBwcmVkaWNhdGVzIGlzIGVtcHR5LCB0aGVuIHRoaXMgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Ob25lUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIGFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2ssIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm5vbmU8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgbm9uZVByZWRpY2F0ZShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIHJldHVybiBOb25lUHJlZGljYXRlLmdldEluc3RhbmNlKHByZWRpY2F0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJlZGljYXRlcyBhcmUgdHJ1ZS4gVGhlIHByZWRpY2F0ZXMgYXJlIGNoZWNrZWQgaW4gaXRlcmF0b3Igb3JkZXIuCi0gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gb2YgcHJlZGljYXRlcyBpcyBlbXB0eSwgdGhlbiB0aGlzIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTm9uZVByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhIGNvbGxlY3Rpb24gb2YgcHJlZGljYXRlcyB0byBjaGVjaywgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+bm9uZTwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHByZWRpY2F0ZSBpbiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgbm9uZVByZWRpY2F0ZShDb2xsZWN0aW9uIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgcmV0dXJuIE5vbmVQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByZWRpY2F0ZSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByZWRpY2F0ZQotICAgICAqIHJldHVybnMgZmFsc2UgYW5kIHZpY2UgdmVyc2EuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTm90UHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBub3QKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5ub3Q8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIG5vdFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBOb3RQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvLyBBZGFwdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcmVkaWNhdGUgdGhhdCB3cmFwcyBhIFRyYW5zZm9ybWVyLiBUaGUgVHJhbnNmb3JtZXIgbXVzdAotICAgICAqIHJldHVybiBlaXRoZXIgQm9vbGVhbi5UUlVFIG9yIEJvb2xlYW4uRkFMU0Ugb3RoZXJ3aXNlIGEgUHJlZGljYXRlRXhjZXB0aW9uCi0gICAgICogd2lsbCBiZSB0aHJvd24uCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVHJhbnNmb3JtZXJQcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB3cmFwLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lciB3cmFwcGluZyBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGFzUHJlZGljYXRlKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lclByZWRpY2F0ZS5nZXRJbnN0YW5jZSh0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLy8gTnVsbCBoYW5kbGVycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBQcmVkaWNhdGUgdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBpbnB1dCBvYmplY3QgaXMgbnVsbCwgCi0gICAgICogb3RoZXJ3aXNlIGl0IGNhbGxzIHRoZSBzcGVjaWZpZWQgUHJlZGljYXRlLiBUaGlzIGFsbG93cyBudWxsIGhhbmRsaW5nIAotICAgICAqIGJlaGF2aW91ciB0byBiZSBhZGRlZCB0byBQcmVkaWNhdGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBudWxscy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5OdWxsSXNFeGNlcHRpb25QcmVkaWNhdGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHdyYXAsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGUgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBudWxsSXNFeGNlcHRpb25QcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZSl7Ci0gICAgICAgIHJldHVybiBOdWxsSXNFeGNlcHRpb25QcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgUHJlZGljYXRlIHRoYXQgcmV0dXJucyBmYWxzZSBpZiB0aGUgaW5wdXQgb2JqZWN0IGlzIG51bGwsIG90aGVyd2lzZQotICAgICAqIGl0IGNhbGxzIHRoZSBzcGVjaWZpZWQgUHJlZGljYXRlLiBUaGlzIGFsbG93cyBudWxsIGhhbmRsaW5nIGJlaGF2aW91ciB0bwotICAgICAqIGJlIGFkZGVkIHRvIFByZWRpY2F0ZXMgdGhhdCBkb24ndCBzdXBwb3J0IG51bGxzLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk51bGxJc0ZhbHNlUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB3cmFwLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgbnVsbElzRmFsc2VQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZSl7Ci0gICAgICAgIHJldHVybiBOdWxsSXNGYWxzZVByZWRpY2F0ZS5nZXRJbnN0YW5jZShwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBQcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IG9iamVjdCBpcyBudWxsLCBvdGhlcndpc2UKLSAgICAgKiBpdCBjYWxscyB0aGUgc3BlY2lmaWVkIFByZWRpY2F0ZS4gVGhpcyBhbGxvd3MgbnVsbCBoYW5kbGluZyBiZWhhdmlvdXIgdG8KLSAgICAgKiBiZSBhZGRlZCB0byBQcmVkaWNhdGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBudWxscy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5OdWxsSXNUcnVlUHJlZGljYXRlCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB3cmFwLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgbnVsbElzVHJ1ZVByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZGljYXRlKXsKLSAgICAgICAgcmV0dXJuIE51bGxJc1RydWVQcmVkaWNhdGUuZ2V0SW5zdGFuY2UocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvLyBUcmFuc2Zvcm1lZAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJlZGljYXRlIHRoYXQgdHJhbnNmb3JtcyB0aGUgaW5wdXQgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0Ci0gICAgICogdG8gdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5UcmFuc2Zvcm1lZFByZWRpY2F0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIGNhbGwgZmlyc3QKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIGNhbGwgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNmb3JtZXIgb3IgdGhlIHByZWRpY2F0ZSBpcyBudWxsCi0JICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgdHJhbnNmb3JtZWRQcmVkaWNhdGUoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVkUHJlZGljYXRlLmdldEluc3RhbmNlKHRyYW5zZm9ybWVyLCBwcmVkaWNhdGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByaW9yaXR5UXVldWUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Qcmlvcml0eVF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5YzRmNTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1ByaW9yaXR5UXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIGNvbGxlY3Rpb24gZm9yIHByaW9yaXR5IHF1ZXVlcywgd2hpY2ggY2FuIGluc2VydCwgcGVlayBhbmQgcG9wLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3cgcmVwbGFjZWQgYnkgdGhlIDxjb2RlPkJ1ZmZlcjwvY29kZT4gaW50ZXJmYWNlLgotICoKLSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHRoZSBCdWZmZXIgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbnMgaW4gYnVmZmVyIHN1YnBhY2thZ2UuCi0gKiAgRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDEuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgRG9uYWxkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpb3JpdHlRdWV1ZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgYWxsIGVsZW1lbnRzIGZyb20gcXVldWUuCi0gICAgICovCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLyoqCi0gICAgICogVGVzdCBpZiBxdWV1ZSBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBxdWV1ZSBpcyBlbXB0eSBlbHNlIGZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNFbXB0eSgpOwotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGFuIGVsZW1lbnQgaW50byBxdWV1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGluc2VydGVkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPmVsZW1lbnQ8L2NvZGU+J3MKLSAgICAgKiB0eXBlIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgY29tcGFyZWQgdG8gb3RoZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIHRvCi0gICAgICogZGV0ZXJtaW5lIGl0cyByZWxhdGl2ZSBwcmlvcml0eS4gIAotICAgICAqLwotICAgIHZvaWQgaW5zZXJ0KE9iamVjdCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBlbGVtZW50IG9uIHRvcCBvZiBoZWFwIGJ1dCBkb24ndCByZW1vdmUgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRvcCBvZiBoZWFwCi0gICAgICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5pc0VtcHR5KCkgPT0gdHJ1ZTwvY29kZT4KLSAgICAgKi8KLSAgICBPYmplY3QgcGVlaygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGVsZW1lbnQgb24gdG9wIG9mIGhlYXAgYW5kIHJlbW92ZSBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdG9wIG9mIGhlYXAKLSAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmlzRW1wdHkoKSA9PSB0cnVlPC9jb2RlPgotICAgICAqLwotICAgIE9iamVjdCBwb3AoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Qcm94eU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Byb3h5TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3MjA0ODIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Byb3h5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqIAotICogPHA+VGhpcyA8Y29kZT5NYXA8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+TWFwPC9jb2RlPgotICogaW1wbGVtZW50YXRpb24sIHVzaW5nIHRoZSB3cmFwcGVkIGluc3RhbmNlIGZvciBpdHMgZGVmYXVsdAotICogaW1wbGVtZW50YXRpb24uICBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBmcmFtZXdvcmsgb24gd2hpY2ggdG8KLSAqIGJ1aWxkIHRvIGV4dGVuc2lvbnMgZm9yIGl0cyB3cmFwcGVkIDxjb2RlPk1hcDwvY29kZT4gb2JqZWN0IHdoaWNoCi0gKiB3b3VsZCBiZSB1bmF2YWlsYWJsZSBvciBpbmNvbnZlbmllbnQgdmlhIHN1Yi1jbGFzc2luZyAoYnV0IHVzYWJsZQotICogdmlhIGNvbXBvc2l0aW9uKS48L3A+Ci0gKiAKLSAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nIHdpdGgKLSAqIHtAbGluayAjZW50cnlTZXQoKX0sIHtAbGluayAja2V5U2V0KCl9IG9yIHtAbGluayAjdmFsdWVzKCl9LiBJbnN0ZWFkCi0gKiBpdCBzaW1wbHkgcmV0dXJucyB0aGUgc2V0L2NvbGxlY3Rpb24gZnJvbSB0aGUgd3JhcHBlZCBtYXAuIFRoaXMgbWF5IGJlCi0gKiB1bmRlc2lyYWJsZSwgZm9yIGV4YW1wbGUgaWYgeW91IGFyZSB0cnlpbmcgdG8gd3JpdGUgYSB2YWxpZGF0aW5nCi0gKiBpbXBsZW1lbnRhdGlvbiBpdCB3b3VsZCBwcm92aWRlIGEgbG9vcGhvbGUgYXJvdW5kIHRoZSB2YWxpZGF0aW9uLiBCdXQsCi0gKiB5b3UgbWlnaHQgd2FudCB0aGF0IGxvb3Bob2xlLCBzbyB0aGlzIGNsYXNzIGlzIGtlcHQgc2ltcGxlLjwvcD4KLSAqCi0gKiBAZGVwcmVjYXRlZCBNb3ZlZCB0byBtYXAgc3VicGFja2FnZSBhcyBBYnN0cmFjdE1hcERlY29yYXRvci4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHY0LjAuCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIERhbmllbCBSYWxsCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJveHlNYXAgaW1wbGVtZW50cyBNYXAgewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5NYXA8L2NvZGU+IHRvIGRlbGVnYXRlIHRvLgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgbWFwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgbWFwIHRvIGRlbGVnYXRlIHRvLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgbWFwIGlzIHVzZWQgZm9yIGRlbGVnYXRpb24sIGFuZCBpcyBub3QgY29waWVkLiBUaGlzIGlzCi0gICAgICogZGlmZmVyZW50IHRvIHRoZSBub3JtYWwgdXNlIG9mIGEgPGNvZGU+TWFwPC9jb2RlPiBwYXJhbWV0ZXIgaW4KLSAgICAgKiBjb2xsZWN0aW9ucyBjb25zdHJ1Y3RvcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgPGNvZGU+TWFwPC9jb2RlPiB0byBkZWxlZ2F0ZSB0bwotICAgICAqLwotICAgIHB1YmxpYyBQcm94eU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHRoaXMubWFwID0gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIE1hcCNjbGVhcigpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1hcC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIE1hcCNjb250YWluc0tleShPYmplY3QpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI2NvbnRhaW5zVmFsdWUoT2JqZWN0KX0gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI2VudHJ5U2V0KCl9IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI2VxdWFscyhPYmplY3QpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBtKSB7Ci0gICAgICAgIHJldHVybiBtYXAuZXF1YWxzKG0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBNYXAjaGFzaENvZGUoKX0gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBNYXAjaXNFbXB0eSgpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI2tleVNldCgpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI3B1dChPYmplY3QsT2JqZWN0KX0gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBNYXAjcHV0QWxsKE1hcCl9IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKLSAgICAgICAgbWFwLnB1dEFsbCh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBNYXAjcmVtb3ZlKE9iamVjdCl9IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI3NpemUoKX0gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTWFwI3ZhbHVlcygpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICByZXR1cm4gbWFwLnZhbHVlcygpOwotICAgIH0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1JlZmVyZW5jZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MGYwNDM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZWZlcmVuY2VNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuRGVmYXVsdE1hcEVudHJ5OwotCi0vKioKLSAqICBIYXNoLWJhc2VkIHtAbGluayBNYXB9IGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzCi0gKiAgbWFwcGluZ3MgdG8gYmUgcmVtb3ZlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuPHA+Ci0gKgotICogIFdoZW4geW91IGNvbnN0cnVjdCBhIDxjb2RlPlJlZmVyZW5jZU1hcDwvY29kZT4sIHlvdSBjYW4gCi0gKiAgc3BlY2lmeSB3aGF0IGtpbmQgb2YgcmVmZXJlbmNlcyBhcmUgdXNlZCB0byBzdG9yZSB0aGUKLSAqICBtYXAncyBrZXlzIGFuZCB2YWx1ZXMuICBJZiBub24taGFyZCByZWZlcmVuY2VzIGFyZSAKLSAqICB1c2VkLCB0aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBjYW4gcmVtb3ZlIG1hcHBpbmdzCi0gKiAgaWYgYSBrZXkgb3IgdmFsdWUgYmVjb21lcyB1bnJlYWNoYWJsZSwgb3IgaWYgdGhlIAotICogIEpWTSdzIG1lbW9yeSBpcyBydW5uaW5nIGxvdy4gIEZvciBpbmZvcm1hdGlvbiBvbiBob3cKLSAqICB0aGUgZGlmZmVyZW50IHJlZmVyZW5jZSB0eXBlcyBiZWhhdmUsIHNlZQotICogIHtAbGluayBSZWZlcmVuY2V9LjxwPgotICoKLSAqICBEaWZmZXJlbnQgdHlwZXMgb2YgcmVmZXJlbmNlcyBjYW4gYmUgc3BlY2lmaWVkIGZvciBrZXlzCi0gKiAgYW5kIHZhbHVlcy4gIFRoZSBrZXlzIGNhbiBiZSBjb25maWd1cmVkIHRvIGJlIHdlYWsgYnV0Ci0gKiAgdGhlIHZhbHVlcyBoYXJkLCBpbiB3aGljaCBjYXNlIHRoaXMgY2xhc3Mgd2lsbCBiZWhhdmUKLSAqICBsaWtlIGEgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC9kb2NzL2FwaS9qYXZhL3V0aWwvV2Vha0hhc2hNYXAuaHRtbCI+Ci0gKiAgPGNvZGU+V2Vha0hhc2hNYXA8L2NvZGU+PC9hPi4gIEhvd2V2ZXIsIHlvdQotICogIGNhbiBhbHNvIHNwZWNpZnkgaGFyZCBrZXlzIGFuZCB3ZWFrIHZhbHVlcywgb3IgYW55IG90aGVyCi0gKiAgY29tYmluYXRpb24uICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VzIGhhcmQga2V5cwotICogIGFuZCBzb2Z0IHZhbHVlcywgcHJvdmlkaW5nIGEgbWVtb3J5LXNlbnNpdGl2ZSBjYWNoZS48cD4KLSAqCi0gKiAgVGhlIGFsZ29yaXRobXMgdXNlZCBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRob3NlCi0gKiAgaW4ge0BsaW5rIGphdmEudXRpbC5IYXNoTWFwfS4gIEluIHBhcnRpY3VsYXIsIHlvdSAKLSAqICBjYW4gc3BlY2lmeSBhIGxvYWQgZmFjdG9yIGFuZCBjYXBhY2l0eSB0byBzdWl0IHlvdXIKLSAqICBuZWVkcy4gIEFsbCBvcHRpb25hbCB7QGxpbmsgTWFwfSBvcGVyYXRpb25zIGFyZSAKLSAqICBzdXBwb3J0ZWQuPHA+Ci0gKgotICogIEhvd2V2ZXIsIHRoaXMge0BsaW5rIE1hcH0gaW1wbGVtZW50YXRpb24gZG9lcyA8ST5ub3Q8L0k+Ci0gKiAgYWxsb3cgbnVsbCBlbGVtZW50cy4gIEF0dGVtcHRpbmcgdG8gYWRkIGEgbnVsbCBrZXkgb3IKLSAqICBvciBhIG51bGwgdmFsdWUgdG8gdGhlIG1hcCB3aWxsIHJhaXNlIGEgCi0gKiAgPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+LjxwPgotICoKLSAqICBBcyB1c3VhbCwgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLiAgWW91Ci0gKiAgY2FuIHVzZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcH0gdG8gCi0gKiAgcHJvdmlkZSBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGEgPGNvZGU+UmVmZXJlbmNlTWFwPC9jb2RlPi4KLSAqCi0gKiBAc2VlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlCi0gKiAKLSAqIEBkZXByZWNhdGVkIE1vdmVkIHRvIG1hcCBzdWJwYWNrYWdlLiBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqIAotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZU1hcCBleHRlbmRzIEFic3RyYWN0TWFwIHsKLQotICAgIC8qKgotICAgICAqICBGb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM3MDYwMTMxNDM4MDkyMjM2OEw7Ci0KLQotICAgIC8qKgotICAgICAqICBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgaGFyZCByZWZlcmVuY2VzIHNob3VsZCBiZSB1c2VkLgotICAgICAqLwotICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEhBUkQgPSAwOwotCi0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHNvZnQgcmVmZXJlbmNlcyBzaG91bGQgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTT0ZUID0gMTsKLQotCi0gICAgLyoqCi0gICAgICogIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB3ZWFrIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgV0VBSyA9IDI7Ci0KLQotICAgIC8vIC0tLSBzZXJpYWxpemVkIGluc3RhbmNlIHZhcmlhYmxlczoKLQotCi0gICAgLyoqCi0gICAgICogIFRoZSByZWZlcmVuY2UgdHlwZSBmb3Iga2V5cy4gIE11c3QgYmUgSEFSRCwgU09GVCwgV0VBSy4KLSAgICAgKiAgTm90ZTogSSBvcmlnaW5hbGx5IG1hcmtlZCB0aGlzIGZpZWxkIGFzIGZpbmFsLCBidXQgdGhlbiB0aGlzIGNsYXNzCi0gICAgICogICBkaWRuJ3QgY29tcGlsZSB1bmRlciBKREsxLjIuMi4KLSAgICAgKiAgQHNlcmlhbAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGtleVR5cGU7Ci0KLQotICAgIC8qKgotICAgICAqICBUaGUgcmVmZXJlbmNlIHR5cGUgZm9yIHZhbHVlcy4gIE11c3QgYmUgSEFSRCwgU09GVCwgV0VBSy4KLSAgICAgKiAgTm90ZTogSSBvcmlnaW5hbGx5IG1hcmtlZCB0aGlzIGZpZWxkIGFzIGZpbmFsLCBidXQgdGhlbiB0aGlzIGNsYXNzCi0gICAgICogICBkaWRuJ3QgY29tcGlsZSB1bmRlciBKREsxLjIuMi4KLSAgICAgKiAgQHNlcmlhbAotICAgICAqLwotICAgIHByaXZhdGUgaW50IHZhbHVlVHlwZTsKLQotCi0gICAgLyoqCi0gICAgICogIFRoZSB0aHJlc2hvbGQgdmFyaWFibGUgaXMgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZwotICAgICAqICB0YWJsZS5sZW5ndGggYW5kIGxvYWRGYWN0b3IuICAKLSAgICAgKiAgTm90ZTogSSBvcmlnaW5hbGx5IG1hcmtlZCB0aGlzIGZpZWxkIGFzIGZpbmFsLCBidXQgdGhlbiB0aGlzIGNsYXNzCi0gICAgICogICBkaWRuJ3QgY29tcGlsZSB1bmRlciBKREsxLjIuMi4KLSAgICAgKiAgQHNlcmlhbAotICAgICAqLwotICAgIHByaXZhdGUgZmxvYXQgbG9hZEZhY3RvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG91bGQgdGhlIHZhbHVlIGJlIGF1dG9tYXRpY2FsbHkgcHVyZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQga2V5IGhhcyBiZWVuIGNvbGxlY3RlZD8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHVyZ2VWYWx1ZXMgPSBmYWxzZTsKLQotCi0gICAgLy8gLS0gTm9uLXNlcmlhbGl6ZWQgaW5zdGFuY2UgdmFyaWFibGVzCi0KLSAgICAvKioKLSAgICAgKiAgUmVmZXJlbmNlUXVldWUgdXNlZCB0byBlbGltaW5hdGUgc3RhbGUgbWFwcGluZ3MuCi0gICAgICogIFNlZSBwdXJnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotCi0KLSAgICAvKioKLSAgICAgKiAgVGhlIGhhc2ggdGFibGUuICBJdHMgbGVuZ3RoIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4gIAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IEVudHJ5W10gdGFibGU7Ci0KLQotICAgIC8qKgotICAgICAqICBOdW1iZXIgb2YgbWFwcGluZ3MgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IHNpemU7Ci0KLQotICAgIC8qKgotICAgICAqICBXaGVuIHNpemUgcmVhY2hlcyB0aHJlc2hvbGQsIHRoZSBtYXAgaXMgcmVzaXplZC4gIAotICAgICAqICBTZWUgcmVzaXplKCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IHRocmVzaG9sZDsKLQotCi0gICAgLyoqCi0gICAgICogIE51bWJlciBvZiB0aW1lcyB0aGlzIG1hcCBoYXMgYmVlbiBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCB2b2xhdGlsZSBpbnQgbW9kQ291bnQ7Ci0KLQotICAgIC8qKgotICAgICAqICBDYWNoZWQga2V5IHNldC4gIE1heSBiZSBudWxsIGlmIGtleSBzZXQgaXMgbmV2ZXIgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0IGtleVNldDsKLQotCi0gICAgLyoqCi0gICAgICogIENhY2hlZCBlbnRyeSBzZXQuICBNYXkgYmUgbnVsbCBpZiBlbnRyeSBzZXQgaXMgbmV2ZXIgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0IGVudHJ5U2V0OwotCi0KLSAgICAvKioKLSAgICAgKiAgQ2FjaGVkIHZhbHVlcy4gIE1heSBiZSBudWxsIGlmIHZhbHVlcygpIGlzIG5ldmVyIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IENvbGxlY3Rpb24gdmFsdWVzOwotCi0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqICB1c2UgaGFyZCByZWZlcmVuY2VzIHRvIGtleXMgYW5kIHNvZnQgcmVmZXJlbmNlcyB0byB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZU1hcCgpIHsKLSAgICAgICAgdGhpcyhIQVJELCBTT0ZUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqICB1c2UgdGhlIHNwZWNpZmllZCB0eXBlcyBvZiByZWZlcmVuY2VzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciBrZXlzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqICBAcGFyYW0gcHVyZ2VWYWx1ZXMgc2hvdWxkIHRoZSB2YWx1ZSBiZSBhdXRvbWF0aWNhbGx5IHB1cmdlZCB3aGVuIHRoZSAKLSAgICAgKiAgIGtleSBpcyBnYXJiYWdlIGNvbGxlY3RlZCAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLCBib29sZWFuIHB1cmdlVmFsdWVzKSB7Ci0gICAgICAgIHRoaXMoa2V5VHlwZSwgdmFsdWVUeXBlKTsKLSAgICAgICAgdGhpcy5wdXJnZVZhbHVlcyA9IHB1cmdlVmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlZmVyZW5jZU1hcDwvY29kZT4gdGhhdCB3aWxsCi0gICAgICogIHVzZSB0aGUgc3BlY2lmaWVkIHR5cGVzIG9mIHJlZmVyZW5jZXMuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGtleVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIGtleXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiAgQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3IgdmFsdWVzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZU1hcChpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSkgewotICAgICAgICB0aGlzKGtleVR5cGUsIHZhbHVlVHlwZSwgMTYsIDAuNzVmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHdpdGggdGhlCi0gICAgICogIHNwZWNpZmllZCByZWZlcmVuY2UgdHlwZXMsIGxvYWQgZmFjdG9yIGFuZCBpbml0aWFsCi0gICAgICogIGNhcGFjaXR5LgotICAgICAqCi0gICAgICogIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciBrZXlzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqICBAcGFyYW0gY2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IGZvciB0aGUgbWFwCi0gICAgICogIEBwYXJhbSBsb2FkRmFjdG9yICB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBtYXAKLSAgICAgKiAgQHBhcmFtIHB1cmdlVmFsdWVzIHNob3VsZCB0aGUgdmFsdWUgYmUgYXV0b21hdGljYWxseSBwdXJnZWQgd2hlbiB0aGUgCi0gICAgICogICBrZXkgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgCi0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZU1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZVR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcGFjaXR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvYWRGYWN0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwdXJnZVZhbHVlcykgewotICAgICAgICB0aGlzKGtleVR5cGUsIHZhbHVlVHlwZSwgY2FwYWNpdHksIGxvYWRGYWN0b3IpOwotICAgICAgICB0aGlzLnB1cmdlVmFsdWVzID0gcHVyZ2VWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlTWFwPC9jb2RlPiB3aXRoIHRoZQotICAgICAqICBzcGVjaWZpZWQgcmVmZXJlbmNlIHR5cGVzLCBsb2FkIGZhY3RvciBhbmQgaW5pdGlhbAotICAgICAqICBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqICBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3Iga2V5czsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqICBAcGFyYW0gdmFsdWVUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciB2YWx1ZXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiAgQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIG1hcAotICAgICAqICBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZU1hcChpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSwgaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgdmVyaWZ5KCJrZXlUeXBlIiwga2V5VHlwZSk7Ci0gICAgICAgIHZlcmlmeSgidmFsdWVUeXBlIiwgdmFsdWVUeXBlKTsKLQotICAgICAgICBpZiAoY2FwYWNpdHkgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobG9hZEZhY3RvciA8PSAwLjBmKSB8fCAobG9hZEZhY3RvciA+PSAxLjBmKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9hZCBmYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEuIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotICAgICAgICB0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQotICAgICAgICBpbnQgdiA9IDE7Ci0gICAgICAgIHdoaWxlICh2IDwgY2FwYWNpdHkpIHYgKj0gMjsKLQotICAgICAgICB0aGlzLnRhYmxlID0gbmV3IEVudHJ5W3ZdOwotICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotICAgICAgICB0aGlzLnRocmVzaG9sZCA9IChpbnQpKHYgKiBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLQotICAgIC8vIHVzZWQgYnkgY29uc3RydWN0b3IKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeShTdHJpbmcgbmFtZSwgaW50IHR5cGUpIHsKLSAgICAgICAgaWYgKCh0eXBlIDwgSEFSRCkgfHwgKHR5cGUgPiBXRUFLKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgCi0gICAgICAgICAgICAgICAiIG11c3QgYmUgSEFSRCwgU09GVCwgV0VBSy4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIFdyaXRlcyB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bwotICAgICAqICBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiB0aGUgc3RyZWFtIHJhaXNlcyBpdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZUludCh0YWJsZS5sZW5ndGgpOwotCi0gICAgICAgIC8vIEhhdmUgdG8gdXNlIG51bGwtdGVybWluYXRlZCBsaXN0IGJlY2F1c2Ugc2l6ZSBtaWdodCBzaHJpbmsKLSAgICAgICAgLy8gZHVyaW5nIGl0ZXJhdGlvbgotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUmVhZHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqICBAcGFyYW0gaW5wICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICAgICAqICBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiB0aGUgc3RyZWFtIHJhaXNlcyBpdAotICAgICAqICBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gIGlmIHRoZSBzdHJlYW0gcmFpc2VzIGl0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW5wKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbnAuZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgdGFibGUgPSBuZXcgRW50cnlbaW5wLnJlYWRJbnQoKV07Ci0gICAgICAgIHRocmVzaG9sZCA9IChpbnQpKHRhYmxlLmxlbmd0aCAqIGxvYWRGYWN0b3IpOwotICAgICAgICBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwotICAgICAgICBPYmplY3Qga2V5ID0gaW5wLnJlYWRPYmplY3QoKTsKLSAgICAgICAgd2hpbGUgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnAucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgcHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gaW5wLnJlYWRPYmplY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdHMgYSByZWZlcmVuY2Ugb2YgdGhlIGdpdmVuIHR5cGUgdG8gdGhlIGdpdmVuIAotICAgICAqICByZWZlcmVudC4gIFRoZSByZWZlcmVuY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBxdWV1ZQotICAgICAqICBmb3IgbGF0ZXIgcHVyZ2luZy4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdHlwZSAgSEFSRCwgU09GVCBvciBXRUFLCi0gICAgICogIEBwYXJhbSByZWZlcmVudCAgdGhlIG9iamVjdCB0byByZWZlciB0bwotICAgICAqICBAcGFyYW0gaGFzaCAgdGhlIGhhc2ggY29kZSBvZiB0aGUgPEk+a2V5PC9JPiBvZiB0aGUgbWFwcGluZzsKLSAgICAgKiAgICB0aGlzIG51bWJlciBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSByZWZlcmVudC5oYXNoQ29kZSgpIGlmCi0gICAgICogICAgdGhlIHJlZmVyZW50IHJlcHJlc2VudHMgYSB2YWx1ZSBhbmQgbm90IGEga2V5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgdG9SZWZlcmVuY2UoaW50IHR5cGUsIE9iamVjdCByZWZlcmVudCwgaW50IGhhc2gpIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEhBUkQ6IHJldHVybiByZWZlcmVudDsKLSAgICAgICAgICAgIGNhc2UgU09GVDogcmV0dXJuIG5ldyBTb2Z0UmVmKGhhc2gsIHJlZmVyZW50LCBxdWV1ZSk7Ci0gICAgICAgICAgICBjYXNlIFdFQUs6IHJldHVybiBuZXcgV2Vha1JlZihoYXNoLCByZWZlcmVudCwgcXVldWUpOwotICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleS4KLSAgICAgKgotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IG9mIHRoZSBlbnRyeSB0byBsb29rIHVwCi0gICAgICogIEByZXR1cm4gIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXksIG9yIG51bGwKLSAgICAgKiAgICBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGlzIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgRW50cnkgZ2V0RW50cnkoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBpbnQgaGFzaCA9IGtleS5oYXNoQ29kZSgpOwotICAgICAgICBpbnQgaW5kZXggPSBpbmRleEZvcihoYXNoKTsKLSAgICAgICAgZm9yIChFbnRyeSBlbnRyeSA9IHRhYmxlW2luZGV4XTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyeS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoKGVudHJ5Lmhhc2ggPT0gaGFzaCkgJiYga2V5LmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgQ29udmVydHMgdGhlIGdpdmVuIGhhc2ggY29kZSBpbnRvIGFuIGluZGV4IGludG8gdGhlCi0gICAgICogIGhhc2ggdGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW5kZXhGb3IoaW50IGhhc2gpIHsKLSAgICAgICAgLy8gbWl4IHRoZSBiaXRzIHRvIGF2b2lkIGJ1Y2tldCBjb2xsaXNpb25zLi4uCi0gICAgICAgIGhhc2ggKz0gfihoYXNoIDw8IDE1KTsKLSAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gMTApOwotICAgICAgICBoYXNoICs9IChoYXNoIDw8IDMpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiA2KTsKLSAgICAgICAgaGFzaCArPSB+KGhhc2ggPDwgMTEpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiAxNik7Ci0gICAgICAgIHJldHVybiBoYXNoICYgKHRhYmxlLmxlbmd0aCAtIDEpOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiAgUmVzaXplcyB0aGlzIGhhc2ggdGFibGUgYnkgZG91YmxpbmcgaXRzIGNhcGFjaXR5LgotICAgICAqICBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGFzIGVudHJpZXMgbXVzdAotICAgICAqICBiZSBjb3BpZWQgZnJvbSB0aGUgb2xkIHNtYWxsZXIgdGFibGUgdG8gdGhlIG5ldyAKLSAgICAgKiAgYmlnZ2VyIHRhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNpemUoKSB7Ci0gICAgICAgIEVudHJ5W10gb2xkID0gdGFibGU7Ci0gICAgICAgIHRhYmxlID0gbmV3IEVudHJ5W29sZC5sZW5ndGggKiAyXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRW50cnkgbmV4dCA9IG9sZFtpXTsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBpbmRleEZvcihlbnRyeS5oYXNoKTsKLSAgICAgICAgICAgICAgICBlbnRyeS5uZXh0ID0gdGFibGVbaW5kZXhdOwotICAgICAgICAgICAgICAgIHRhYmxlW2luZGV4XSA9IGVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkW2ldID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSh0YWJsZS5sZW5ndGggKiBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogUHVyZ2VzIHN0YWxlIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCi0gICAgICogPHA+Ci0gICAgICogT3JkaW5hcmlseSwgc3RhbGUgbWFwcGluZ3MgYXJlIG9ubHkgcmVtb3ZlZCBkdXJpbmcKLSAgICAgKiBhIHdyaXRlIG9wZXJhdGlvbiwgYWx0aG91Z2ggdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBib3RoCi0gICAgICogcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgc3RhdGUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBzeW5jaHJvbml6ZWQhICBTcGVjaWFsCi0gICAgICogY2FyZSBtdXN0IGJlIHRha2VuIGlmLCBmb3IgaW5zdGFuY2UsIHlvdSB3YW50IHN0YWxlCi0gICAgICogbWFwcGluZ3MgdG8gYmUgcmVtb3ZlZCBvbiBhIHBlcmlvZGljIGJhc2lzIGJ5IHNvbWUKLSAgICAgKiBiYWNrZ3JvdW5kIHRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHVyZ2UoKSB7Ci0gICAgICAgIFJlZmVyZW5jZSByZWYgPSBxdWV1ZS5wb2xsKCk7Ci0gICAgICAgIHdoaWxlIChyZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgcHVyZ2UocmVmKTsKLSAgICAgICAgICAgIHJlZiA9IHF1ZXVlLnBvbGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHB1cmdlKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgLy8gVGhlIGhhc2hDb2RlIG9mIHRoZSByZWZlcmVuY2UgaXMgdGhlIGhhc2hDb2RlIG9mIHRoZQotICAgICAgICAvLyBtYXBwaW5nIGtleSwgZXZlbiBpZiB0aGUgcmVmZXJlbmNlIHJlZmVycyB0byB0aGUgCi0gICAgICAgIC8vIG1hcHBpbmcgdmFsdWUuLi4KLSAgICAgICAgaW50IGhhc2ggPSByZWYuaGFzaENvZGUoKTsKLSAgICAgICAgaW50IGluZGV4ID0gaW5kZXhGb3IoaGFzaCk7Ci0gICAgICAgIEVudHJ5IHByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgRW50cnkgZW50cnkgPSB0YWJsZVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkucHVyZ2UocmVmKSkgewotICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB0YWJsZVtpbmRleF0gPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgICAgIGVsc2UgcHJldmlvdXMubmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICAgICAgdGhpcy5zaXplLS07Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldmlvdXMgPSBlbnRyeTsKLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqICBAcmV0dXJuICB0aGUgc2l6ZSBvZiB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcHVyZ2UoKTsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1hcCBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFwIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcHVyZ2UoKTsKLSAgICAgICAgcmV0dXJuIHNpemUgPT0gMDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBnaXZlbiBrZXkuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBrZXkgaXMgaW4gdGhpcyBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHB1cmdlKCk7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gZ2V0RW50cnkoa2V5KTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSwgaWYgYW55LgotICAgICAqCi0gICAgICogIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgaWYgdGhlIGtleSBtYXBzIHRvIG5vIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBwdXJnZSgpOwotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgQXNzb2NpYXRlcyB0aGUgZ2l2ZW4ga2V5IHdpdGggdGhlIGdpdmVuIHZhbHVlLjxwPgotICAgICAqICBOZWl0aGVyIHRoZSBrZXkgbm9yIHRoZSB2YWx1ZSBtYXkgYmUgbnVsbC4KLSAgICAgKgotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IG9mIHRoZSBtYXBwaW5nCi0gICAgICogIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIG9mIHRoZSBtYXBwaW5nCi0gICAgICogIEByZXR1cm4gIHRoZSBsYXN0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleSwgb3IgCi0gICAgICogICBudWxsIGlmIG5vIHZhbHVlIHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgICAqICBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciB0aGUga2V5IG9yIHZhbHVlCi0gICAgICogICBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJudWxsIGtleXMgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCB2YWx1ZXMgbm90IGFsbG93ZWQiKTsKLQotICAgICAgICBwdXJnZSgpOwotICAgICAgICBpZiAoc2l6ZSArIDEgPiB0aHJlc2hvbGQpIHJlc2l6ZSgpOwotCi0gICAgICAgIGludCBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIGludCBpbmRleCA9IGluZGV4Rm9yKGhhc2gpOwotICAgICAgICBFbnRyeSBlbnRyeSA9IHRhYmxlW2luZGV4XTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICgoaGFzaCA9PSBlbnRyeS5oYXNoKSAmJiBrZXkuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2l6ZSsrOyAKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAga2V5ID0gdG9SZWZlcmVuY2Uoa2V5VHlwZSwga2V5LCBoYXNoKTsKLSAgICAgICAgdmFsdWUgPSB0b1JlZmVyZW5jZSh2YWx1ZVR5cGUsIHZhbHVlLCBoYXNoKTsKLSAgICAgICAgdGFibGVbaW5kZXhdID0gbmV3IEVudHJ5KGtleSwgaGFzaCwgdmFsdWUsIHRhYmxlW2luZGV4XSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIFJlbW92ZXMgdGhlIGtleSBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgZnJvbSB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqICBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHJlbW92ZQotICAgICAqICBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXksIG9yIG51bGwgaWYKLSAgICAgKiAgIHRoZSBrZXkgd2FzIG5vdCBpbiB0aGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBwdXJnZSgpOwotICAgICAgICBpbnQgaGFzaCA9IGtleS5oYXNoQ29kZSgpOwotICAgICAgICBpbnQgaW5kZXggPSBpbmRleEZvcihoYXNoKTsKLSAgICAgICAgRW50cnkgcHJldmlvdXMgPSBudWxsOwotICAgICAgICBFbnRyeSBlbnRyeSA9IHRhYmxlW2luZGV4XTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICgoaGFzaCA9PSBlbnRyeS5oYXNoKSAmJiBrZXkuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB0YWJsZVtpbmRleF0gPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgICAgIGVsc2UgcHJldmlvdXMubmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICAgICAgdGhpcy5zaXplLS07Ci0gICAgICAgICAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgQ2xlYXJzIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBBcnJheXMuZmlsbCh0YWJsZSwgbnVsbCk7Ci0gICAgICAgIHNpemUgPSAwOwotICAgICAgICB3aGlsZSAocXVldWUucG9sbCgpICE9IG51bGwpOyAvLyBkcmFpbiB0aGUgcXVldWUKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhpcyBtYXAncyBlbnRyaWVzLgotICAgICAqCi0gICAgICogIEByZXR1cm4gYSBzZXQgdmlldyBvZiB0aGlzIG1hcCdzIGVudHJpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBpZiAoZW50cnlTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGVudHJ5U2V0OwotICAgICAgICB9IAotICAgICAgICBlbnRyeVNldCA9IG5ldyBBYnN0cmFjdFNldCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVmZXJlbmNlTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlvOwotICAgICAgICAgICAgICAgIEVudHJ5IGUyID0gZ2V0RW50cnkoZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChlMiAhPSBudWxsKSAmJiBlLmVxdWFscyhlMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gciA9IGNvbnRhaW5zKG8pOwotICAgICAgICAgICAgICAgIGlmIChyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlvOwotICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VNYXAudGhpcy5yZW1vdmUoZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnIpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBFbnRyeSBlID0gKEVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IERlZmF1bHRNYXBFbnRyeShlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShhcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICByZXR1cm4gZW50cnlTZXQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIHNldCB2aWV3IG9mIHRoaXMgbWFwJ3Mga2V5cy4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIGEgc2V0IHZpZXcgb2YgdGhpcyBtYXAncyBrZXlzCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChrZXlTZXQgIT0gbnVsbCkgcmV0dXJuIGtleVNldDsKLSAgICAgICAga2V5U2V0ID0gbmV3IEFic3RyYWN0U2V0KCkgewotICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBSZWZlcmVuY2VNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEtleUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zS2V5KG8pOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgICAgICAgICAgIE9iamVjdCByID0gUmVmZXJlbmNlTWFwLnRoaXMucmVtb3ZlKG8pOwotICAgICAgICAgICAgICAgIHJldHVybiByICE9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgIFJlZmVyZW5jZU1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgYy5hZGQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMudG9BcnJheShhcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiBrZXlTZXQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGlzIG1hcCdzIHZhbHVlcy4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoaXMgbWFwJ3MgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSByZXR1cm4gdmFsdWVzOwotICAgICAgICB2YWx1ZXMgPSBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVmZXJlbmNlTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgYy5hZGQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMudG9BcnJheShhcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0KLSAgICAvLyBJZiBnZXRLZXkoKSBvciBnZXRWYWx1ZSgpIHJldHVybnMgbnVsbCwgaXQgbWVhbnMKLSAgICAvLyB0aGUgbWFwcGluZyBpcyBzdGFsZSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgcHJpdmF0ZSBjbGFzcyBFbnRyeSBpbXBsZW1lbnRzIE1hcC5FbnRyeSwgS2V5VmFsdWUgewotCi0gICAgICAgIE9iamVjdCBrZXk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgaW50IGhhc2g7Ci0gICAgICAgIEVudHJ5IG5leHQ7Ci0KLQotICAgICAgICBwdWJsaWMgRW50cnkoT2JqZWN0IGtleSwgaW50IGhhc2gsIE9iamVjdCB2YWx1ZSwgRW50cnkgbmV4dCkgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGtleVR5cGUgPiBIQVJEKSA/ICgoUmVmZXJlbmNlKWtleSkuZ2V0KCkgOiBrZXk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHZhbHVlVHlwZSA+IEhBUkQpID8gKChSZWZlcmVuY2UpdmFsdWUpLmdldCgpIDogdmFsdWU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgICAgT2JqZWN0IG9sZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWVUeXBlID4gSEFSRCkgKChSZWZlcmVuY2UpdmFsdWUpLmNsZWFyKCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IHRvUmVmZXJlbmNlKHZhbHVlVHlwZSwgb2JqZWN0LCBoYXNoKTsKLSAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG8gPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KW87Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKChrZXkgPT0gbnVsbCkgfHwgKHZhbHVlID09IG51bGwpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4ga2V5LmVxdWFscyhnZXRLZXkoKSkgJiYgdmFsdWUuZXF1YWxzKGdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgT2JqZWN0IHYgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGhhc2ggXiAoKHYgPT0gbnVsbCkgPyAwIDogdi5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRLZXkoKSArICI9IiArIGdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGJvb2xlYW4gcHVyZ2UoUmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgYm9vbGVhbiByID0gKGtleVR5cGUgPiBIQVJEKSAmJiAoa2V5ID09IHJlZik7Ci0gICAgICAgICAgICByID0gciB8fCAoKHZhbHVlVHlwZSA+IEhBUkQpICYmICh2YWx1ZSA9PSByZWYpKTsKLSAgICAgICAgICAgIGlmIChyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtleVR5cGUgPiBIQVJEKSAoKFJlZmVyZW5jZSlrZXkpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlVHlwZSA+IEhBUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgKChSZWZlcmVuY2UpdmFsdWUpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdXJnZVZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLSAgICAgICAgLy8gVGhlc2UgZmllbGRzIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSB0YWJsZS4KLSAgICAgICAgaW50IGluZGV4OwotICAgICAgICBFbnRyeSBlbnRyeTsKLSAgICAgICAgRW50cnkgcHJldmlvdXM7Ci0KLSAgICAgICAgLy8gVGhlc2UgT2JqZWN0IGZpZWxkcyBwcm92aWRlIGhhcmQgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgICAgLy8gY3VycmVudCBhbmQgbmV4dCBlbnRyeTsgdGhpcyBhc3N1cmVzIHRoYXQgaWYgaGFzTmV4dCgpCi0gICAgICAgIC8vIHJldHVybnMgdHJ1ZSwgbmV4dCgpIHdpbGwgYWN0dWFsbHkgcmV0dXJuIGEgdmFsaWQgZWxlbWVudC4KLSAgICAgICAgT2JqZWN0IG5leHRLZXksIG5leHRWYWx1ZTsKLSAgICAgICAgT2JqZWN0IGN1cnJlbnRLZXksIGN1cnJlbnRWYWx1ZTsKLQotICAgICAgICBpbnQgZXhwZWN0ZWRNb2RDb3VudDsKLQotCi0gICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKCkgewotICAgICAgICAgICAgaW5kZXggPSAoc2l6ZSgpICE9IDAgPyB0YWJsZS5sZW5ndGggOiAwKTsKLSAgICAgICAgICAgIC8vIGhhdmUgdG8gZG8gdGhpcyBoZXJlISAgc2l6ZSgpIGludm9jYXRpb24gYWJvdmUKLSAgICAgICAgICAgIC8vIG1heSBoYXZlIGFsdGVyZWQgdGhlIG1vZENvdW50LgotICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCA9IG1vZENvdW50OwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0TnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IGVudHJ5OwotICAgICAgICAgICAgICAgIGludCBpID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICBlID0gdGFibGVbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVudHJ5ID0gZTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50S2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXh0S2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBuZXh0VmFsdWUgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHROdWxsKCkpIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2QoKSB7Ci0gICAgICAgICAgICBpZiAobW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBuZXh0TnVsbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEtleSA9PSBudWxsKSB8fCAobmV4dFZhbHVlID09IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIEVudHJ5IG5leHRFbnRyeSgpIHsgICAgCi0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgaWYgKG5leHROdWxsKCkgJiYgIWhhc05leHQoKSkgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICBjdXJyZW50S2V5ID0gbmV4dEtleTsKLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTsKLSAgICAgICAgICAgIG5leHRLZXkgPSBudWxsOwotICAgICAgICAgICAgbmV4dFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBwcmV2aW91czsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja01vZCgpOwotICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIFJlZmVyZW5jZU1hcC50aGlzLnJlbW92ZShjdXJyZW50S2V5KTsKLSAgICAgICAgICAgIHByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBudWxsOwotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGV4cGVjdGVkTW9kQ291bnQgPSBtb2RDb3VudDsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIFZhbHVlSXRlcmF0b3IgZXh0ZW5kcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgS2V5SXRlcmF0b3IgZXh0ZW5kcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldEtleSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8vIFRoZXNlIHR3byBjbGFzc2VzIHN0b3JlIHRoZSBoYXNoQ29kZSBvZiB0aGUga2V5IG9mCi0gICAgLy8gb2YgdGhlIG1hcHBpbmcsIHNvIHRoYXQgYWZ0ZXIgdGhleSdyZSBkZXF1ZXVlZCBhIHF1aWNrCi0gICAgLy8gbG9va3VwIG9mIHRoZSBidWNrZXQgaW4gdGhlIHRhYmxlIGNhbiBvY2N1ci4KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU29mdFJlZiBleHRlbmRzIFNvZnRSZWZlcmVuY2UgewotICAgICAgICBwcml2YXRlIGludCBoYXNoOwotCi0KLSAgICAgICAgcHVibGljIFNvZnRSZWYoaW50IGhhc2gsIE9iamVjdCByLCBSZWZlcmVuY2VRdWV1ZSBxKSB7Ci0gICAgICAgICAgICBzdXBlcihyLCBxKTsKLSAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2Vha1JlZiBleHRlbmRzIFdlYWtSZWZlcmVuY2UgewotICAgICAgICBwcml2YXRlIGludCBoYXNoOwotCi0KLSAgICAgICAgcHVibGljIFdlYWtSZWYoaW50IGhhc2gsIE9iamVjdCByLCBSZWZlcmVuY2VRdWV1ZSBxKSB7Ci0gICAgICAgICAgICBzdXBlcihyLCBxKTsKLSAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVzZXR0YWJsZUl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvUmVzZXR0YWJsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMWJkYmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqIAotICogRGVmaW5lcyBhbiBpdGVyYXRvciB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIGFuIGluaXRpYWwgc3RhdGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhbiBpdGVyYXRvciB0byBiZSByZXBlYXRlZGx5IHJldXNlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTkgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc2V0dGFibGVJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgaXRlcmF0b3IgYmFjayB0byB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGl0ZXJhdG9yCi0gICAgICogd2FzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVMaXN0SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9SZXNldHRhYmxlTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhNTQ0MTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1Jlc2V0dGFibGVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKiogCi0gKiBEZWZpbmVzIGEgbGlzdCBpdGVyYXRvciB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIGFuIGluaXRpYWwgc3RhdGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhbiBpdGVyYXRvciB0byBiZSByZXBlYXRlZGx5IHJldXNlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc2V0dGFibGVMaXN0SXRlcmF0b3IgZXh0ZW5kcyBMaXN0SXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGl0ZXJhdG9yIGJhY2sgdG8gdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBpdGVyYXRvcgotICAgICAqIHdhcyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2VxdWVuY2VkSGFzaE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzk2MzU0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TZXF1ZW5jZWRIYXNoTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdC5Vbm1vZGlmaWFibGVMaXN0OwotCi0vKioKLSAqIEEgbWFwIG9mIG9iamVjdHMgd2hvc2UgbWFwcGluZyBlbnRyaWVzIGFyZSBzZXF1ZW5jZWQgYmFzZWQgb24gdGhlIG9yZGVyIGluCi0gKiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuICBUaGlzIGRhdGEgc3RydWN0dXJlIGhhcyBmYXN0IDxpPk8oMSk8L2k+IHNlYXJjaAotICogdGltZSwgZGVsZXRpb24gdGltZSwgYW5kIGluc2VydGlvbiB0aW1lLgotICogPHA+Ci0gKiBBbHRob3VnaCB0aGlzIG1hcCBpcyBzZXF1ZW5jZWQsIGl0IGNhbm5vdCBpbXBsZW1lbnQKLSAqIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgaW50ZXJmYWNlIGRlZmluaXRpb25zLgotICogVGhlIHJlbW92ZSBtZXRob2RzIGluIExpc3QgYW5kIE1hcCBoYXZlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIAotICogKHNlZToge0BsaW5rIGphdmEudXRpbC5MaXN0I3JlbW92ZShPYmplY3QpfSBhbmQge0BsaW5rIGphdmEudXRpbC5NYXAjcmVtb3ZlKE9iamVjdCl9KS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUuICBXaGVuIGEgdGhyZWFkIHNhZmUgaW1wbGVtZW50YXRpb24gaXMKLSAqIHJlcXVpcmVkLCB1c2Uge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRNYXAoTWFwKX0gYXMgaXQgaXMgZG9jdW1lbnRlZCwKLSAqIG9yIHVzZSBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gY29udHJvbHMuCi0gKgotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgTGlua2VkTWFwIGFuZCBMaXN0T3JkZXJlZE1hcCBpbiBtYXAgc3VicGFja2FnZS4gRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaW5rZWRNYXAKLSAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MaXN0T3JkZXJlZE1hcAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqIAotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIERhbmllbCBSYWxsCi0gKiBAYXV0aG9yIEhlbm5pbmcgUC4gU2NobWllZGVoYXVzZW4KLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZWRIYXNoTWFwIGltcGxlbWVudHMgTWFwLCBDbG9uZWFibGUsIEV4dGVybmFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5fSB0aGF0IGRvdWJsZXMgYXMgYSBub2RlIGluIHRoZSBsaW5rZWQgbGlzdAotICAgICAqIG9mIHNlcXVlbmNlZCBtYXBwaW5ncy4gIAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5LCBLZXlWYWx1ZSB7Ci0gICAgICAgIC8vIE5vdGU6IFRoaXMgY2xhc3MgY2Fubm90IGVhc2lseSBiZSBtYWRlIGNsb25hYmxlLiAgV2hpbGUgdGhlIGFjdHVhbAotICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBhIGNsb25lIHdvdWxkIGJlIHNpbXBsZSwgZGVmaW5pbmcgdGhlIHNlbWFudGljcyBpcwotICAgICAgICAvLyBkaWZmaWN1bHQuICBJZiBhIHNoYWxsb3cgY2xvbmUgaXMgaW1wbGVtZW50ZWQsIHRoZW4gZW50cnkubmV4dC5wcmV2ICE9Ci0gICAgICAgIC8vIGVudHJ5LCB3aGljaCBpcyB1bmludHVpdGl2ZSBhbmQgcHJvYmFibHkgYnJlYWtzIGFsbCBzb3J0cyBvZiBhc3N1bXB0aW9ucwotICAgICAgICAvLyBpbiBjb2RlIHRoYXQgdXNlcyB0aGlzIGltcGxlbWVudGF0aW9uLiAgSWYgYSBkZWVwIGNsb25lIGlzCi0gICAgICAgIC8vIGltcGxlbWVudGVkLCB0aGVuIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBsaW5rZWQgbGlzdCBpcyBjeWNsaWNhbCAoYXMgaXMKLSAgICAgICAgLy8gdGhlIGNhc2Ugd2l0aCBTZXF1ZW5jZWRIYXNoTWFwKT8gIEl0J3MgaW1wb3NzaWJsZSB0byBrbm93IGluIHRoZSBjbG9uZQotICAgICAgICAvLyB3aGVuIHRvIHN0b3AgY2xvbmluZywgYW5kIHRodXMgeW91IGVuZCB1cCBpbiBhIHJlY3Vyc2l2ZSBsb29wLAotICAgICAgICAvLyBjb250aW51b3VzbHkgY2xvbmluZyB0aGUgIm5leHQiIGluIHRoZSBsaXN0LgotCi0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGtleTsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0KLSAgICAgICAgLy8gcGFja2FnZSBwcml2YXRlIHRvIGFsbG93IHRoZSBTZXF1ZW5jZWRIYXNoTWFwIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZQotICAgICAgICAvLyB0aGVtLgotICAgICAgICBFbnRyeSBuZXh0ID0gbnVsbDsKLSAgICAgICAgRW50cnkgcHJldiA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIEVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwZXIgTWFwLkVudHJ5LmdldEtleSgpCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGVyIE1hcC5FbnRyeS5nZXRWYWx1ZSgpCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBlciBNYXAuRW50cnkuc2V0VmFsdWUoKQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZCBwZXIgYXBpIGRvY3MgZm9yIE1hcC5FbnRyeS5oYXNoQ29kZSgpCi0gICAgICAgICAgICByZXR1cm4gKChnZXRLZXkoKSA9PSBudWxsID8gMCA6IGdldEtleSgpLmhhc2hDb2RlKCkpIF4gKGdldFZhbHVlKCkgPT0gbnVsbCA/IDAgOiBnZXRWYWx1ZSgpLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBvdGhlciA9IChNYXAuRW50cnkpIG9iajsKLQotICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQgcGVyIGFwaSBkb2NzIGZvciBNYXAuRW50cnkuZXF1YWxzKE9iamVjdCkgCi0gICAgICAgICAgICByZXR1cm4gKAotICAgICAgICAgICAgICAgIChnZXRLZXkoKSA9PSBudWxsID8gb3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCA6IGdldEtleSgpLmVxdWFscyhvdGhlci5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgICYmIChnZXRWYWx1ZSgpID09IG51bGwgPyBvdGhlci5nZXRWYWx1ZSgpID09IG51bGwgOiBnZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlsiICsgZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpICsgIl0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhbiBlbXB0eSBzZW50aW5lbCB1c2VkIHRvIGhvbGQgdGhlIGhlYWQgKHNlbnRpbmVsLm5leHQpIGFuZCB0aGUKLSAgICAgKiAgdGFpbCAoc2VudGluZWwucHJldikgb2YgdGhlIGxpc3QuICBUaGUgc2VudGluZWwgaGFzIGEgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAga2V5IGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRyeSBjcmVhdGVTZW50aW5lbCgpIHsKLSAgICAgICAgRW50cnkgcyA9IG5ldyBFbnRyeShudWxsLCBudWxsKTsKLSAgICAgICAgcy5wcmV2ID0gczsKLSAgICAgICAgcy5uZXh0ID0gczsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNlbnRpbmVsIHVzZWQgdG8gaG9sZCB0aGUgaGVhZCBhbmQgdGFpbCBvZiB0aGUgbGlzdCBvZiBlbnRyaWVzLgotICAgICAqLwotICAgIHByaXZhdGUgRW50cnkgc2VudGluZWw7Ci0KLSAgICAvKioKLSAgICAgKiAgTWFwIG9mIGtleXMgdG8gZW50cmllcwotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBlbnRyaWVzOwotCi0gICAgLyoqCi0gICAgICogIEhvbGRzIHRoZSBudW1iZXIgb2YgbW9kaWZpY2F0aW9ucyB0aGF0IGhhdmUgb2NjdXJyZWQgdG8gdGhlIG1hcCwKLSAgICAgKiAgZXhjbHVkaW5nIG1vZGlmaWNhdGlvbnMgbWFkZSB0aHJvdWdoIGEgY29sbGVjdGlvbiB2aWV3J3MgaXRlcmF0b3IKLSAgICAgKiAgKGUuZy4gZW50cnlTZXQoKS5pdGVyYXRvcigpLnJlbW92ZSgpKS4gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYQotICAgICAqICBmYWlsLWZhc3QgYmVoYXZpb3Igd2l0aCB0aGUgaXRlcmF0b3JzLgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgbW9kQ291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgd2l0aCBkZWZhdWx0IGluaXRpYWwgc2l6ZSBhbmQgbG9hZAotICAgICAqICBmYWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNlcXVlbmNlZEhhc2hNYXAoKSB7Ci0gICAgICAgIHNlbnRpbmVsID0gY3JlYXRlU2VudGluZWwoKTsKLSAgICAgICAgZW50cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgc2l6ZSBhbmQKLSAgICAgKiAgZGVmYXVsdCBsb2FkIGZhY3Rvci4KLSAgICAgKgotICAgICAqICBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBmb3IgdGhlIGhhc2ggdGFibGUgCi0gICAgICoKLSAgICAgKiAgQHNlZSBIYXNoTWFwI0hhc2hNYXAoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKGludCBpbml0aWFsU2l6ZSkgewotICAgICAgICBzZW50aW5lbCA9IGNyZWF0ZVNlbnRpbmVsKCk7Ci0gICAgICAgIGVudHJpZXMgPSBuZXcgSGFzaE1hcChpbml0aWFsU2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgc2l6ZSBhbmQKLSAgICAgKiAgbG9hZCBmYWN0b3IuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlIAotICAgICAqCi0gICAgICogIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0gICAgICoKLSAgICAgKiAgQHNlZSBIYXNoTWFwI0hhc2hNYXAoaW50LGZsb2F0KQotICAgICAqLwotICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKGludCBpbml0aWFsU2l6ZSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgICAgICBzZW50aW5lbCA9IGNyZWF0ZVNlbnRpbmVsKCk7Ci0gICAgICAgIGVudHJpZXMgPSBuZXcgSGFzaE1hcChpbml0aWFsU2l6ZSwgbG9hZEZhY3Rvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgYW5kIGFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZQotICAgICAqICBzcGVjaWZpZWQgbWFwLiAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBtYXBwaW5ncyBpbiB0aGUgc3BlY2lmaWVkIG1hcCBhcmUKLSAgICAgKiAgYWRkZWQgaXMgZGVmaW5lZCBieSB7QGxpbmsgI3B1dEFsbChNYXApfS4gIAotICAgICAqLwotICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKE1hcCBtKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgcHV0QWxsKG0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW1vdmVzIGFuIGludGVybmFsIGVudHJ5IGZyb20gdGhlIGxpbmtlZCBsaXN0LiAgVGhpcyBkb2VzIG5vdCByZW1vdmUKLSAgICAgKiAgaXQgZnJvbSB0aGUgdW5kZXJseWluZyBtYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUVudHJ5KEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIGVudHJ5Lm5leHQucHJldiA9IGVudHJ5LnByZXY7Ci0gICAgICAgIGVudHJ5LnByZXYubmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluc2VydHMgYSBuZXcgaW50ZXJuYWwgZW50cnkgdG8gdGhlIHRhaWwgb2YgdGhlIGxpbmtlZCBsaXN0LiAgVGhpcyBkb2VzCi0gICAgICogIG5vdCBhZGQgdGhlIGVudHJ5IHRvIHRoZSB1bmRlcmx5aW5nIG1hcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0RW50cnkoRW50cnkgZW50cnkpIHsKLSAgICAgICAgZW50cnkubmV4dCA9IHNlbnRpbmVsOwotICAgICAgICBlbnRyeS5wcmV2ID0gc2VudGluZWwucHJldjsKLSAgICAgICAgc2VudGluZWwucHJldi5uZXh0ID0gZW50cnk7Ci0gICAgICAgIHNlbnRpbmVsLnByZXYgPSBlbnRyeTsKLSAgICB9Ci0KLSAgICAvLyBwZXIgTWFwLnNpemUoKQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNzaXplKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgLy8gdXNlIHRoZSB1bmRlcmx5aW5nIE1hcCdzIHNpemUgc2luY2Ugc2l6ZSBpcyBub3QgbWFpbnRhaW5lZCBoZXJlLgotICAgICAgICByZXR1cm4gZW50cmllcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNpc0VtcHR5KCl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIC8vIGZvciBxdWljayBjaGVjayB3aGV0aGVyIHRoZSBtYXAgaXMgZW50cnksIHdlIGNhbiBjaGVjayB0aGUgbGlua2VkIGxpc3QKLSAgICAgICAgLy8gYW5kIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIGluIGl0LgotICAgICAgICByZXR1cm4gc2VudGluZWwubmV4dCA9PSBzZW50aW5lbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2NvbnRhaW5zS2V5KE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gcGFzcyBvbiB0byB1bmRlcmx5aW5nIG1hcCBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gZW50cmllcy5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjY29udGFpbnNWYWx1ZShPYmplY3QpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyB1bmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QganVzdCBwYXNzIHRoaXMgY2FsbCB0byB0aGUgdW5kZXJseWluZyBtYXAKLSAgICAgICAgLy8gYmVjYXVzZSB3ZSBhcmUgbWFwcGluZyBrZXlzIHRvIGVudHJpZXMsIG5vdCBrZXlzIHRvIHZhbHVlcy4gIFRoZQotICAgICAgICAvLyB1bmRlcmx5aW5nIG1hcCBkb2Vzbid0IGhhdmUgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGFueXdheSwgc28gdGhpcwotICAgICAgICAvLyBpc24ndCBhIGJpZyBkZWFsLgotCi0gICAgICAgIC8vIGRvIG51bGwgY29tcGFyaXNvbiBvdXRzaWRlIGxvb3Agc28gd2Ugb25seSBuZWVkIHRvIGRvIGl0IG9uY2UuICBUaGlzCi0gICAgICAgIC8vIHByb3ZpZGVzIGEgdGlnaHRlciwgbW9yZSBlZmZpY2llbnQgbG9vcCBhdCB0aGUgZXhwZW5zZSBvZiBzbGlnaHQKLSAgICAgICAgLy8gY29kZSBkdXBsaWNhdGlvbi4KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW50cnkgcG9zID0gc2VudGluZWwubmV4dDsgcG9zICE9IHNlbnRpbmVsOyBwb3MgPSBwb3MubmV4dCkgewotICAgICAgICAgICAgICAgIGlmIChwb3MuZ2V0VmFsdWUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoRW50cnkgcG9zID0gc2VudGluZWwubmV4dDsgcG9zICE9IHNlbnRpbmVsOyBwb3MgPSBwb3MubmV4dCkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMocG9zLmdldFZhbHVlKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG8pIHsKLSAgICAgICAgLy8gZmluZCBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgb2JqZWN0Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBlbnRyaWVzLmdldChvKTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlICJvbGRlc3QiIG1hcHBpbmcuICBUaGF0IGlzLCByZXR1cm4gdGhlIE1hcC5FbnRyeQotICAgICAqICBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgd2FzIGZpcnN0IHB1dCBpbnRvIHRoZSBtYXAgd2hlbiBjb21wYXJlZCB0bwotICAgICAqICBhbGwgdGhlIG90aGVyIHBhaXJpbmdzIGluIHRoZSBtYXAuICBUaGlzIGJlaGF2aW9yIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICAgKiAgPGNvZGU+ZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTwvY29kZT4sIGJ1dCB0aGlzIG1ldGhvZCBwcm92aWRlcyBhbgotICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIHNlcXVlbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAgICAgKiAgbWFwIGlzIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBNYXAuRW50cnkgZ2V0Rmlyc3QoKSB7Ci0gICAgICAgIC8vIHNlbnRpbmVsLm5leHQgcG9pbnRzIHRvIHRoZSAiZmlyc3QiIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIC0tIHRoZSBoZWFkCi0gICAgICAgIC8vIG9mIHRoZSBsaXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBlbnRyeSB3ZSBuZWVkIHRvIHJldHVybi4gIFdlIG11c3QgdGVzdAotICAgICAgICAvLyBmb3IgYW4gZW1wdHkgbGlzdCB0aG91Z2ggYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgc2VudGluZWwhCi0gICAgICAgIHJldHVybiAoaXNFbXB0eSgpKSA/IG51bGwgOiBzZW50aW5lbC5uZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm4gdGhlIGtleSBmb3IgdGhlICJvbGRlc3QiIG1hcHBpbmcuICBUaGF0IGlzLCByZXR1cm4gdGhlIGtleSBmb3IgdGhlCi0gICAgICogIG1hcHBpbmcgdGhhdCB3YXMgZmlyc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvIGFsbCB0aGUgb3RoZXIKLSAgICAgKiAgb2JqZWN0cyBpbiB0aGUgbWFwLiAgVGhpcyBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAgICogIDxjb2RlPmdldEZpcnN0KCkuZ2V0S2V5KCk8L2NvZGU+LCBidXQgdGhpcyBtZXRob2QgcHJvdmlkZXMgYSBzbGlnaHRseQotICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgZmlyc3Qga2V5IGluIHRoZSBzZXF1ZW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogIG1hcCBpcyBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpcnN0S2V5KCkgewotICAgICAgICAvLyBzZW50aW5lbC5uZXh0IHBvaW50cyB0byB0aGUgImZpcnN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgaGVhZAotICAgICAgICAvLyBvZiB0aGUgbGlzdCAtLSBhbmQgdGhlIHJlcXVpc2l0ZSBrZXkgaXMgcmV0dXJuZWQgZnJvbSBpdC4gIEFuIGVtcHR5IGxpc3QKLSAgICAgICAgLy8gZG9lcyBub3QgbmVlZCB0byBiZSB0ZXN0ZWQuICBJbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCBpcyBlbXB0eSwKLSAgICAgICAgLy8gc2VudGluZWwubmV4dCB3aWxsIHBvaW50IHRvIHRoZSBzZW50aW5lbCBpdHNlbGYgd2hpY2ggaGFzIGEgbnVsbCBrZXksCi0gICAgICAgIC8vIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3b3VsZCB3YW50IHRvIHJldHVybiBpZiB0aGUgbGlzdCBpcyBlbXB0eSAoYQotICAgICAgICAvLyBuaWNlIGNvbnZlbmllbnQgd2F5IHRvIGF2b2lkIHRlc3QgZm9yIGFuIGVtcHR5IGxpc3QpCi0gICAgICAgIHJldHVybiBzZW50aW5lbC5uZXh0LmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgIm9sZGVzdCIgbWFwcGluZy4gIFRoYXQgaXMsIHJldHVybiB0aGUgdmFsdWUgZm9yCi0gICAgICogIHRoZSBtYXBwaW5nIHRoYXQgd2FzIGZpcnN0IHB1dCBpbnRvIHRoZSBtYXAgd2hlbiBjb21wYXJlZCB0byBhbGwgdGhlCi0gICAgICogIG90aGVyIG9iamVjdHMgaW4gdGhlIG1hcC4gIFRoaXMgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0byB1c2luZwotICAgICAqICA8Y29kZT5nZXRGaXJzdCgpLmdldFZhbHVlKCk8L2NvZGU+LCBidXQgdGhpcyBtZXRob2QgcHJvdmlkZXMgYSBzbGlnaHRseQotICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIHNlcXVlbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAgICAgKiAgbWFwIGlzIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Rmlyc3RWYWx1ZSgpIHsKLSAgICAgICAgLy8gc2VudGluZWwubmV4dCBwb2ludHMgdG8gdGhlICJmaXJzdCIgZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgLS0gdGhlIGhlYWQKLSAgICAgICAgLy8gb2YgdGhlIGxpc3QgLS0gYW5kIHRoZSByZXF1aXNpdGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBpdC4gIEFuIGVtcHR5Ci0gICAgICAgIC8vIGxpc3QgZG9lcyBub3QgbmVlZCB0byBiZSB0ZXN0ZWQuICBJbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCBpcyBlbXB0eSwKLSAgICAgICAgLy8gc2VudGluZWwubmV4dCB3aWxsIHBvaW50IHRvIHRoZSBzZW50aW5lbCBpdHNlbGYgd2hpY2ggaGFzIGEgbnVsbCB2YWx1ZSwKLSAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhCi0gICAgICAgIC8vIG5pY2UgY29udmVuaWVudCB3YXkgdG8gYXZvaWQgdGVzdCBmb3IgYW4gZW1wdHkgbGlzdCkKLSAgICAgICAgcmV0dXJuIHNlbnRpbmVsLm5leHQuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlICJuZXdlc3QiIG1hcHBpbmcuICBUaGF0IGlzLCByZXR1cm4gdGhlIE1hcC5FbnRyeQotICAgICAqICBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgd2FzIGZpcnN0IHB1dCBpbnRvIHRoZSBtYXAgd2hlbiBjb21wYXJlZCB0bwotICAgICAqICBhbGwgdGhlIG90aGVyIHBhaXJpbmdzIGluIHRoZSBtYXAuICBUaGUgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0bzoKLSAgICAgKgotICAgICAqICA8cHJlPgotICAgICAqICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAqICAgIEl0ZXJhdG9yIGl0ZXIgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICogICAgd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgKiAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAqICAgIH0KLSAgICAgKiAgICByZXR1cm4gKE1hcC5FbnRyeSlvYmo7Ci0gICAgICogIDwvcHJlPgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBlbnN1cmVzIGFuIE8oMSkgbG9va3VwIG9mIHRoZQotICAgICAqICBsYXN0IGtleSByYXRoZXIgdGhhbiBPKG4pLgotICAgICAqCi0gICAgICogIEByZXR1cm4gVGhlIGxhc3QgZW50cnkgaW4gdGhlIHNlcXVlbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWFwCi0gICAgICogIGlzIGVtcHR5LgotICAgICAqLwotICAgIHB1YmxpYyBNYXAuRW50cnkgZ2V0TGFzdCgpIHsKLSAgICAgICAgLy8gc2VudGluZWwucHJldiBwb2ludHMgdG8gdGhlICJsYXN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgdGFpbAotICAgICAgICAvLyBvZiB0aGUgbGlzdCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgZW50cnkgd2UgbmVlZCB0byByZXR1cm4uICBXZSBtdXN0IHRlc3QKLSAgICAgICAgLy8gZm9yIGFuIGVtcHR5IGxpc3QgdGhvdWdoIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHNlbnRpbmVsIQotICAgICAgICByZXR1cm4gKGlzRW1wdHkoKSkgPyBudWxsIDogc2VudGluZWwucHJldjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIHRoZSBrZXkgZm9yIHRoZSAibmV3ZXN0IiBtYXBwaW5nLiAgVGhhdCBpcywgcmV0dXJuIHRoZSBrZXkgZm9yIHRoZQotICAgICAqICBtYXBwaW5nIHRoYXQgd2FzIGxhc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvIGFsbCB0aGUgb3RoZXIKLSAgICAgKiAgb2JqZWN0cyBpbiB0aGUgbWFwLiAgVGhpcyBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAgICogIDxjb2RlPmdldExhc3QoKS5nZXRLZXkoKTwvY29kZT4sIGJ1dCB0aGlzIG1ldGhvZCBwcm92aWRlcyBhIHNsaWdodGx5Ci0gICAgICogIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBsYXN0IGtleSBpbiB0aGUgc2VxdWVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXAgaXMKLSAgICAgKiAgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRMYXN0S2V5KCkgewotICAgICAgICAvLyBzZW50aW5lbC5wcmV2IHBvaW50cyB0byB0aGUgImxhc3QiIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIC0tIHRoZSB0YWlsCi0gICAgICAgIC8vIG9mIHRoZSBsaXN0IC0tIGFuZCB0aGUgcmVxdWlzaXRlIGtleSBpcyByZXR1cm5lZCBmcm9tIGl0LiAgQW4gZW1wdHkgbGlzdAotICAgICAgICAvLyBkb2VzIG5vdCBuZWVkIHRvIGJlIHRlc3RlZC4gIEluIGNhc2VzIHdoZXJlIHRoZSBsaXN0IGlzIGVtcHR5LAotICAgICAgICAvLyBzZW50aW5lbC5wcmV2IHdpbGwgcG9pbnQgdG8gdGhlIHNlbnRpbmVsIGl0c2VsZiB3aGljaCBoYXMgYSBudWxsIGtleSwKLSAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhCi0gICAgICAgIC8vIG5pY2UgY29udmVuaWVudCB3YXkgdG8gYXZvaWQgdGVzdCBmb3IgYW4gZW1wdHkgbGlzdCkKLSAgICAgICAgcmV0dXJuIHNlbnRpbmVsLnByZXYuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSAibmV3ZXN0IiBtYXBwaW5nLiAgVGhhdCBpcywgcmV0dXJuIHRoZSB2YWx1ZSBmb3IKLSAgICAgKiAgdGhlIG1hcHBpbmcgdGhhdCB3YXMgbGFzdCBwdXQgaW50byB0aGUgbWFwIHdoZW4gY29tcGFyZWQgdG8gYWxsIHRoZSBvdGhlcgotICAgICAqICBvYmplY3RzIGluIHRoZSBtYXAuICBUaGlzIGJlaGF2aW9yIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICAgKiAgPGNvZGU+Z2V0TGFzdCgpLmdldFZhbHVlKCk8L2NvZGU+LCBidXQgdGhpcyBtZXRob2QgcHJvdmlkZXMgYSBzbGlnaHRseQotICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBUaGUgbGFzdCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXAKLSAgICAgKiAgaXMgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRMYXN0VmFsdWUoKSB7Ci0gICAgICAgIC8vIHNlbnRpbmVsLnByZXYgcG9pbnRzIHRvIHRoZSAibGFzdCIgZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgLS0gdGhlIHRhaWwKLSAgICAgICAgLy8gb2YgdGhlIGxpc3QgLS0gYW5kIHRoZSByZXF1aXNpdGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBpdC4gIEFuIGVtcHR5Ci0gICAgICAgIC8vIGxpc3QgZG9lcyBub3QgbmVlZCB0byBiZSB0ZXN0ZWQuICBJbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCBpcyBlbXB0eSwKLSAgICAgICAgLy8gc2VudGluZWwucHJldiB3aWxsIHBvaW50IHRvIHRoZSBzZW50aW5lbCBpdHNlbGYgd2hpY2ggaGFzIGEgbnVsbCB2YWx1ZSwKLSAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhCi0gICAgICAgIC8vIG5pY2UgY29udmVuaWVudCB3YXkgdG8gYXZvaWQgdGVzdCBmb3IgYW4gZW1wdHkgbGlzdCkKLSAgICAgICAgcmV0dXJuIHNlbnRpbmVsLnByZXYuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI3B1dChPYmplY3QsIE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBtb2RDb3VudCsrOwotCi0gICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gbG9va3VwIHRoZSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkKLSAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgZW50cmllcy5nZXQoa2V5KTsKLQotICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaXQgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgaWYgKGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbGlzdCBzbyB0aGUgZW50cnkgZ2V0cyAibW92ZWQiIHRvIHRoZSBlbmQgb2YgbGlzdAotICAgICAgICAgICAgcmVtb3ZlRW50cnkoZSk7Ci0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWx1ZSBpbiBtYXAKLSAgICAgICAgICAgIG9sZFZhbHVlID0gZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdGU6IFdlIGRvIG5vdCB1cGRhdGUgdGhlIGtleSBoZXJlIGJlY2F1c2UgaXRzIHVubmVjZXNzYXJ5LiAgV2Ugb25seQotICAgICAgICAgICAgLy8gZG8gY29tcGFyaXNvbnMgdXNpbmcgZXF1YWxzKE9iamVjdCkgYW5kIHdlIGtub3cgdGhlIHNwZWNpZmllZCBrZXkgYW5kCi0gICAgICAgICAgICAvLyB0aGF0IGluIHRoZSBtYXAgYXJlIGVxdWFsIGluIHRoYXQgc2Vuc2UuICBUaGlzIG1heSBjYXVzZSBhIHByb2JsZW0gaWYKLSAgICAgICAgICAgIC8vIHNvbWVvbmUgZG9lcyBub3QgaW1wbGVtZW50IHRoZWlyIGhhc2hDb2RlKCkgYW5kL29yIGVxdWFscyhPYmplY3QpCi0gICAgICAgICAgICAvLyBtZXRob2QgcHJvcGVybHkgYW5kIHRoZW4gdXNlIGl0IGFzIGEga2V5IGluIHRoaXMgbWFwLiAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5Ci0gICAgICAgICAgICBlID0gbmV3IEVudHJ5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZW50cmllcy5wdXQoa2V5LCBlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBhc3NlcnQoZW50cnkgaW4gbWFwLCBidXQgbm90IGxpc3QpCi0KLSAgICAgICAgLy8gYWRkIHRvIGxpc3QKLSAgICAgICAgaW5zZXJ0RW50cnkoZSk7Ci0KLSAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjcmVtb3ZlKE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgRW50cnkgZSA9IHJlbW92ZUltcGwoa2V5KTsKLSAgICAgICAgcmV0dXJuIChlID09IG51bGwpID8gbnVsbCA6IGUuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRnVsbHkgcmVtb3ZlIGFuIGVudHJ5IGZyb20gdGhlIG1hcCwgcmV0dXJuaW5nIHRoZSBvbGQgZW50cnkgb3IgbnVsbCBpZgotICAgICAqICB0aGVyZSB3YXMgbm8gc3VjaCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqLwotICAgIHByaXZhdGUgRW50cnkgcmVtb3ZlSW1wbChPYmplY3Qga2V5KSB7Ci0gICAgICAgIEVudHJ5IGUgPSAoRW50cnkpIGVudHJpZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgIGlmIChlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgcmVtb3ZlRW50cnkoZSk7Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBZGRzIGFsbCB0aGUgbWFwcGluZ3MgaW4gdGhlIHNwZWNpZmllZCBtYXAgdG8gdGhpcyBtYXAsIHJlcGxhY2luZyBhbnkKLSAgICAgKiAgbWFwcGluZ3MgdGhhdCBhbHJlYWR5IGV4aXN0IChhcyBwZXIge0BsaW5rIE1hcCNwdXRBbGwoTWFwKX0pLiAgVGhlIG9yZGVyCi0gICAgICogIGluIHdoaWNoIHRoZSBlbnRyaWVzIGFyZSBhZGRlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZAotICAgICAqICBmcm9tIHtAbGluayBNYXAjZW50cnlTZXQoKX0gZm9yIHRoZSBzcGVjaWZpZWQgbWFwLgotICAgICAqCi0gICAgICogIEBwYXJhbSB0IHRoZSBtYXBwaW5ncyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2NsZWFyKCl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtb2RDb3VudCsrOwotCi0gICAgICAgIC8vIHJlbW92ZSBhbGwgZnJvbSB0aGUgdW5kZXJseWluZyBtYXAKLSAgICAgICAgZW50cmllcy5jbGVhcigpOwotCi0gICAgICAgIC8vIGFuZCB0aGUgbGlzdAotICAgICAgICBzZW50aW5lbC5uZXh0ID0gc2VudGluZWw7Ci0gICAgICAgIHNlbnRpbmVsLnByZXYgPSBzZW50aW5lbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2VxdWFscyhPYmplY3QpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1hcCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5U2V0KCkuZXF1YWxzKCgoTWFwKSBvYmopLmVudHJ5U2V0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjaGFzaENvZGUoKX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5U2V0KCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUHJvdmlkZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudHJpZXMgd2l0aGluIHRoZSBtYXAuICBUaGUKLSAgICAgKiAgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgbWF5IGNoYW5nZSB3aXRoIGRpZmZlcmVudCByZWxlYXNlcywgc28gdGhpcwotICAgICAqICBtZXRob2QgaXMgc3VpdGFibGUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LiAgSWYgYSBzcGVjaWZpYyBmb3JtYXQgaXMKLSAgICAgKiAgcmVxdWlyZWQsIHVzZSB7QGxpbmsgI2VudHJ5U2V0KCl9LntAbGluayBTZXQjaXRlcmF0b3IoKSBpdGVyYXRvcigpfSBhbmQKLSAgICAgKiAgaXRlcmF0ZSBvdmVyIHRoZSBlbnRyaWVzIGluIHRoZSBtYXAgZm9ybWF0dGluZyB0aGVtIGFzIGFwcHJvcHJpYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKLSAgICAgICAgZm9yIChFbnRyeSBwb3MgPSBzZW50aW5lbC5uZXh0OyBwb3MgIT0gc2VudGluZWw7IHBvcyA9IHBvcy5uZXh0KSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHBvcy5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHBvcy5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChwb3MubmV4dCAhPSBzZW50aW5lbCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKCddJyk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAja2V5U2V0KCl9LgotICAgICAqLwotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0U2V0KCkgewotCi0gICAgICAgICAgICAvLyByZXF1aXJlZCBpbXBscwotICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3JkZXJlZEl0ZXJhdG9yKEtFWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlID0gU2VxdWVuY2VkSGFzaE1hcC50aGlzLnJlbW92ZUltcGwobyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChlICE9IG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtb3JlIGVmZmljaWVudCBpbXBscyB0aGFuIGFic3RyYWN0IHNldAotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgU2VxdWVuY2VkSGFzaE1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuaXNFbXB0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmNvbnRhaW5zS2V5KG8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCN2YWx1ZXMoKX0uCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgICAgIC8vIHJlcXVpcmVkIGltcGwKLSAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9yZGVyZWRJdGVyYXRvcihWQUxVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbnVsbCBjb21wYXJpc29uIG91dHNpZGUgbG9vcCBzbyB3ZSBvbmx5IG5lZWQgdG8gZG8gaXQgb25jZS4gIFRoaXMKLSAgICAgICAgICAgICAgICAvLyBwcm92aWRlcyBhIHRpZ2h0ZXIsIG1vcmUgZWZmaWNpZW50IGxvb3AgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xpZ2h0Ci0gICAgICAgICAgICAgICAgLy8gY29kZSBkdXBsaWNhdGlvbi4KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5IHBvcyA9IHNlbnRpbmVsLm5leHQ7IHBvcyAhPSBzZW50aW5lbDsgcG9zID0gcG9zLm5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VkSGFzaE1hcC50aGlzLnJlbW92ZUltcGwocG9zLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRW50cnkgcG9zID0gc2VudGluZWwubmV4dDsgcG9zICE9IHNlbnRpbmVsOyBwb3MgPSBwb3MubmV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhwb3MuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMucmVtb3ZlSW1wbChwb3MuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtb3JlIGVmZmljaWVudCBpbXBscyB0aGFuIGFic3RyYWN0IGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jb250YWluc1ZhbHVlKG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjZW50cnlTZXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNldCgpIHsKLSAgICAgICAgICAgIC8vIGhlbHBlcgotICAgICAgICAgICAgcHJpdmF0ZSBFbnRyeSBmaW5kRW50cnkoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87Ci0gICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMuZ2V0KGUuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmVxdWFscyhlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlcXVpcmVkIGltcGwKLSAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9yZGVyZWRJdGVyYXRvcihFTlRSWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlID0gZmluZEVudHJ5KG8pOwotICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMucmVtb3ZlSW1wbChlLmdldEtleSgpKSAhPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtb3JlIGVmZmljaWVudCBpbXBscyB0aGFuIGFic3RyYWN0IGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRFbnRyeShvKSAhPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8vIGNvbnN0YW50cyB0byBkZWZpbmUgd2hhdCB0aGUgaXRlcmF0b3Igc2hvdWxkIHJldHVybiBvbiAibmV4dCIKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRSWSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfTUFTSyA9IDB4ODAwMDAwMDA7Ci0KLSAgICBwcml2YXRlIGNsYXNzIE9yZGVyZWRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLSAgICAgICAgLyoqIAotICAgICAgICAgKiAgSG9sZHMgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGUgaXRlcmF0b3IuICBUaGUgdmFsdWUKLSAgICAgICAgICogIHNob3VsZCBiZSBlaXRoZXIge0BsaW5rICNLRVl9LCB7QGxpbmsgI1ZBTFVFfSwgb3Ige0BsaW5rICNFTlRSWX0uICBUbwotICAgICAgICAgKiAgc2F2ZSBhIHRpbnkgYml0IG9mIG1lbW9yeSwgdGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgYXMgYSBtYXJrZXIgZm9yIHdoZW4KLSAgICAgICAgICogIHJlbW92ZSBoYXMgYmVlbiBjYWxsZWQgb24gdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHByZXZlbnQgYSBzZWNvbmQgcmVtb3ZlCi0gICAgICAgICAqICBvbiB0aGUgc2FtZSBlbGVtZW50LiAgRXNzZW50aWFsbHksIGlmIHRoaXMgdmFsdWUgaXMgbmVnYXRpdmUgKGkuZS4gdGhlCi0gICAgICAgICAqICBiaXQgc3BlY2lmaWVkIGJ5IHtAbGluayAjUkVNT1ZFRF9NQVNLfSBpcyBzZXQpLCB0aGUgY3VycmVudCBwb3NpdGlvbgotICAgICAgICAgKiAgaGFzIGJlZW4gcmVtb3ZlZC4gIElmIHBvc2l0aXZlLCByZW1vdmUgY2FuIHN0aWxsIGJlIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgaW50IHJldHVyblR5cGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBIb2xkcyB0aGUgImN1cnJlbnQiIHBvc2l0aW9uIGluIHRoZSBpdGVyYXRvci4gIFdoZW4gcG9zLm5leHQgaXMgdGhlCi0gICAgICAgICAqICBzZW50aW5lbCwgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBFbnRyeSBwb3MgPSBzZW50aW5lbDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIEhvbGRzIHRoZSBleHBlY3RlZCBtb2RpZmljYXRpb24gY291bnQuICBJZiB0aGUgYWN0dWFsIG1vZGlmaWNhdGlvbgotICAgICAgICAgKiAgY291bnQgb2YgdGhlIG1hcCBkaWZmZXJzIGZyb20gdGhpcyB2YWx1ZSwgdGhlbiBhIGNvbmN1cnJlbnQKLSAgICAgICAgICogIG1vZGlmaWNhdGlvbiBoYXMgb2NjdXJyZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIGV4cGVjdGVkTW9kQ291bnQgPSBtb2RDb3VudDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvdmVyIHRoZSBzZXF1ZW5jZWQgZWxlbWVudHMgaW4gdGhlIG9yZGVyIGluIHdoaWNoCi0gICAgICAgICAqICB0aGV5IHdlcmUgYWRkZWQuICBUaGUge0BsaW5rICNuZXh0KCl9IG1ldGhvZCByZXR1cm5zIHRoZSB0eXBlIHNwZWNpZmllZAotICAgICAgICAgKiAgYnkgPGNvZGU+cmV0dXJuVHlwZTwvY29kZT4gd2hpY2ggbXVzdCBiZSBlaXRoZXIge0BsaW5rICNLRVl9LCB7QGxpbmsKLSAgICAgICAgICogICNWQUxVRX0sIG9yIHtAbGluayAjRU5UUll9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9yZGVyZWRJdGVyYXRvcihpbnQgcmV0dXJuVHlwZSkgewotICAgICAgICAgICAgLy8vLyBTaW5jZSB0aGlzIGlzIGEgcHJpdmF0ZSBpbm5lciBjbGFzcywgbm90aGluZyBlbHNlIHNob3VsZCBoYXZlCi0gICAgICAgICAgICAvLy8vIGFjY2VzcyB0byB0aGUgY29uc3RydWN0b3IuICBTaW5jZSB3ZSBrbm93IHRoZSByZXN0IG9mIHRoZSBvdXRlcgotICAgICAgICAgICAgLy8vLyBjbGFzcyB1c2VzIHRoZSBpdGVyYXRvciBjb3JyZWN0bHksIHdlIGNhbiBsZWF2ZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICAvLy8vIGNoZWNrOgotICAgICAgICAgICAgLy9pZihyZXR1cm5UeXBlID49IDAgJiYgcmV0dXJuVHlwZSA8PSAyKSB7Ci0gICAgICAgICAgICAvLyAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBpdGVyYXRvciB0eXBlIik7Ci0gICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgLy8gU2V0IHRoZSAicmVtb3ZlZCIgYml0IHNvIHRoYXQgdGhlIGl0ZXJhdG9yIHN0YXJ0cyBpbiBhIHN0YXRlIHdoZXJlCi0gICAgICAgICAgICAvLyAibmV4dCIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlICJyZW1vdmUiIHdpbGwgc3VjY2VlZC4KLSAgICAgICAgICAgIHRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGUgfCBSRU1PVkVEX01BU0s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBhbnkgYWRkaXRpb25hbCBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgdG8gYmUKLSAgICAgICAgICogIHJldHVybmVkLgotICAgICAgICAgKgotICAgICAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBsZWZ0IHRvIGJlCi0gICAgICAgICAqICByZXR1cm5lZCBmcm9tIHRoZSBpdGVyYXRvcjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9zLm5leHQgIT0gc2VudGluZWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBpbiB0aGUKLSAgICAgICAgICogIGl0ZXJhdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiAgQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIGEgbW9kaWZpY2F0aW9uIG9jY3VycyBpbgotICAgICAgICAgKiAgdGhlIHVuZGVybHlpbmcgbWFwLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgaWYgKG1vZENvdW50ICE9IGV4cGVjdGVkTW9kQ291bnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvcy5uZXh0ID09IHNlbnRpbmVsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2xlYXIgdGhlICJyZW1vdmVkIiBmbGFnCi0gICAgICAgICAgICByZXR1cm5UeXBlID0gcmV0dXJuVHlwZSAmIH5SRU1PVkVEX01BU0s7Ci0KLSAgICAgICAgICAgIHBvcyA9IHBvcy5uZXh0OwotICAgICAgICAgICAgc3dpdGNoIChyZXR1cm5UeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBLRVkgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zLmdldEtleSgpOwotICAgICAgICAgICAgICAgIGNhc2UgVkFMVUUgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBFTlRSWSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJiYWQgaXRlcmF0b3IgdHlwZTogIiArIHJldHVyblR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCByZXR1cm5lZCBmcm9tIHRoZSB7QGxpbmsgI25leHQoKX0gbWV0aG9kIGZyb20KLSAgICAgICAgICogIHRoZSBzZXF1ZW5jZWQgbWFwLgotICAgICAgICAgKgotICAgICAgICAgKiAgQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXNuJ3QgYSAibGFzdCBlbGVtZW50IiB0byBiZQotICAgICAgICAgKiAgcmVtb3ZlZC4gIFRoYXQgaXMsIGlmIHtAbGluayAjbmV4dCgpfSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIG9yIGlmCi0gICAgICAgICAqICB7QGxpbmsgI3JlbW92ZSgpfSB3YXMgYWxyZWFkeSBjYWxsZWQgb24gdGhlIGVsZW1lbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqICBAdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgYSBtb2RpZmljYXRpb24gb2NjdXJzIGluCi0gICAgICAgICAqICB0aGUgdW5kZXJseWluZyBtYXAuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAoKHJldHVyblR5cGUgJiBSRU1PVkVEX01BU0spICE9IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZW1vdmUoKSBtdXN0IGZvbGxvdyBuZXh0KCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2VxdWVuY2VkSGFzaE1hcC50aGlzLnJlbW92ZUltcGwocG9zLmdldEtleSgpKTsKLQotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBleHBlY3RlZCBtb2QgY291bnQgZm9yIHRoZSByZW1vdmUgb3BlcmF0aW9uCi0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50Kys7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgcmVtb3ZlZCBmbGFnCi0gICAgICAgICAgICByZXR1cm5UeXBlID0gcmV0dXJuVHlwZSB8IFJFTU9WRURfTUFTSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFQSXMgbWFpbnRhaW5lZCBmcm9tIHByZXZpb3VzIHZlcnNpb24gb2YgU2VxdWVuY2VkSGFzaE1hcCBmb3IgYmFja3dhcmRzCi0gICAgLy8gY29tcGF0aWJpbGl0eQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG9iamVjdCwgcHJlc2VydmluZyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlCi0gICAgICogYnkgY29weWluZyBvbmx5IHJlZmVyZW5jZXMuICBUaGUga2V5cyBhbmQgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdAotICAgICAqIDxjb2RlPmNsb25lKCk8L2NvZGU+J2QuICBUaGUgY2xvbmVkIG9iamVjdCBtYWludGFpbnMgdGhlIHNhbWUgc2VxdWVuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS4gIAotICAgICAqCi0gICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBjbG9uZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEKLSAgICAgKiBzdWJjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8geWVzLCBjYWxsaW5nIHN1cGVyLmNsb25lKCkgc2lsbHkgc2luY2Ugd2UncmUganVzdCBibG93aW5nIGF3YXkgYWxsCi0gICAgICAgIC8vIHRoZSBzdHVmZiB0aGF0IHN1cGVyIG1pZ2h0IGJlIGRvaW5nIGFueXdheSwgYnV0IGZvciBtb3RpdmF0aW9ucyBvbgotICAgICAgICAvLyB0aGlzLCBzZWU6Ci0gICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS9qYXZhd29ybGQvanctMDEtMTk5OS9qdy0wMS1vYmplY3QuaHRtbAotICAgICAgICBTZXF1ZW5jZWRIYXNoTWFwIG1hcCA9IChTZXF1ZW5jZWRIYXNoTWFwKSBzdXBlci5jbG9uZSgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBuZXcsIGVtcHR5IHNlbnRpbmVsCi0gICAgICAgIG1hcC5zZW50aW5lbCA9IGNyZWF0ZVNlbnRpbmVsKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3LCBlbXB0eSBlbnRyeSBtYXAKLSAgICAgICAgLy8gbm90ZTogdGhpcyBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0gICAgICAgIG1hcC5lbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyBhZGQgYWxsIHRoZSBtYXBwaW5ncwotICAgICAgICBtYXAucHV0QWxsKHRoaXMpOwotCi0gICAgICAgIC8vIE5vdGU6IFdlIGNhbm5vdCBqdXN0IGNsb25lIHRoZSBoYXNobWFwIGFuZCBzZW50aW5lbCBiZWNhdXNlIHdlIG11c3QKLSAgICAgICAgLy8gZHVwbGljYXRlIG91ciBpbnRlcm5hbCBzdHJ1Y3R1cmVzLiAgQ2xvbmluZyB0aG9zZSB0d28gd2lsbCBub3QgY2xvbmUgYWxsCi0gICAgICAgIC8vIHRoZSBvdGhlciBlbnRyaWVzIHRoZXkgcmVmZXJlbmNlLCBhbmQgc28gdGhlIGNsb25lZCBoYXNoIG1hcCB3aWxsIG5vdCBiZQotICAgICAgICAvLyBhYmxlIHRvIG1haW50YWluIGludGVybmFsIGNvbnNpc3RlbmN5IGJlY2F1c2UgdGhlcmUgYXJlIHR3byBvYmplY3RzIHdpdGgKLSAgICAgICAgLy8gdGhlIHNhbWUgZW50cmllcy4gIFNlZSBkaXNjdXNzaW9uIGluIHRoZSBFbnRyeSBpbXBsZW1lbnRhdGlvbiBvbiB3aHkgd2UKLSAgICAgICAgLy8gY2Fubm90IGltcGxlbWVudCBhIGNsb25lIG9mIHRoZSBFbnRyeSAoYW5kIHRodXMgd2h5IHdlIG5lZWQgdG8gcmVjcmVhdGUKLSAgICAgICAgLy8gZXZlcnl0aGluZykuCi0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgTWFwLkVudHJ5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKgotICAgICAqICBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzCi0gICAgICogIDxjb2RlPiZsdDsgMDwvY29kZT4gb3IgPGNvZGU+Jmd0OzwvY29kZT4gdGhlIHNpemUgb2YgdGhlIG1hcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcC5FbnRyeSBnZXRFbnRyeShpbnQgaW5kZXgpIHsKLSAgICAgICAgRW50cnkgcG9zID0gc2VudGluZWw7Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCArICIgPCAwIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHRvIG9uZSBiZWZvcmUgdGhlIHBvc2l0aW9uCi0gICAgICAgIGludCBpID0gLTE7Ci0gICAgICAgIHdoaWxlIChpIDwgKGluZGV4IC0gMSkgJiYgcG9zLm5leHQgIT0gc2VudGluZWwpIHsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIHBvcyA9IHBvcy5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIC8vIHBvcy5uZXh0IGlzIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24KLQotICAgICAgICAvLyBpZiBzZW50aW5lbCBpcyBuZXh0LCBwYXN0IGVuZCBvZiBsaXN0Ci0gICAgICAgIGlmIChwb3MubmV4dCA9PSBzZW50aW5lbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCArICIgPj0gIiArIChpICsgMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBvcy5uZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGtleSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaXMKLSAgICAgKiAgPGNvZGU+Jmx0OyAwPC9jb2RlPiBvciA8Y29kZT4mZ3Q7PC9jb2RlPiB0aGUgc2l6ZSBvZiB0aGUgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0RW50cnkoaW5kZXgpLmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IGlzCi0gICAgICogIDxjb2RlPiZsdDsgMDwvY29kZT4gb3IgPGNvZGU+Jmd0OzwvY29kZT4gdGhlIHNpemUgb2YgdGhlIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0RW50cnkoaW5kZXgpLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBmaW5kIHRoZSBpbmRleCBvZgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IGtleSkgewotICAgICAgICBFbnRyeSBlID0gKEVudHJ5KSBlbnRyaWVzLmdldChrZXkpOwotICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIHdoaWxlIChlLnByZXYgIT0gc2VudGluZWwpIHsKLSAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgZSA9IGUucHJldjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBrZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBmaW5kIHRoZSBpbmRleCBvZgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8ga2V5cyBpbiBhIG1hcCBhcmUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUKLSAgICAgICAgcmV0dXJuIGluZGV4T2Yoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdCB2aWV3IG9mIHRoZSBrZXlzIHJhdGhlciB0aGFuIGEgc2V0IHZpZXcuICBUaGUgcmV0dXJuZWQKLSAgICAgKiBsaXN0IGlzIHVubW9kaWZpYWJsZS4gIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgb2YKLSAgICAgKiB0aGUgbGlzdCAodXNpbmcge0BsaW5rIGphdmEudXRpbC5MaXN0SXRlcmF0b3Ijc2V0KE9iamVjdCl9KSB3aWxsCi0gICAgICogZWZmZWN0aXZlbHkgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBsaXN0IGFuZCByZWluc2VydCB0aGF0IHZhbHVlIGF0Ci0gICAgICogdGhlIGVuZCBvZiB0aGUgbGlzdCwgd2hpY2ggaXMgYW4gdW5leHBlY3RlZCBzaWRlIGVmZmVjdCBvZiBjaGFuZ2luZyB0aGUKLSAgICAgKiB2YWx1ZSBvZiBhIGxpc3QuICBUaGlzIG9jY3VycyBiZWNhdXNlIGNoYW5naW5nIHRoZSBrZXksIGNoYW5nZXMgd2hlbiB0aGUKLSAgICAgKiBtYXBwaW5nIGlzIGFkZGVkIHRvIHRoZSBtYXAgYW5kIHRodXMgd2hlcmUgaXQgYXBwZWFycyBpbiB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIDxwPkFuIGFsdGVybmF0aXZlIHRvIHRoaXMgbWV0aG9kIGlzIHRvIHVzZSB7QGxpbmsgI2tleVNldCgpfQotICAgICAqCi0gICAgICogQHNlZSAja2V5U2V0KCkKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmRlcmVkIGxpc3Qgb2Yga2V5cy4gIAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHNlcXVlbmNlKCkgewotICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KHNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGwuYWRkKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVMaXN0LmRlY29yYXRlKGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUuCi0gICAgICogQHJldHVybiAgICAgIFRoZSBwcmV2aW91cyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRoZSA8Y29kZT5rZXk8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0ZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IGlzCi0gICAgICogPGNvZGU+Jmx0OyAwPC9jb2RlPiBvciA8Y29kZT4mZ3Q7PC9jb2RlPiB0aGUgc2l6ZSBvZiB0aGUgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gcmVtb3ZlKGdldChpbmRleCkpOwotICAgIH0KLQotICAgIC8vIHBlciBFeHRlcm5hbGl6YWJsZS5yZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQpCi0KLSAgICAvKioKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhpcyBtYXAgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIHRoZSBzdHJlYW0gdG8gZGVzZXJpYWxpemUgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSByYWlzZXMgaXQKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIHN0cmVhbSByYWlzZXMgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaXplID0gaW4ucmVhZEludCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBtYXAgdG8gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBzdHJlYW0gdG8gc2VyaWFsaXplIHRvCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgaWYgdGhlIHN0cmVhbSByYWlzZXMgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZUludChzaXplKCkpOwotICAgICAgICBmb3IgKEVudHJ5IHBvcyA9IHNlbnRpbmVsLm5leHQ7IHBvcyAhPSBzZW50aW5lbDsgcG9zID0gcG9zLm5leHQpIHsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChwb3MuZ2V0S2V5KCkpOwotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHBvcy5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkZCBhIHNlcmlhbCB2ZXJzaW9uIHVpZCwgc28gdGhhdCBpZiB3ZSBjaGFuZ2UgdGhpbmdzIGluIHRoZSBmdXR1cmUKLSAgICAvLyB3aXRob3V0IGNoYW5naW5nIHRoZSBmb3JtYXQsIHdlIGNhbiBzdGlsbCBkZXNlcmlhbGl6ZSBwcm9wZXJseS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzgwNTUyNDg3ODg4MTAyOTMwTDsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NldFV0aWxzLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQ0ZTVjZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU2V0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0Lkxpc3RPcmRlcmVkU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuUHJlZGljYXRlZFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlByZWRpY2F0ZWRTb3J0ZWRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5TeW5jaHJvbml6ZWRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5TeW5jaHJvbml6ZWRTb3J0ZWRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5UcmFuc2Zvcm1lZFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlRyYW5zZm9ybWVkU29ydGVkU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVHlwZWRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5UeXBlZFNvcnRlZFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNvcnRlZFNldDsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgYW5kIGRlY29yYXRvcnMgZm9yCi0gKiB7QGxpbmsgU2V0fSBhbmQge0BsaW5rIFNvcnRlZFNldH0gaW5zdGFuY2VzLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBOZWlsIE8nVG9vbGUKLSAqIEBhdXRob3IgTWF0dGhldyBIYXd0aG9ybmUKLSAqLwotcHVibGljIGNsYXNzIFNldFV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IHVubW9kaWZpYWJsZSBzZXQuCi0gICAgICogVGhpcyB1c2VzIHRoZSB7QGxpbmsgQ29sbGVjdGlvbnN9IGltcGxlbWVudGF0aW9uIAotICAgICAqIGFuZCBpcyBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IEVNUFRZX1NFVCA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSB1bm1vZGlmaWFibGUgc29ydGVkIHNldC4KLSAgICAgKiBUaGlzIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgSkRLLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU29ydGVkU2V0IEVNUFRZX1NPUlRFRF9TRVQgPSBVbm1vZGlmaWFibGVTb3J0ZWRTZXQuZGVjb3JhdGUobmV3IFRyZWVTZXQoKSk7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5TZXRVdGlsczwvY29kZT4gc2hvdWxkIG5vdCBub3JtYWxseSBiZSBpbnN0YW50aWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIFNldFV0aWxzKCkgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0d28gc2V0cyBmb3IgZXF1YWxpdHkgYXMgcGVyIHRoZSA8Y29kZT5lcXVhbHMoKTwvY29kZT4gY29udHJhY3QKLSAgICAgKiBpbiB7QGxpbmsgamF2YS51dGlsLlNldCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCl9LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIDxjb2RlPlNldDwvY29kZT4gd2hlbiB5b3UgY2Fubm90Ci0gICAgICogZXh0ZW5kIEFic3RyYWN0U2V0LiBUaGUgbWV0aG9kIHRha2VzIENvbGxlY3Rpb24gaW5zdGFuY2VzIHRvIGVuYWJsZSBvdGhlcgotICAgICAqIGNvbGxlY3Rpb24gdHlwZXMgdG8gdXNlIHRoZSBTZXQgaW1wbGVtZW50YXRpb24gYWxnb3JpdGhtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWxldmFudCB0ZXh0IChzbGlnaHRseSBwYXJhcGhyYXNlZCBhcyB0aGlzIGlzIGEgc3RhdGljIG1ldGhvZCkgaXM6Ci0gICAgICogPGJsb2NrcXVvdGU+Ci0gICAgICogPHA+VHdvIHNldHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleSBoYXZlCi0gICAgICogdGhlIHNhbWUgc2l6ZSwgYW5kIGV2ZXJ5IG1lbWJlciBvZiB0aGUgZmlyc3Qgc2V0IGlzIGNvbnRhaW5lZCBpbgotICAgICAqIHRoZSBzZWNvbmQuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSA8dHQ+ZXF1YWxzPC90dD4gbWV0aG9kIHdvcmtzCi0gICAgICogcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIDx0dD5TZXQ8L3R0PgotICAgICAqIGludGVyZmFjZS48L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIHR3byBzZXRzIGFyZSB0aGUgc2FtZSBvYmplY3Q6IAotICAgICAqIGlmIHNvIGl0IHJldHVybnMgPHR0PnRydWU8L3R0Pi4gIFRoZW4sIGl0IGNoZWNrcyBpZiB0aGUgdHdvIHNldHMgYXJlCi0gICAgICogaWRlbnRpY2FsIGluIHNpemU7IGlmIG5vdCwgaXQgcmV0dXJucyBmYWxzZS4gSWYgc28sIGl0IHJldHVybnMKLSAgICAgKiA8dHQ+YS5jb250YWluc0FsbCgoQ29sbGVjdGlvbikgYik8L3R0Pi48L3A+Ci0gICAgICogPC9ibG9ja3F1b3RlPgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS51dGlsLlNldAotICAgICAqIEBwYXJhbSBzZXQxICB0aGUgZmlyc3Qgc2V0LCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBzZXQyICB0aGUgc2Vjb25kIHNldCwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNldHMgYXJlIGVxdWFsIGJ5IHZhbHVlIGNvbXBhcmlzb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVhbFNldChmaW5hbCBDb2xsZWN0aW9uIHNldDEsIGZpbmFsIENvbGxlY3Rpb24gc2V0MikgewotICAgICAgICBpZiAoc2V0MSA9PSBzZXQyKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0MSA9PSBudWxsIHx8IHNldDIgPT0gbnVsbCB8fCBzZXQxLnNpemUoKSAhPSBzZXQyLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNldDEuY29udGFpbnNBbGwoc2V0Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgaGFzaCBjb2RlIHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGluIAotICAgICAqIHtAbGluayBqYXZhLnV0aWwuU2V0I2hhc2hDb2RlKCl9LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIDxjb2RlPlNldDwvY29kZT4gd2hlbiB5b3UgY2Fubm90Ci0gICAgICogZXh0ZW5kIEFic3RyYWN0U2V0LiBUaGUgbWV0aG9kIHRha2VzIENvbGxlY3Rpb24gaW5zdGFuY2VzIHRvIGVuYWJsZSBvdGhlcgotICAgICAqIGNvbGxlY3Rpb24gdHlwZXMgdG8gdXNlIHRoZSBTZXQgaW1wbGVtZW50YXRpb24gYWxnb3JpdGhtLgotICAgICAqIAotICAgICAqIEBzZWUgamF2YS51dGlsLlNldCNoYXNoQ29kZSgpCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBjYWxjdWxhdGUgdGhlIGhhc2ggY29kZSBmb3IsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGVGb3JTZXQoZmluYWwgQ29sbGVjdGlvbiBzZXQpIHsKLSAgICAgICAgaWYgKHNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgaGFzaENvZGUgPSAwOwotICAgICAgICBJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBoYXNoQ29kZSArPSBvYmouaGFzaENvZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3luY2hyb25pemVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldC4KLSAgICAgKiA8cD4KLSAgICAgKiBZb3UgbXVzdCBtYW51YWxseSBzeW5jaHJvbml6ZSBvbiB0aGUgcmV0dXJuZWQgYnVmZmVyJ3MgaXRlcmF0b3IgdG8gCi0gICAgICogYXZvaWQgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3I6Ci0gICAgICogIAotICAgICAqIDxwcmU+Ci0gICAgICogU2V0IHMgPSBTZXRVdGlscy5zeW5jaHJvbml6ZWRTZXQobXlTZXQpOwotICAgICAqIHN5bmNocm9uaXplZCAocykgewotICAgICAqICAgICBJdGVyYXRvciBpID0gcy5pdGVyYXRvcigpOwotICAgICAqICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgKiAgICAgICAgIHByb2Nlc3MgKGkubmV4dCgpKTsKLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZGVjb3JhdG9ycyBzdWJwYWNrYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gc3luY2hyb25pemUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldCBzeW5jaHJvbml6ZWRTZXQoU2V0IHNldCkgewotICAgICAgICByZXR1cm4gU3luY2hyb25pemVkU2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIG1ha2UgdW5tb2RpZmlhYmxlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2V0IHVubW9kaWZpYWJsZVNldChTZXQgc2V0KSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0LgotICAgICAqIDxwPgotICAgICAqIE9ubHkgb2JqZWN0cyB0aGF0IHBhc3MgdGhlIHRlc3QgaW4gdGhlIGdpdmVuIHByZWRpY2F0ZSBjYW4gYmUgYWRkZWQgdG8gdGhlIHNldC4KLSAgICAgKiBUcnlpbmcgdG8gYWRkIGFuIGludmFsaWQgb2JqZWN0IHJlc3VsdHMgaW4gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotICAgICAqIEl0IGlzIGltcG9ydGFudCBub3QgdG8gdXNlIHRoZSBvcmlnaW5hbCBzZXQgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsCi0gICAgICogYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIGludmFsaWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gcHJlZGljYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSBmb3IgdGhlIHNldCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBwcmVkaWNhdGVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgU2V0IG9yIFByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgcHJlZGljYXRlZFNldChTZXQgc2V0LCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBQcmVkaWNhdGVkU2V0LmRlY29yYXRlKHNldCwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHlwZWQgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0LgotICAgICAqIDxwPgotICAgICAqIE9ubHkgb2JqZWN0cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBsaW1pdCB0byBhIHNwZWNpZmljIHR5cGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgb2Ygb2JqZWN0cyB3aGljaCBtYXkgYmUgYWRkZWQgdG8gdGhlIHNldAotICAgICAqIEByZXR1cm4gYSB0eXBlZCBzZXQgYmFja2VkIGJ5IHRoZSBzcGVjaWZpZWQgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgdHlwZWRTZXQoU2V0IHNldCwgQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gVHlwZWRTZXQuZGVjb3JhdGUoc2V0LCB0eXBlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRyYW5zZm9ybWVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldC4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG9iamVjdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgdHJhbnNmb3JtZXIgYXMgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICAgICogU2V0LiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgc2V0IGFmdGVyIGludm9raW5nIHRoaXMgCi0gICAgICogbWV0aG9kLCBhcyBpdCBpcyBhIGJhY2tkb29yIGZvciBhZGRpbmcgdW50cmFuc2Zvcm1lZCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byB0cmFuc2Zvcm0sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciBmb3IgdGhlIHNldCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lZCBzZXQgYmFja2VkIGJ5IHRoZSBnaXZlbiBzZXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIFNldCBvciBUcmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgdHJhbnNmb3JtZWRTZXQoU2V0IHNldCwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVkU2V0LmRlY29yYXRlKHNldCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHRoYXQgbWFpbnRhaW5zIHRoZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZSBhZGRlZAotICAgICAqIGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0LgotICAgICAqIDxwPgotICAgICAqIElmIGFuIGVsZW1lbnQgaXMgYWRkZWQgdHdpY2UsIHRoZSBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhZGQuCi0gICAgICogVGhlIG9yZGVyIGlzIG9ic2VydmVkIHRocm91Z2ggdGhlIGl0ZXJhdG9yIG9yIHRvQXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIG9yZGVyLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiBvcmRlcmVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgU2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldCBvcmRlcmVkU2V0KFNldCBzZXQpIHsKLSAgICAgICAgcmV0dXJuIExpc3RPcmRlcmVkU2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3luY2hyb25pemVkIHNvcnRlZCBzZXQgYmFja2VkIGJ5IHRoZSBnaXZlbiBzb3J0ZWQgc2V0LgotICAgICAqIDxwPgotICAgICAqIFlvdSBtdXN0IG1hbnVhbGx5IHN5bmNocm9uaXplIG9uIHRoZSByZXR1cm5lZCBidWZmZXIncyBpdGVyYXRvciB0byAKLSAgICAgKiBhdm9pZCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvcjoKLSAgICAgKiAgCi0gICAgICogPHByZT4KLSAgICAgKiBTZXQgcyA9IFNldFV0aWxzLnN5bmNocm9uaXplZFNldChteVNldCk7Ci0gICAgICogc3luY2hyb25pemVkIChzKSB7Ci0gICAgICogICAgIEl0ZXJhdG9yIGkgPSBzLml0ZXJhdG9yKCk7Ci0gICAgICogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgcHJvY2VzcyAoaS5uZXh0KCkpOwotICAgICAqICAgICB9Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3JzIHN1YnBhY2thZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNvcnRlZCBzZXQgdG8gc3luY2hyb25pemUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBzeW5jaHJvbml6ZWRTb3J0ZWRTZXQoU29ydGVkU2V0IHNldCkgewotICAgICAgICByZXR1cm4gU3luY2hyb25pemVkU29ydGVkU2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgc29ydGVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNvcnRlZCBzZXQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGRlY29yYXRvcnMgc3VicGFja2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzb3J0ZWQgc2V0IHRvIG1ha2UgdW5tb2RpZmlhYmxlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkU2V0IHVubW9kaWZpYWJsZVNvcnRlZFNldChTb3J0ZWRTZXQgc2V0KSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTb3J0ZWRTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgc29ydGVkIHNldCBiYWNrZWQgYnkgdGhlIGdpdmVuIHNvcnRlZCBzZXQuICAKLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IG9iamVjdHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGluIHRoZSBnaXZlbiBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXQuCi0gICAgICogVHJ5aW5nIHRvIGFkZCBhbiBpbnZhbGlkIG9iamVjdCByZXN1bHRzIGluIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLSAgICAgKiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSB0aGUgb3JpZ2luYWwgc2V0IGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLAotICAgICAqIGFzIGl0IGlzIGEgYmFja2Rvb3IgZm9yIGFkZGluZyBpbnZhbGlkIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc29ydGVkIHNldCB0byBwcmVkaWNhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIGZvciB0aGUgc29ydGVkIHNldCwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBwcmVkaWNhdGVkIHNvcnRlZCBzZXQgYmFja2VkIGJ5IHRoZSBnaXZlbiBzb3J0ZWQgc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBTZXQgb3IgUHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBwcmVkaWNhdGVkU29ydGVkU2V0KFNvcnRlZFNldCBzZXQsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIFByZWRpY2F0ZWRTb3J0ZWRTZXQuZGVjb3JhdGUoc2V0LCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0eXBlZCBzb3J0ZWQgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0LgotICAgICAqIDxwPgotICAgICAqIE9ubHkgb2JqZWN0cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBsaW1pdCB0byBhIHNwZWNpZmljIHR5cGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgb2Ygb2JqZWN0cyB3aGljaCBtYXkgYmUgYWRkZWQgdG8gdGhlIHNldAotICAgICAqIEByZXR1cm4gYSB0eXBlZCBzZXQgYmFja2VkIGJ5IHRoZSBzcGVjaWZpZWQgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgdHlwZWRTb3J0ZWRTZXQoU29ydGVkU2V0IHNldCwgQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gVHlwZWRTb3J0ZWRTZXQuZGVjb3JhdGUoc2V0LCB0eXBlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHRyYW5zZm9ybWVkIHNvcnRlZCBzZXQgYmFja2VkIGJ5IHRoZSBnaXZlbiBzZXQuCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBvYmplY3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIHRyYW5zZm9ybWVyIGFzIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgICAqIFNldC4gSXQgaXMgaW1wb3J0YW50IG5vdCB0byB1c2UgdGhlIG9yaWdpbmFsIHNldCBhZnRlciBpbnZva2luZyB0aGlzIAotICAgICAqIG1ldGhvZCwgYXMgaXQgaXMgYSBiYWNrZG9vciBmb3IgYWRkaW5nIHVudHJhbnNmb3JtZWQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gdHJhbnNmb3JtLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgZm9yIHRoZSBzZXQsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgdHJhbnNmb3JtZWQgc2V0IGJhY2tlZCBieSB0aGUgZ2l2ZW4gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBTZXQgb3IgVHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkU2V0IHRyYW5zZm9ybWVkU29ydGVkU2V0KFNvcnRlZFNldCBzZXQsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1lZFNvcnRlZFNldC5kZWNvcmF0ZShzZXQsIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU29ydGVkQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU29ydGVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2Y2U1OTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIERlZmluZXMgYSB0eXBlIG9mIDxjb2RlPkJhZzwvY29kZT4gdGhhdCBtYWludGFpbnMgYSBzb3J0ZWQgb3JkZXIgYW1vbmcKLSAqIGl0cyB1bmlxdWUgcmVwcmVzZW50YXRpdmUgbWVtYmVycy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICogCi0gKiBAYXV0aG9yIENodWNrIEJ1cmRpY2sKLSAqLwotcHVibGljIGludGVyZmFjZSBTb3J0ZWRCYWcgZXh0ZW5kcyBCYWcgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29tcGFyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb3J0ZWQgc2V0LCBvciBudWxsCi0gICAgICogaWYgaXQgdXNlcyBpdHMgZWxlbWVudHMnIG5hdHVyYWwgb3JkZXJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tcGFyYXRvciBpbiB1c2UsIG9yIG51bGwgaWYgbmF0dXJhbCBvcmRlcmluZwotICAgICAqLwotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IChsb3dlc3QpIG1lbWJlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzb3J0ZWQgYmFnCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBmaXJzdCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFzdCAoaGlnaGVzdCkgbWVtYmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgc29ydGVkIGJhZwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbGFzdCgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJpZGlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9Tb3J0ZWRCaWRpTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YmUxNmQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1NvcnRlZEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotCi0vKioKLSAqIERlZmluZXMgYSBtYXAgdGhhdCBhbGxvd3MgYmlkaXJlY3Rpb25hbCBsb29rdXAgYmV0d2VlbiBrZXkgYW5kIHZhbHVlcwotICogYW5kIHJldGFpbnMgYm90aCBrZXlzIGFuZCB2YWx1ZXMgaW4gc29ydGVkIG9yZGVyLgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsbG93IGEgdmFsdWUgdG8gYmUgbG9va2VkIHVwIGZyb20gYSBrZXkgYW5kCi0gKiBhIGtleSB0byBiZSBsb29rZWQgdXAgZnJvbSBhIHZhbHVlIHdpdGggZXF1YWwgcGVyZm9ybWFuY2UuCi0gKiAgCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MTggJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU29ydGVkQmlkaU1hcCBleHRlbmRzIE9yZGVyZWRCaWRpTWFwLCBTb3J0ZWRNYXAgewotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgb2YgdGhpcyBtYXAgd2hlcmUgdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgcmV2ZXJzZWQuCi0gICAgICogPHA+Ci0gICAgICogQ2hhbmdlcyB0byBvbmUgbWFwIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgb3RoZXIgYW5kIHZpY2UgdmVyc2EuCi0gICAgICogVGhpcyBlbmFibGVzIGJvdGggZGlyZWN0aW9ucyBvZiB0aGUgbWFwIHRvIGJlIGFjY2Vzc2VkIGVxdWFsbHkuCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZWVrIHRvIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBldmVyeSB0aW1lIHRoaXMKLSAgICAgKiBtZXRob2QgaXMgY2FsbGVkLiBTZWUgPGNvZGU+QWJzdHJhY3RNYXAudmFsdWVzKCk8L2NvZGU+IGV0Yy4gQ2FsbGluZyB0aGlzCi0gICAgICogbWV0aG9kIG9uIHRoZSBpbnZlcnNlIG1hcCBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCByZXR1cm4gYSA8Y29kZT5Tb3J0ZWRCaWRpTWFwPC9jb2RlPiBpbnN0YW5jZSwKLSAgICAgKiB1c3VhbGx5IGJ5IGZvcndhcmRpbmcgdG8gPGNvZGU+aW52ZXJzZVNvcnRlZEJpZGlNYXAoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGludmVydGVkIGJpZGlyZWN0aW9uYWwgbWFwCi0gICAgICovCi0gICAgcHVibGljIEJpZGlNYXAgaW52ZXJzZUJpZGlNYXAoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmlldyBvZiB0aGlzIG1hcCB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSByZXZlcnNlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBDaGFuZ2VzIHRvIG9uZSBtYXAgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBvdGhlciBhbmQgdmljZSB2ZXJzYS4KLSAgICAgKiBUaGlzIGVuYWJsZXMgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBtYXAgdG8gYmUgYWNjZXNzZWQgYXMgYSA8Y29kZT5Tb3J0ZWRNYXA8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc2VlayB0byBhdm9pZCBjcmVhdGluZyBhIG5ldyBvYmplY3QgZXZlcnkgdGltZSB0aGlzCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZC4gU2VlIDxjb2RlPkFic3RyYWN0TWFwLnZhbHVlcygpPC9jb2RlPiBldGMuIENhbGxpbmcgdGhpcwotICAgICAqIG1ldGhvZCBvbiB0aGUgaW52ZXJzZSBtYXAgc2hvdWxkIHJldHVybiB0aGUgb3JpZ2luYWwuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGludmVyc2UgbWFwIHJldHVybmVkIGJ5IDxjb2RlPmludmVyc2VCaWRpTWFwKCk8L2NvZGU+IHNob3VsZCBiZSB0aGUKLSAgICAgKiBzYW1lIG9iamVjdCBhcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaW52ZXJ0ZWQgYmlkaXJlY3Rpb25hbCBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgU29ydGVkQmlkaU1hcCBpbnZlcnNlU29ydGVkQmlkaU1hcCgpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1N0YXRpY0J1Y2tldE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzBkMDA5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TdGF0aWNCdWNrZXRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEEgU3RhdGljQnVja2V0TWFwIGlzIGFuIGVmZmljaWVudCwgdGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YKLSAqIDxjb2RlPmphdmEudXRpbC5NYXA8L2NvZGU+IHRoYXQgcGVyZm9ybXMgd2VsbCBpbiBpbiBhIGhpZ2hseQotICogdGhyZWFkLWNvbnRlbnRpb3VzIGVudmlyb25tZW50LiAgVGhlIG1hcCBzdXBwb3J0cyB2ZXJ5IGVmZmljaWVudAotICoge0BsaW5rICNnZXQoT2JqZWN0KSBnZXR9LCB7QGxpbmsgI3B1dChPYmplY3QsT2JqZWN0KSBwdXR9LCAKLSAqIHtAbGluayAjcmVtb3ZlKE9iamVjdCkgcmVtb3ZlfSBhbmQge0BsaW5rICNjb250YWluc0tleShPYmplY3QpIGNvbnRhaW5zS2V5fQotICogb3BlcmF0aW9ucywgYXNzdW1pbmcgKGFwcHJveGltYXRlKSB1bmlmb3JtIGhhc2hpbmcgYW5kCi0gKiB0aGF0IHRoZSBudW1iZXIgb2YgZW50cmllcyBkb2VzIG5vdCBleGNlZWQgdGhlIG51bWJlciBvZiBidWNrZXRzLiAgSWYgdGhlCi0gKiBudW1iZXIgb2YgZW50cmllcyBleGNlZWRzIHRoZSBudW1iZXIgb2YgYnVja2V0cyBvciBpZiB0aGUgaGFzaCBjb2RlcyBvZiB0aGUKLSAqIG9iamVjdHMgYXJlIG5vdCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQsIHRoZXNlIG9wZXJhdGlvbnMgaGF2ZSBhIHdvcnN0IGNhc2UKLSAqIHNjZW5hcmlvIHRoYXQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcAotICogKDxpPk8obik8L2k+KS48cD4KLSAqCi0gKiBFYWNoIGJ1Y2tldCBpbiB0aGUgaGFzaCB0YWJsZSBoYXMgaXRzIG93biBtb25pdG9yLCBzbyB0d28gdGhyZWFkcyBjYW4gCi0gKiBzYWZlbHkgb3BlcmF0ZSBvbiB0aGUgbWFwIGF0IHRoZSBzYW1lIHRpbWUsIG9mdGVuIHdpdGhvdXQgaW5jdXJyaW5nIGFueSAKLSAqIG1vbml0b3IgY29udGVudGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byB3cmFwIGluc3RhbmNlcwotICogb2YgdGhpcyBjbGFzcyB3aXRoIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9OwotICogaW5zdGFuY2VzIGFyZSBhbHJlYWR5IHRocmVhZC1zYWZlLiAgVW5mb3J0dW5hdGVseSwgaG93ZXZlciwgdGhpcyBtZWFucyAKLSAqIHRoYXQgdGhpcyBtYXAgaW1wbGVtZW50YXRpb24gYmVoYXZlcyBpbiB3YXlzIHlvdSBtYXkgZmluZCBkaXNjb25jZXJ0aW5nLiAgCi0gKiBCdWxrIG9wZXJhdGlvbnMsIHN1Y2ggYXMge0BsaW5rICNwdXRBbGwoTWFwKSBwdXRBbGx9IG9yIHRoZQotICoge0BsaW5rIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pIHJldGFpbkFsbH0gb3BlcmF0aW9uIGluIGNvbGxlY3Rpb24gCi0gKiB2aWV3cywgYXJlIDxpPm5vdDwvaT4gYXRvbWljLiAgSWYgdHdvIHRocmVhZHMgYXJlIHNpbXVsdGFuZW91c2x5IAotICogZXhlY3V0aW5nIAotICoKLSAqIDxwcmU+Ci0gKiAgIHN0YXRpY0J1Y2tldE1hcEluc3RhbmNlLnB1dEFsbChtYXApOwotICogPC9wcmU+Ci0gKgotICogYW5kCi0gKgotICogPHByZT4KLSAqICAgc3RhdGljQnVja2V0TWFwSW5zdGFuY2UuZW50cnlTZXQoKS5yZW1vdmVBbGwobWFwLmVudHJ5U2V0KCkpOwotICogPC9wcmU+Ci0gKgotICogdGhlbiB0aGUgcmVzdWx0cyBhcmUgZ2VuZXJhbGx5IHJhbmRvbS4gIFRob3NlIHR3byBzdGF0ZW1lbnQgY291bGQgY2FuY2VsCi0gKiBlYWNoIG90aGVyIG91dCwgbGVhdmluZyA8Y29kZT5zdGF0aWNCdWNrZXRNYXBJbnN0YW5jZTwvY29kZT4gZXNzZW50aWFsbHkgCi0gKiB1bmNoYW5nZWQsIG9yIHRoZXkgY291bGQgbGVhdmUgc29tZSByYW5kb20gc3Vic2V0IG9mIDxjb2RlPm1hcDwvY29kZT4gaW4gCi0gKiA8Y29kZT5zdGF0aWNCdWNrZXRNYXBJbnN0YW5jZTwvY29kZT4uPHA+Ci0gKgotICogQWxzbywgbXVjaCBsaWtlIGFuIGVuY3ljbG9wZWRpYSwgdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNzaXplKCl9IGFuZCAKLSAqIHtAbGluayAjaXNFbXB0eSgpfSBhcmUgb3V0LW9mLWRhdGUgYXMgc29vbiBhcyB0aGV5IGFyZSBwcm9kdWNlZC48cD4KLSAqCi0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uIHZpZXdzIG9mIHRoaXMgY2xhc3MgYXJlIDxpPm5vdDwvaT4KLSAqIGZhaWwtZmFzdC4gIFRoZXkgd2lsbCA8aT5uZXZlcjwvaT4gcmFpc2UgYSAKLSAqIHtAbGluayBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uICBLZXlzIGFuZCB2YWx1ZXMgCi0gKiBhZGRlZCB0byB0aGUgbWFwIGFmdGVyIHRoZSBpdGVyYXRvciBpcyBjcmVhdGVkIGRvIG5vdCBuZWNlc3NhcmlseSBhcHBlYXIKLSAqIGR1cmluZyBpdGVyYXRpb24uICBTaW1pbGFybHksIHRoZSBpdGVyYXRvciBkb2VzIG5vdCBuZWNlc3NhcmlseSBmYWlsIHRvIAotICogcmV0dXJuIGtleXMgYW5kIHZhbHVlcyB0aGF0IHdlcmUgcmVtb3ZlZCBhZnRlciB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQuPHA+Ci0gKgotICogRmluYWxseSwgdW5saWtlIHtAbGluayBqYXZhLnV0aWwuSGFzaE1hcH0tc3R5bGUgaW1wbGVtZW50YXRpb25zLCB0aGlzCi0gKiBjbGFzcyA8aT5uZXZlcjwvaT4gcmVoYXNoZXMgdGhlIG1hcC4gIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpcyBmaXhlZCAKLSAqIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGFuZCBuZXZlciBhbHRlcmVkLiAgUGVyZm9ybWFuY2UgbWF5IGRlZ3JhZGUgaWYgCi0gKiB5b3UgZG8gbm90IGFsbG9jYXRlIGVub3VnaCBidWNrZXRzIHVwZnJvbnQuPHA+Ci0gKgotICogVGhlIHtAbGluayAjYXRvbWljKFJ1bm5hYmxlKX0gbWV0aG9kIGlzIHByb3ZpZGVkIHRvIGFsbG93IGF0b21pYyBpdGVyYXRpb25zCi0gKiBhbmQgYnVsayBvcGVyYXRpb25zOyBob3dldmVyLCBvdmVydXNlIG9mIHtAbGluayAjYXRvbWljKFJ1bm5hYmxlKSBhdG9taWN9Ci0gKiB3aWxsIGJhc2ljYWxseSByZXN1bHQgaW4gYSBtYXAgdGhhdCdzIHNsb3dlciB0aGFuIGFuIG9yZGluYXJ5IHN5bmNocm9uaXplZAotICoge0BsaW5rIGphdmEudXRpbC5IYXNoTWFwfS4KLSAqCi0gKiBVc2UgdGhpcyBjbGFzcyBpZiB5b3UgZG8gbm90IHJlcXVpcmUgcmVsaWFibGUgYnVsayBvcGVyYXRpb25zIGFuZCAKLSAqIGl0ZXJhdGlvbnMsIG9yIGlmIHlvdSBjYW4gbWFrZSB5b3VyIG93biBndWFyYW50ZWVzIGFib3V0IGhvdyBidWxrIAotICogb3BlcmF0aW9ucyB3aWxsIGFmZmVjdCB0aGUgbWFwLjxwPgotICoKLSAqIEBkZXByZWNhdGVkIE1vdmVkIHRvIG1hcCBzdWJwYWNrYWdlLiBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ymxvcml0c2NoQGFwYWNoZS5vcmciPkJlcmluIExvcml0c2NoPC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Zy1mcm9laGxpY2hAZ214LmRlIj5HZXJoYXJkIEZyb2VobGljaDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1hc0BhcGFjaGUub3JnIj5NaWNoYWVsIEEuIFNtaXRoPC9hPgotICogQGF1dGhvciBQYXVsIEphY2sKLSAqIEBhdXRob3IgTGVvIFN1dGljCi0gKiBAYXV0aG9yIEphbmVrIEJvZ3Vja2kKLSAqIEBhdXRob3IgS2F6dXlhIFVqaWhhcmEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRpY0J1Y2tldE1hcCBpbXBsZW1lbnRzIE1hcCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUNLRVRTID0gMjU1OwotICAgIHByaXZhdGUgTm9kZVtdIG1fYnVja2V0czsKLSAgICBwcml2YXRlIExvY2tbXSBtX2xvY2tzOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG51bWJlciBvZiBidWNrZXRzICgyNTUpLgotICAgICAqLwotICAgIHB1YmxpYyBTdGF0aWNCdWNrZXRNYXAoKQotICAgIHsKLSAgICAgICAgdGhpcyggREVGQVVMVF9CVUNLRVRTICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIG1hcCB3aXRoIGEgc3BlY2lmaWVkIG51bWJlciBvZiBidWNrZXRzLiAgVGhlIG51bWJlcgotICAgICAqIG9mIGJ1Y2tldHMgaXMgbmV2ZXIgYmVsb3cgMTcsIGFuZCBpcyBhbHdheXMgYW4gb2RkIG51bWJlciAoU3RhdGljQnVja2V0TWFwCi0gICAgICogZW5zdXJlcyB0aGlzKS4gVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlCi0gICAgICogY2hhbmNlcyBmb3IgdGhyZWFkIGNvbnRlbnRpb24uICBUaGUgZmV3ZXIgYnVja2V0cywgdGhlIG1vcmUgY2hhbmNlcyBmb3IKLSAgICAgKiB0aHJlYWQgY29udGVudGlvbi4gIFRoZSBtb3JlIGJ1Y2tldHMgdGhlIGZld2VyIGNoYW5jZXMgZm9yIHRocmVhZAotICAgICAqIGNvbnRlbnRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtQnVja2V0cyAgdGhlIG51bWJlciBvZiBidWNrZXRzIGZvciB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBTdGF0aWNCdWNrZXRNYXAoIGludCBudW1CdWNrZXRzICkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gTWF0aC5tYXgoIDE3LCBudW1CdWNrZXRzICk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVja2V0U2l6ZSBpcyBuZXZlciBhIHBvd2VyIG9mIDIgKHRvIGVuc3VyZSBtYXhpbWFsIGRpc3RyaWJ1dGlvbikKLSAgICAgICAgaWYoIHNpemUgJSAyID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplLS07Ci0gICAgICAgIH0KLQotICAgICAgICBtX2J1Y2tldHMgPSBuZXcgTm9kZVsgc2l6ZSBdOwotICAgICAgICBtX2xvY2tzID0gbmV3IExvY2tbIHNpemUgXTsKLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHNpemU7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fbG9ja3NbIGkgXSA9IG5ldyBMb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgdGhlIGV4YWN0IGhhc2ggZW50cnkgZm9yIHRoZSBrZXkuICBUaGUgaGFzaCBhbGdvcml0aG0KLSAgICAgKiBpcyByYXRoZXIgc2ltcGxpc3RpYywgYnV0IGl0IGRvZXMgdGhlIGpvYjoKLSAgICAgKgotICAgICAqIDxwcmU+Ci0gICAgICogICBIZSA9IHxIayBtb2QgbnwKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqICAgSGUgaXMgdGhlIGVudHJ5J3MgaGFzaENvZGUsIEhrIGlzIHRoZSBrZXkncyBoYXNoQ29kZSwgYW5kIG4gaXMKLSAgICAgKiAgIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZ2V0SGFzaCggT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBpZigga2V5ID09IG51bGwgKSByZXR1cm4gMDsKLSAgICAgICAgaW50IGhhc2ggPSBrZXkuaGFzaENvZGUoKTsKLSAgICAgICAgaGFzaCArPSB+KGhhc2ggPDwgMTUpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiAxMCk7Ci0gICAgICAgIGhhc2ggKz0gKGhhc2ggPDwgMyk7Ci0gICAgICAgIGhhc2ggXj0gKGhhc2ggPj4+IDYpOwotICAgICAgICBoYXNoICs9IH4oaGFzaCA8PCAxMSk7Ci0gICAgICAgIGhhc2ggXj0gKGhhc2ggPj4+IDE2KTsKLSAgICAgICAgaGFzaCAlPSBtX2J1Y2tldHMubGVuZ3RoOwotICAgICAgICByZXR1cm4gKCBoYXNoIDwgMCApID8gaGFzaCAqIC0xIDogaGFzaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2tleVNldCgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEtleVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjc2l6ZSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKQotICAgIHsKLSAgICAgICAgaW50IGNudCA9IDA7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBtX2J1Y2tldHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbnQgKz0gbV9sb2Nrc1tpXS5zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI3B1dChPYmplY3QsIE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KCBmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKCBrZXkgKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQoIG1fbG9ja3NbIGhhc2ggXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IG1fYnVja2V0c1sgaGFzaCBdOwotCi0gICAgICAgICAgICBpZiggbiA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUoKTsKLSAgICAgICAgICAgICAgICBuLmtleSA9IGtleTsKLSAgICAgICAgICAgICAgICBuLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgbV9idWNrZXRzWyBoYXNoIF0gPSBuOwotICAgICAgICAgICAgICAgIG1fbG9ja3NbaGFzaF0uc2l6ZSsrOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgbiB0byB0aGUgbGFzdCBub2RlIGluIHRoZSBsaW5rZWQgbGlzdC4gIENoZWNrIGVhY2gga2V5IGFsb25nIHRoZSB3YXkKLSAgICAgICAgICAgIC8vICBJZiB0aGUga2V5IGlzIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhhdCBub2RlIGFuZCByZXR1cm4KLSAgICAgICAgICAgIC8vICB0aGUgb2xkIHZhbHVlLgotICAgICAgICAgICAgZm9yKCBOb2RlIG5leHQgPSBuOyBuZXh0ICE9IG51bGw7IG5leHQgPSBuZXh0Lm5leHQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG4gPSBuZXh0OwotCi0gICAgICAgICAgICAgICAgaWYoIG4ua2V5ID09IGtleSB8fCAoIG4ua2V5ICE9IG51bGwgJiYgbi5rZXkuZXF1YWxzKCBrZXkgKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWwgPSBuLnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBuLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUga2V5IHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBub2RlcywgYWRkIGl0IHRvIHRoZSBlbmQKLSAgICAgICAgICAgIC8vICBpbiBhIG5ldyBub2RlLgotICAgICAgICAgICAgTm9kZSBuZXdOb2RlID0gbmV3IE5vZGUoKTsKLSAgICAgICAgICAgIG5ld05vZGUua2V5ID0ga2V5OwotICAgICAgICAgICAgbmV3Tm9kZS52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgbi5uZXh0ID0gbmV3Tm9kZTsKLSAgICAgICAgICAgIG1fbG9ja3NbaGFzaF0uc2l6ZSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNnZXQoT2JqZWN0KX0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoIGZpbmFsIE9iamVjdCBrZXkgKQotICAgIHsKLSAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKCBrZXkgKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQoIG1fbG9ja3NbIGhhc2ggXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IG1fYnVja2V0c1sgaGFzaCBdOwotCi0gICAgICAgICAgICB3aGlsZSggbiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggbi5rZXkgPT0ga2V5IHx8ICggbi5rZXkgIT0gbnVsbCAmJiBuLmtleS5lcXVhbHMoIGtleSApICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbiA9IG4ubmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMge0BsaW5rIE1hcCNjb250YWluc0tleShPYmplY3QpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSggZmluYWwgT2JqZWN0IGtleSApCi0gICAgewotICAgICAgICBpbnQgaGFzaCA9IGdldEhhc2goIGtleSApOwotCi0gICAgICAgIHN5bmNocm9uaXplZCggbV9sb2Nrc1sgaGFzaCBdICkKLSAgICAgICAgewotICAgICAgICAgICAgTm9kZSBuID0gbV9idWNrZXRzWyBoYXNoIF07Ci0KLSAgICAgICAgICAgIHdoaWxlKCBuICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBuLmtleSA9PSBrZXkgfHwgKCBuLmtleSAhPSBudWxsICYmIG4ua2V5LmVxdWFscygga2V5ICkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuID0gbi5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMge0BsaW5rIE1hcCNjb250YWluc1ZhbHVlKE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fYnVja2V0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggbV9sb2Nrc1sgaSBdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb2RlIG4gPSBtX2J1Y2tldHNbIGkgXTsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBuICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG4udmFsdWUgPT0gdmFsdWUgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAobi52YWx1ZSAhPSBudWxsICYmIG4udmFsdWUuZXF1YWxzKCB2YWx1ZSApICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG4gPSBuLm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjdmFsdWVzKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFZhbHVlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjZW50cnlTZXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNwdXRBbGwoTWFwKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKCBNYXAgb3RoZXIgKQotICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IG90aGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUoIGkuaGFzTmV4dCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGkubmV4dCgpOwotICAgICAgICAgICAgcHV0KCBrZXksIG90aGVyLmdldCgga2V5ICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjcmVtb3ZlKE9iamVjdCl9LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCBPYmplY3Qga2V5ICkKLSAgICB7Ci0gICAgICAgIGludCBoYXNoID0gZ2V0SGFzaCgga2V5ICk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKCBtX2xvY2tzWyBoYXNoIF0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBtX2J1Y2tldHNbIGhhc2ggXTsKLSAgICAgICAgICAgIE5vZGUgcHJldiA9IG51bGw7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBuICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBuLmtleSA9PSBrZXkgfHwgKCBuLmtleSAhPSBudWxsICYmIG4ua2V5LmVxdWFscygga2V5ICkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIGxpbmtlZCBsaXN0IG9mIG5vZGVzLgotICAgICAgICAgICAgICAgICAgICBpZiggbnVsbCA9PSBwcmV2ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIHdhcyB0aGUgaGVhZCwgc2V0IHRoZSBuZXh0IG5vZGUgdG8gYmUgdGhlIG5ldyBoZWFkLgotICAgICAgICAgICAgICAgICAgICAgICAgbV9idWNrZXRzWyBoYXNoIF0gPSBuLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIG5leHQgbm9kZSBvZiB0aGUgcHJldmlvdXMgbm9kZSB0byBiZSB0aGUgbm9kZSBhZnRlciB0aGlzIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG4ubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX2xvY2tzW2hhc2hdLnNpemUtLTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJldiA9IG47Ci0gICAgICAgICAgICAgICAgbiA9IG4ubmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjaXNFbXB0eSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzaXplKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2NsZWFyKCl9LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbV9idWNrZXRzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgTG9jayBsb2NrID0gbV9sb2Nrc1tpXTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgICAgIG1fYnVja2V0c1sgaSBdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBsb2NrLnNpemUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNlcXVhbHMoT2JqZWN0KX0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKCBPYmplY3Qgb2JqICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmogPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYoIG9iaiA9PSB0aGlzICkgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYoICEoIG9iaiBpbnN0YW5jZW9mIE1hcCApICkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIE1hcCBvdGhlciA9IChNYXApb2JqOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVudHJ5U2V0KCkuZXF1YWxzKG90aGVyLmVudHJ5U2V0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjaGFzaENvZGUoKX0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIAotICAgIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gMDsKLQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fYnVja2V0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggbV9sb2Nrc1sgaSBdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb2RlIG4gPSBtX2J1Y2tldHNbIGkgXTsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBuICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzaENvZGUgKz0gbi5oYXNoQ29kZSgpOwotICAgICAgICAgICAgICAgICAgICBuID0gbi5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIE1hcC5FbnRyeSBmb3IgdGhlIFN0YXRpY0J1Y2tldE1hcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOb2RlIGltcGxlbWVudHMgTWFwLkVudHJ5LCBLZXlWYWx1ZQotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBrZXk7Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWU7Ci0gICAgICAgIHByb3RlY3RlZCBOb2RlIG5leHQ7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCAoIGtleSA9PSBudWxsID8gMCA6IGtleS5oYXNoQ29kZSgpICkgXgotICAgICAgICAgICAgICAgICAgICAgKCB2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkgKSApOyAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYoIG8gPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmKCBvID09IHRoaXMgKSByZXR1cm4gdHJ1ZTsgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICEgKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBNYXAuRW50cnkgZTIgPSAoTWFwLkVudHJ5KW87Ci0KLSAgICAgICAgICAgIHJldHVybiAoKGtleSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgIGUyLmdldEtleSgpID09IG51bGwgOiBrZXkuZXF1YWxzKGUyLmdldEtleSgpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgZTIuZ2V0VmFsdWUoKSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKGUyLmdldFZhbHVlKCkpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKCBPYmplY3QgdmFsICkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IHJldFZhbCA9IHZhbHVlOwotICAgICAgICAgICAgdmFsdWUgPSB2YWw7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTG9jayB7Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplOwotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgY3VycmVudCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYnVja2V0OwotICAgICAgICBwcml2YXRlIE1hcC5FbnRyeSBsYXN0OwotCi0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LnNpemUoKSA+IDApIHJldHVybiB0cnVlOwotICAgICAgICAgICAgd2hpbGUgKGJ1Y2tldCA8IG1fYnVja2V0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1fbG9ja3NbYnVja2V0XSkgewotICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBtX2J1Y2tldHNbYnVja2V0XTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGQobik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuID0gbi5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Y2tldCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5zaXplKCkgPiAwKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTWFwLkVudHJ5IG5leHRFbnRyeSgpIHsKLSAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgbGFzdCA9IChNYXAuRW50cnkpY3VycmVudC5yZW1vdmUoY3VycmVudC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgU3RhdGljQnVja2V0TWFwLnRoaXMucmVtb3ZlKGxhc3QuZ2V0S2V5KCkpOwotICAgICAgICAgICAgbGFzdCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVmFsdWVJdGVyYXRvciBleHRlbmRzIEVudHJ5SXRlcmF0b3IgewotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgRW50cnlJdGVyYXRvciB7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgewotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0aWNCdWNrZXRNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIFN0YXRpY0J1Y2tldE1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KW87Ci0gICAgICAgICAgICBpbnQgaGFzaCA9IGdldEhhc2goZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtX2xvY2tzW2hhc2hdKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChOb2RlIG4gPSBtX2J1Y2tldHNbaGFzaF07IG4gIT0gbnVsbDsgbiA9IG4ubmV4dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobi5lcXVhbHMoZW50cnkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIGludCBoYXNoID0gZ2V0SGFzaChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1fbG9ja3NbaGFzaF0pIHsKLSAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbiA9IG1fYnVja2V0c1toYXNoXTsgbiAhPSBudWxsOyBuID0gbi5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLmVxdWFscyhlbnRyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY0J1Y2tldE1hcC50aGlzLnJlbW92ZShuLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgS2V5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgewotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0aWNCdWNrZXRNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIFN0YXRpY0J1Y2tldE1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEtleUl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgICAgICAgcmV0dXJuIFN0YXRpY0J1Y2tldE1hcC50aGlzLmNvbnRhaW5zS2V5KG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpbnQgaGFzaCA9IGdldEhhc2gobyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1fbG9ja3NbaGFzaF0pIHsKLSAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbiA9IG1fYnVja2V0c1toYXNoXTsgbiAhPSBudWxsOyBuID0gbi5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBrID0gbi5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChrID09IG8pIHx8ICgoayAhPSBudWxsKSAmJiBrLmVxdWFscyhvKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY0J1Y2tldE1hcC50aGlzLnJlbW92ZShrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZXMgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24gewotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0aWNCdWNrZXRNYXAudGhpcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIFN0YXRpY0J1Y2tldE1hcC50aGlzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgUHJldmVudHMgYW55IG9wZXJhdGlvbnMgZnJvbSBvY2N1cnJpbmcgb24gdGhpcyBtYXAgd2hpbGUgdGhlCi0gICAgICogIGdpdmVuIHtAbGluayBSdW5uYWJsZX0gZXhlY3V0ZXMuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCwgZm9yCi0gICAgICogIGluc3RhbmNlLCB0byBleGVjdXRlIGEgYnVsayBvcGVyYXRpb24gYXRvbWljYWxseTogCi0gICAgICoKLSAgICAgKiAgPHByZT4KLSAgICAgKiAgICBzdGF0aWNCdWNrZXRNYXBJbnN0YW5jZS5hdG9taWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAqICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICogICAgICAgICAgICBzdGF0aWNCdWNrZXRNYXBJbnN0YW5jZS5wdXRBbGwobWFwKTsKLSAgICAgKiAgICAgICAgfQotICAgICAqICAgIH0pOwotICAgICAqICA8L3ByZT4KLSAgICAgKgotICAgICAqICBJdCBjYW4gYWxzbyBiZSB1c2VkIGlmIHlvdSBuZWVkIGEgcmVsaWFibGUgaXRlcmF0b3I6Ci0gICAgICoKLSAgICAgKiAgPHByZT4KLSAgICAgKiAgICBzdGF0aWNCdWNrZXRNYXBJbnN0YW5jZS5hdG9taWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAqICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICogICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHN0YXRpY0J1Y2tldE1hcEluc3RhbmNlLml0ZXJhdG9yKCk7Ci0gICAgICogICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICogICAgICAgICAgICAgICAgZm9vKGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgKiAgICAgICAgICAgIH0KLSAgICAgKiAgICAgICAgfQotICAgICAqICAgIH0pOwotICAgICAqICA8L3ByZT4KLSAgICAgKgotICAgICAqICA8Qj5JbXBsZW1lbnRhdGlvbiBub3RlOjwvQj4gVGhpcyBtZXRob2QgcmVxdWlyZXMgYSBsb3Qgb2YgdGltZQotICAgICAqICBhbmQgYSB0b24gb2Ygc3RhY2sgc3BhY2UuICBFc3NlbnRpYWxseSBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXMgdXNlZAotICAgICAqICB0byBlbnRlciBlYWNoIGJ1Y2tldCdzIG1vbml0b3IuICBJZiB5b3UgaGF2ZSB0d2VudHkgdGhvdXNhbmQgYnVja2V0cwotICAgICAqICBpbiB5b3VyIG1hcCwgdGhlbiB0aGUgcmVjdXJzaXZlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgdHdlbnR5IHRob3VzYW5kCi0gICAgICogIHRpbWVzLiAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIHIgIHRoZSBjb2RlIHRvIGV4ZWN1dGUgYXRvbWljYWxseQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0b21pYyhSdW5uYWJsZSByKSB7Ci0gICAgICAgIGlmIChyID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBhdG9taWMociwgMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0b21pYyhSdW5uYWJsZSByLCBpbnQgYnVja2V0KSB7Ci0gICAgICAgIGlmIChidWNrZXQgPj0gbV9idWNrZXRzLmxlbmd0aCkgewotICAgICAgICAgICAgci5ydW4oKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1fbG9ja3NbYnVja2V0XSkgewotICAgICAgICAgICAgYXRvbWljKHIsIGJ1Y2tldCArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvU3luY2hyb25pemVkUHJpb3JpdHlRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDQzMWUxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9TeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEEgdGhyZWFkIHNhZmUgdmVyc2lvbiBvZiB0aGUgUHJpb3JpdHlRdWV1ZS4KLSAqIFByb3ZpZGVzIHN5bmNocm9uaXplZCB3cmFwcGVyIG1ldGhvZHMgZm9yIGFsbCB0aGUgbWV0aG9kcyAKLSAqIGRlZmluZWQgaW4gdGhlIFByaW9yaXR5UXVldWUgaW50ZXJmYWNlLgotICoKLSAqIEBkZXByZWNhdGVkIFByaW9yaXR5UXVldWUgaXMgcmVwbGFjZWQgYnkgdGhlIEJ1ZmZlciBpbnRlcmZhY2UsIHNlZSBidWZmZXIgc3VicGFja2FnZS4KLSAqICBEdWUgdG8gYmUgcmVtb3ZlZCBpbiB2NC4wLgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqIAotICogQGF1dGhvciBSYW0gQ2hpZGFtYmFyYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN5bmNocm9uaXplZFByaW9yaXR5UXVldWUgaW1wbGVtZW50cyBQcmlvcml0eVF1ZXVlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB1bmRlcmx5aW5nIHByaW9yaXR5IHF1ZXVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBQcmlvcml0eVF1ZXVlIG1fcHJpb3JpdHlRdWV1ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgc3luY2hyb25pemVkIHByaW9yaXR5IHF1ZXVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByaW9yaXR5UXVldWUgIHRoZSBwcmlvcml0eSBxdWV1ZSB0byBzeW5jaHJvbml6ZQotICAgICAqLwotICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRQcmlvcml0eVF1ZXVlKGZpbmFsIFByaW9yaXR5UXVldWUgcHJpb3JpdHlRdWV1ZSkgewotICAgICAgICBtX3ByaW9yaXR5UXVldWUgPSBwcmlvcml0eVF1ZXVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFsbCBlbGVtZW50cyBmcm9tIHF1ZXVlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbV9wcmlvcml0eVF1ZXVlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBpZiBxdWV1ZSBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBxdWV1ZSBpcyBlbXB0eSBlbHNlIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbV9wcmlvcml0eVF1ZXVlLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnQgYW4gZWxlbWVudCBpbnRvIHF1ZXVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIG1fcHJpb3JpdHlRdWV1ZS5pbnNlcnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGVsZW1lbnQgb24gdG9wIG9mIGhlYXAgYnV0IGRvbid0IHJlbW92ZSBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdG9wIG9mIGhlYXAKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgaXNFbXB0eSgpID09IHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBwZWVrKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9wcmlvcml0eVF1ZXVlLnBlZWsoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gZWxlbWVudCBvbiB0b3Agb2YgaGVhcCBhbmQgcmVtb3ZlIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0b3Agb2YgaGVhcAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBpc0VtcHR5KCkgPT0gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHBvcCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1fcHJpb3JpdHlRdWV1ZS5wb3AoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHF1ZXVlLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBxdWV1ZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbV9wcmlvcml0eVF1ZXVlLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmExNmQ2Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLS8qKgotICogRGVmaW5lcyBhIGZ1bmN0b3IgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB0cmFuc2Zvcm0gb25lCi0gKiBvYmplY3QgaW50byBhbm90aGVyLgotICogPHA+Ci0gKiBBIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBjb252ZXJ0cyB0aGUgaW5wdXQgb2JqZWN0IHRvIHRoZSBvdXRwdXQgb2JqZWN0LgotICogVGhlIGlucHV0IG9iamVjdCBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuCi0gKiBUcmFuc2Zvcm1lcnMgYXJlIHR5cGljYWxseSB1c2VkIGZvciB0eXBlIGNvbnZlcnNpb25zLCBvciBleHRyYWN0aW5nIGRhdGEKLSAqIGZyb20gYW4gb2JqZWN0LgotICogPHA+Ci0gKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YgY29tbW9uIHRyYW5zZm9ybWVycyBhcmUgcHJvdmlkZWQgYnkKLSAqIHtAbGluayBUcmFuc2Zvcm1lclV0aWxzfS4gVGhlc2UgaW5jbHVkZSBtZXRob2QgaW52b2thdGlvbiwgcmV0dXJuaW5nIGEgY29uc3RhbnQsCi0gKiBjbG9uaW5nIGFuZCByZXR1cm5pbmcgdGhlIHN0cmluZyB2YWx1ZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE5ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1lciB7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBvYmplY3QgKGxlYXZpbmcgaXQgdW5jaGFuZ2VkKSBpbnRvIHNvbWUgb3V0cHV0IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZCwgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkCi0gICAgICogQHJldHVybiBhIHRyYW5zZm9ybWVkIG9iamVjdAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIChydW50aW1lKSBpZiB0aGUgaW5wdXQgaXMgdGhlIHdyb25nIGNsYXNzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKHJ1bnRpbWUpIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBGdW5jdG9yRXhjZXB0aW9uIChydW50aW1lKSBpZiB0aGUgdHJhbnNmb3JtIGNhbm5vdCBiZSBjb21wbGV0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpOwotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXJVdGlscy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmExYTYwNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNsb25lVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNsb3N1cmVUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuRXF1YWxQcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkV4Y2VwdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5GYWN0b3J5VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbnRpYXRlVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuTWFwVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLk5PUFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5QcmVkaWNhdGVUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuU3RyaW5nVmFsdWVUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuU3dpdGNoVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogPGNvZGU+VHJhbnNmb3JtZXJVdGlsczwvY29kZT4gcHJvdmlkZXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9ucyBhbmQgCi0gKiB1dGlsaXRpZXMgZm9yIHRoZSBUcmFuc2Zvcm1lciBmdW5jdG9yIGludGVyZmFjZS4gVGhlIHN1cHBsaWVkIHRyYW5zZm9ybWVycyBhcmU6Ci0gKiA8dWw+Ci0gKiA8bGk+SW52b2tlciAtIHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCBjYWxsIG9uIHRoZSBpbnB1dCBvYmplY3QKLSAqIDxsaT5DbG9uZSAtIHJldHVybnMgYSBjbG9uZSBvZiB0aGUgaW5wdXQgb2JqZWN0Ci0gKiA8bGk+Q29uc3RhbnQgLSBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKLSAqIDxsaT5DbG9zdXJlIC0gcGVyZm9ybXMgYSBDbG9zdXJlIGFuZCByZXR1cm5zIHRoZSBpbnB1dCBvYmplY3QKLSAqIDxsaT5QcmVkaWNhdGUgLSByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBhcyBhIEJvb2xlYW4KLSAqIDxsaT5GYWN0b3J5IC0gcmV0dXJucyBhIG5ldyBvYmplY3QgZnJvbSBhIGZhY3RvcnkKLSAqIDxsaT5DaGFpbmVkIC0gY2hhaW5zIHR3byBvciBtb3JlIHRyYW5zZm9ybWVycyB0b2dldGhlcgotICogPGxpPlN3aXRjaCAtIGNhbGxzIG9uZSB0cmFuc2Zvcm1lciBiYXNlZCBvbiBvbmUgb3IgbW9yZSBwcmVkaWNhdGVzCi0gKiA8bGk+U3dpdGNoTWFwIC0gY2FsbHMgb25lIHRyYW5zZm9ybWVyIGxvb2tlZCB1cCBmcm9tIGEgTWFwCi0gKiA8bGk+SW5zdGFudGlhdGUgLSB0aGUgQ2xhc3MgaW5wdXQgb2JqZWN0IGlzIGluc3RhbnRpYXRlZAotICogPGxpPk1hcCAtIHJldHVybnMgYW4gb2JqZWN0IGZyb20gYSBzdXBwbGllZCBNYXAKLSAqIDxsaT5OdWxsIC0gYWx3YXlzIHJldHVybnMgbnVsbAotICogPGxpPk5PUCAtIHJldHVybnMgdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggc2hvdWxkIGJlIGltbXV0YWJsZQotICogPGxpPkV4Y2VwdGlvbiAtIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gKiA8bGk+U3RyaW5nVmFsdWUgLSByZXR1cm5zIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IG9iamVjdAotICogPC91bD4KLSAqIEFsbCB0aGUgc3VwcGxpZWQgdHJhbnNmb3JtZXJzIGFyZSBTZXJpYWxpemFibGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjE4ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSmFtZXMgQ2FybWFuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1lclV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgbm90IG5vcm1hbGx5IGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXJVdGlscygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdHJhbnNmb3JtZXIgdGhhdCBhbHdheXMgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCBkdXJpbmcgdGVzdGluZyBhcyBhIHBsYWNlaG9sZGVyLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkV4Y2VwdGlvblRyYW5zZm9ybWVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGV4Y2VwdGlvblRyYW5zZm9ybWVyKCkgewotICAgICAgICByZXR1cm4gRXhjZXB0aW9uVHJhbnNmb3JtZXIuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHRyYW5zZm9ybWVyIHRoYXQgYWx3YXlzIHJldHVybnMgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudFRyYW5zZm9ybWVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIG51bGxUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgcmV0dXJuIENvbnN0YW50VHJhbnNmb3JtZXIuTlVMTF9JTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdHJhbnNmb3JtZXIgdGhhdCByZXR1cm5zIHRoZSBpbnB1dCBvYmplY3QuCi0gICAgICogVGhlIGlucHV0IG9iamVjdCBzaG91bGQgYmUgaW1tdXRhYmxlIHRvIG1haW50YWluIHRoZQotICAgICAqIGNvbnRyYWN0IG9mIFRyYW5zZm9ybWVyIChhbHRob3VnaCB0aGlzIGlzIG5vdCBjaGVja2VkKS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5OT1BUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBub3BUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgcmV0dXJuIE5PUFRyYW5zZm9ybWVyLklOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB0cmFuc2Zvcm1lciB0aGF0IHJldHVybnMgYSBjbG9uZSBvZiB0aGUgaW5wdXQKLSAgICAgKiBvYmplY3QuIFRoZSBpbnB1dCBvYmplY3Qgd2lsbCBiZSBjbG9uZWQgdXNpbmcgb25lIG9mIHRoZXNlCi0gICAgICogdGVjaG5pcXVlcyAoaW4gb3JkZXIpOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+cHVibGljIGNsb25lIG1ldGhvZAotICAgICAqIDxsaT5wdWJsaWMgY29weSBjb25zdHJ1Y3RvcgotICAgICAqIDxsaT5zZXJpYWxpemF0aW9uIGNsb25lCi0gICAgICogPHVsPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNsb25lVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgY2xvbmVUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgcmV0dXJuIENsb25lVHJhbnNmb3JtZXIuSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFRyYW5zZm9ybWVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IGVhY2ggdGltZSB0aGUgCi0gICAgICogdHJhbnNmb3JtZXIgaXMgdXNlZC4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50VHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRUb1JldHVybiAgdGhlIGNvbnN0YW50IG9iamVjdCB0byByZXR1cm4gZWFjaCB0aW1lIGluIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgY29uc3RhbnRUcmFuc2Zvcm1lcihPYmplY3QgY29uc3RhbnRUb1JldHVybikgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShjb25zdGFudFRvUmV0dXJuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgVHJhbnNmb3JtZXIgdGhhdCBjYWxscyBhIENsb3N1cmUgZWFjaCB0aW1lIHRoZSB0cmFuc2Zvcm1lciBpcyB1c2VkLgotICAgICAqIFRoZSB0cmFuc2Zvcm1lciByZXR1cm5zIHRoZSBpbnB1dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DbG9zdXJlVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZSAgdGhlIGNsb3N1cmUgdG8gcnVuIGVhY2ggdGltZSBpbiB0aGUgdHJhbnNmb3JtZXIsIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY2xvc3VyZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBhc1RyYW5zZm9ybWVyKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICByZXR1cm4gQ2xvc3VyZVRyYW5zZm9ybWVyLmdldEluc3RhbmNlKGNsb3N1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBUcmFuc2Zvcm1lciB0aGF0IGNhbGxzIGEgUHJlZGljYXRlIGVhY2ggdGltZSB0aGUgdHJhbnNmb3JtZXIgaXMgdXNlZC4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gZWl0aGVyIEJvb2xlYW4uVFJVRSBvciBCb29sZWFuLkZBTFNFLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuUHJlZGljYXRlVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHJ1biBlYWNoIHRpbWUgaW4gdGhlIHRyYW5zZm9ybWVyLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBhc1RyYW5zZm9ybWVyKFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIFByZWRpY2F0ZVRyYW5zZm9ybWVyLmdldEluc3RhbmNlKHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgYSBGYWN0b3J5IGVhY2ggdGltZSB0aGUgdHJhbnNmb3JtZXIgaXMgdXNlZC4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBmYWN0b3J5LgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuRmFjdG9yeVRyYW5zZm9ybWVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnkgIHRoZSBmYWN0b3J5IHRvIHJ1biBlYWNoIHRpbWUgaW4gdGhlIHRyYW5zZm9ybWVyLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZhY3RvcnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgYXNUcmFuc2Zvcm1lcihGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgcmV0dXJuIEZhY3RvcnlUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVHJhbnNmb3JtZXIgdGhhdCBjYWxscyB0d28gdHJhbnNmb3JtZXJzLCBwYXNzaW5nIHRoZSByZXN1bHQgb2YKLSAgICAgKiB0aGUgZmlyc3QgaW50byB0aGUgc2Vjb25kLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNoYWluZWRUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcjEgIHRoZSBmaXJzdCB0cmFuc2Zvcm1lcgotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcjIgIHRoZSBzZWNvbmQgdHJhbnNmb3JtZXIKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlciB0cmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBjaGFpbmVkVHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIxLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjIpIHsKLSAgICAgICAgcmV0dXJuIENoYWluZWRUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZSh0cmFuc2Zvcm1lcjEsIHRyYW5zZm9ybWVyMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgZWFjaCB0cmFuc2Zvcm1lciBpbiB0dXJuLCBwYXNzaW5nIHRoZSAKLSAgICAgKiByZXN1bHQgaW50byB0aGUgbmV4dCB0cmFuc2Zvcm1lci4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXJzICBhbiBhcnJheSBvZiB0cmFuc2Zvcm1lcnMgdG8gY2hhaW4KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0cmFuc2Zvcm1lcnMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSB0cmFuc2Zvcm1lciBpbiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgY2hhaW5lZFRyYW5zZm9ybWVyKFRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzKSB7Ci0gICAgICAgIHJldHVybiBDaGFpbmVkVHJhbnNmb3JtZXIuZ2V0SW5zdGFuY2UodHJhbnNmb3JtZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVHJhbnNmb3JtZXIgdGhhdCBjYWxscyBlYWNoIHRyYW5zZm9ybWVyIGluIHR1cm4sIHBhc3NpbmcgdGhlIAotICAgICAqIHJlc3VsdCBpbnRvIHRoZSBuZXh0IHRyYW5zZm9ybWVyLiBUaGUgb3JkZXJpbmcgaXMgdGhhdCBvZiB0aGUgaXRlcmF0b3IoKQotICAgICAqIG1ldGhvZCBvbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXJzICBhIGNvbGxlY3Rpb24gb2YgdHJhbnNmb3JtZXJzIHRvIGNoYWluCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNmb3JtZXJzIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSB0cmFuc2Zvcm1lciBpbiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBjaGFpbmVkVHJhbnNmb3JtZXIoQ29sbGVjdGlvbiB0cmFuc2Zvcm1lcnMpIHsKLSAgICAgICAgcmV0dXJuIENoYWluZWRUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZSh0cmFuc2Zvcm1lcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBUcmFuc2Zvcm1lciB0aGF0IGNhbGxzIG9uZSBvZiB0d28gdHJhbnNmb3JtZXJzIGRlcGVuZGluZyAKLSAgICAgKiBvbiB0aGUgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Td2l0Y2hUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gc3dpdGNoIG9uCi0gICAgICogQHBhcmFtIHRydWVUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIGNhbGxlZCBpZiB0aGUgcHJlZGljYXRlIGlzIHRydWUKLSAgICAgKiBAcGFyYW0gZmFsc2VUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIGNhbGxlZCBpZiB0aGUgcHJlZGljYXRlIGlzIGZhbHNlCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgc3dpdGNoVHJhbnNmb3JtZXIoUHJlZGljYXRlIHByZWRpY2F0ZSwgVHJhbnNmb3JtZXIgdHJ1ZVRyYW5zZm9ybWVyLCBUcmFuc2Zvcm1lciBmYWxzZVRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBTd2l0Y2hUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShuZXcgUHJlZGljYXRlW10geyBwcmVkaWNhdGUgfSwgbmV3IFRyYW5zZm9ybWVyW10geyB0cnVlVHJhbnNmb3JtZXIgfSwgZmFsc2VUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgb25lIG9mIHRoZSB0cmFuc2Zvcm1lcnMgZGVwZW5kaW5nIAotICAgICAqIG9uIHRoZSBwcmVkaWNhdGVzLiBUaGUgdHJhbnNmb3JtZXIgYXQgYXJyYXkgbG9jYXRpb24gMCBpcyBjYWxsZWQgaWYgdGhlCi0gICAgICogcHJlZGljYXRlIGF0IGFycmF5IGxvY2F0aW9uIDAgcmV0dXJuZWQgdHJ1ZS4gRWFjaCBwcmVkaWNhdGUgaXMgZXZhbHVhdGVkCi0gICAgICogdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gSWYgbm8gcHJlZGljYXRlcyBldmFsdWF0ZSB0byB0cnVlLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLlN3aXRjaFRyYW5zZm9ybWVyCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIGFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2sKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXJzICBhbiBhcnJheSBvZiB0cmFuc2Zvcm1lcnMgdG8gY2FsbAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGVpdGhlciBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGVpdGhlciBhcnJheSBoYXMgMCBlbGVtZW50cwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBlbGVtZW50IGluIHRoZSBhcnJheXMgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgc3dpdGNoVHJhbnNmb3JtZXIoUHJlZGljYXRlW10gcHJlZGljYXRlcywgVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMpIHsKLSAgICAgICAgcmV0dXJuIFN3aXRjaFRyYW5zZm9ybWVyLmdldEluc3RhbmNlKHByZWRpY2F0ZXMsIHRyYW5zZm9ybWVycywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgb25lIG9mIHRoZSB0cmFuc2Zvcm1lcnMgZGVwZW5kaW5nIAotICAgICAqIG9uIHRoZSBwcmVkaWNhdGVzLiBUaGUgdHJhbnNmb3JtZXIgYXQgYXJyYXkgbG9jYXRpb24gMCBpcyBjYWxsZWQgaWYgdGhlCi0gICAgICogcHJlZGljYXRlIGF0IGFycmF5IGxvY2F0aW9uIDAgcmV0dXJuZWQgdHJ1ZS4gRWFjaCBwcmVkaWNhdGUgaXMgZXZhbHVhdGVkCi0gICAgICogdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gSWYgbm8gcHJlZGljYXRlcyBldmFsdWF0ZSB0byB0cnVlLCB0aGUgZGVmYXVsdAotICAgICAqIHRyYW5zZm9ybWVyIGlzIGNhbGxlZC4gSWYgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Td2l0Y2hUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVycyAgYW4gYXJyYXkgb2YgdHJhbnNmb3JtZXJzIHRvIGNhbGwKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFRyYW5zZm9ybWVyICB0aGUgZGVmYXVsdCB0byBjYWxsIGlmIG5vIHByZWRpY2F0ZSBtYXRjaGVzLCBudWxsIG1lYW5zIHJldHVybiBudWxsCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZWl0aGVyIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZWl0aGVyIGFycmF5IGhhcyAwIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaW4gdGhlIGFycmF5cyBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBzd2l0Y2hUcmFuc2Zvcm1lcihQcmVkaWNhdGVbXSBwcmVkaWNhdGVzLCBUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycywgVHJhbnNmb3JtZXIgZGVmYXVsdFRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBTd2l0Y2hUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShwcmVkaWNhdGVzLCB0cmFuc2Zvcm1lcnMsIGRlZmF1bHRUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgb25lIG9mIHRoZSB0cmFuc2Zvcm1lcnMgZGVwZW5kaW5nIAotICAgICAqIG9uIHRoZSBwcmVkaWNhdGVzLiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTWFwIGNvbnNpc3RzIG9mIFByZWRpY2F0ZSBrZXlzIGFuZCBUcmFuc2Zvcm1lciB2YWx1ZXMuIEEgdHJhbnNmb3JtZXIgCi0gICAgICogaXMgY2FsbGVkIGlmIGl0cyBtYXRjaGluZyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLiBFYWNoIHByZWRpY2F0ZSBpcyBldmFsdWF0ZWQKLSAgICAgKiB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBJZiBubyBwcmVkaWNhdGVzIGV2YWx1YXRlIHRvIHRydWUsIHRoZSBkZWZhdWx0Ci0gICAgICogdHJhbnNmb3JtZXIgaXMgY2FsbGVkLiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciBpcyBzZXQgaW4gdGhlIG1hcCB3aXRoIGEgCi0gICAgICogbnVsbCBrZXkuIElmIG5vIGRlZmF1bHQgdHJhbnNmb3JtZXIgaXMgc2V0LCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW4gYSBkZWZhdWx0Ci0gICAgICogY2FzZS4gVGhlIG9yZGVyaW5nIGlzIHRoYXQgb2YgdGhlIGl0ZXJhdG9yKCkgbWV0aG9kIG9uIHRoZSBlbnRyeXNldCBjb2xsZWN0aW9uIAotICAgICAqIG9mIHRoZSBtYXAuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuU3dpdGNoVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycyAgYSBtYXAgb2YgcHJlZGljYXRlcyB0byB0cmFuc2Zvcm1lcnMKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgZW1wdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgdHJhbnNmb3JtZXIgaW4gdGhlIG1hcCBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gIGlmIHRoZSBtYXAgZWxlbWVudHMgYXJlIG9mIHRoZSB3cm9uZyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBzd2l0Y2hUcmFuc2Zvcm1lcihNYXAgcHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycykgewotICAgICAgICByZXR1cm4gU3dpdGNoVHJhbnNmb3JtZXIuZ2V0SW5zdGFuY2UocHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgdXNlcyB0aGUgaW5wdXQgb2JqZWN0IGFzIGEga2V5IHRvIGZpbmQgdGhlCi0gICAgICogdHJhbnNmb3JtZXIgdG8gY2FsbC4gCi0gICAgICogPHA+Ci0gICAgICogVGhlIE1hcCBjb25zaXN0cyBvZiBvYmplY3Qga2V5cyBhbmQgVHJhbnNmb3JtZXIgdmFsdWVzLiBBIHRyYW5zZm9ybWVyIAotICAgICAqIGlzIGNhbGxlZCBpZiB0aGUgaW5wdXQgb2JqZWN0IGVxdWFscyB0aGUga2V5LiBJZiB0aGVyZSBpcyBubyBtYXRjaCwgdGhlCi0gICAgICogZGVmYXVsdCB0cmFuc2Zvcm1lciBpcyBjYWxsZWQuIFRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyIGlzIHNldCBpbiB0aGUgbWFwCi0gICAgICogdXNpbmcgYSBudWxsIGtleS4gSWYgbm8gZGVmYXVsdCBpcyBzZXQsIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGRlZmF1bHQgY2FzZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Td2l0Y2hUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RzQW5kVHJhbnNmb3JtZXJzICBhIG1hcCBvZiBvYmplY3RzIHRvIHRyYW5zZm9ybWVycwotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBlbXB0eQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSB0cmFuc2Zvcm1lciBpbiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIHN3aXRjaE1hcFRyYW5zZm9ybWVyKE1hcCBvYmplY3RzQW5kVHJhbnNmb3JtZXJzKSB7Ci0gICAgICAgIFRyYW5zZm9ybWVyW10gdHJzID0gbnVsbDsKLSAgICAgICAgUHJlZGljYXRlW10gcHJlZHMgPSBudWxsOwotICAgICAgICBpZiAob2JqZWN0c0FuZFRyYW5zZm9ybWVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgb2JqZWN0IGFuZCB0cmFuc2Zvcm1lciBtYXAgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIFRyYW5zZm9ybWVyIGRlZiA9IChUcmFuc2Zvcm1lcikgb2JqZWN0c0FuZFRyYW5zZm9ybWVycy5yZW1vdmUobnVsbCk7Ci0gICAgICAgIGludCBzaXplID0gb2JqZWN0c0FuZFRyYW5zZm9ybWVycy5zaXplKCk7Ci0gICAgICAgIHRycyA9IG5ldyBUcmFuc2Zvcm1lcltzaXplXTsKLSAgICAgICAgcHJlZHMgPSBuZXcgUHJlZGljYXRlW3NpemVdOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvYmplY3RzQW5kVHJhbnNmb3JtZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgcHJlZHNbaV0gPSBFcXVhbFByZWRpY2F0ZS5nZXRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICB0cnNbaV0gPSAoVHJhbnNmb3JtZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN3aXRjaFRyYW5zZm9ybWVyKHByZWRzLCB0cnMsIGRlZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIFRyYW5zZm9ybWVyIHRoYXQgZXhwZWN0cyBhbiBpbnB1dCBDbGFzcyBvYmplY3QgdGhhdCBpdCB3aWxsIGluc3RhbnRpYXRlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbnRpYXRlVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgaW5zdGFudGlhdGVUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgcmV0dXJuIEluc3RhbnRpYXRlVHJhbnNmb3JtZXIuTk9fQVJHX0lOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDcmVhdGVzIGEgVHJhbnNmb3JtZXIgdGhhdCBleHBlY3RzIGFuIGlucHV0IENsYXNzIG9iamVjdCB0aGF0IGl0IHdpbGwgCi0gICAgICogaW5zdGFudGlhdGUuIFRoZSBjb25zdHJ1Y3RvciB1c2VkIGlzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQKLSAgICAgKiB0byB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbnRpYXRlVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyAgcGFyYW1ldGVyIHR5cGVzIGZvciB0aGUgY29uc3RydWN0b3IsIGNhbiBiZSBudWxsCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IsIGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcGFyYW1UeXBlcyBhbmQgYXJncyBkb24ndCBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgaW5zdGFudGlhdGVUcmFuc2Zvcm1lcihDbGFzc1tdIHBhcmFtVHlwZXMsIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIEluc3RhbnRpYXRlVHJhbnNmb3JtZXIuZ2V0SW5zdGFuY2UocGFyYW1UeXBlcywgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIENyZWF0ZXMgYSBUcmFuc2Zvcm1lciB0aGF0IHVzZXMgdGhlIHBhc3NlZCBpbiBNYXAgdG8gdHJhbnNmb3JtIHRoZSBpbnB1dCAKLSAgICAgKiBvYmplY3QgKGFzIGEgc2ltcGxlIGxvb2t1cCkuCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5NYXBUcmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlIHRvIHRyYW5zZm9ybSB0aGUgb2JqZWN0cwotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBtYXBUcmFuc2Zvcm1lcihNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiBNYXBUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBUcmFuc2Zvcm1lciB0aGF0IGludm9rZXMgYSBtZXRob2Qgb24gdGhlIGlucHV0IG9iamVjdC4KLSAgICAgKiBUaGUgbWV0aG9kIG11c3QgaGF2ZSBubyBwYXJhbWV0ZXJzLiBJZiB0aGUgaW5wdXQgb2JqZWN0IGlzIG51bGwsIAotICAgICAqIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIDxjb2RlPlRyYW5zZm9ybWVyVXRpbHMuaW52b2tlclRyYW5zZm9ybWVyKCJnZXROYW1lIik7PC9jb2RlPgotICAgICAqIHdpbGwgY2FsbCB0aGUgPGNvZGU+Z2V0TmFtZS9jb2RlPiBtZXRob2Qgb24gdGhlIGlucHV0IG9iamVjdCB0byAKLSAgICAgKiBkZXRlcm1pbmUgdGhlIHRyYW5zZm9ybWVyIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnZva2VyVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAgdGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gdGhlIGlucHV0IG9iamVjdCwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kTmFtZSBpcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgaW52b2tlclRyYW5zZm9ybWVyKFN0cmluZyBtZXRob2ROYW1lKXsKLSAgICAgICAgcmV0dXJuIEludm9rZXJUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtZXRob2ROYW1lLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgVHJhbnNmb3JtZXIgdGhhdCBpbnZva2VzIGEgbWV0aG9kIG9uIHRoZSBpbnB1dCBvYmplY3QuCi0gICAgICogVGhlIG1ldGhvZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQuIElmIHRoZSBpbnB1dCBvYmplY3QgaXMgbnVsbCwgCi0gICAgICogbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnZva2VyVHJhbnNmb3JtZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgcGFyYW1ldGVyIHR5cGVzCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgbmFtZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmFtVHlwZXMgYW5kIGFyZ3MgZG9uJ3QgbWF0Y2gKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGludm9rZXJUcmFuc2Zvcm1lcihTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKXsKLSAgICAgICAgcmV0dXJuIEludm9rZXJUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShtZXRob2ROYW1lLCBwYXJhbVR5cGVzLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdHJhbnNmb3JtZXIgdGhhdCByZXR1cm5zIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4KLSAgICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgb2JqZWN0LiBUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUKLSAgICAgKiA8Y29kZT50b1N0cmluZzwvY29kZT4gbWV0aG9kLCA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm5zICdudWxsJy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5TdHJpbmdWYWx1ZVRyYW5zZm9ybWVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIHN0cmluZ1ZhbHVlVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdWYWx1ZVRyYW5zZm9ybWVyLklOU1RBTkNFOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmVlQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJlZUJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmRkNjhjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmVlQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBBIHtAbGluayBCYWd9IHRoYXQgaXMgYmFja2VkIGJ5IGEge0BsaW5rIFRyZWVNYXB9LiAKLSAqIE9yZGVyIHdpbGwgYmUgbWFpbnRhaW5lZCBhbW9uZyB0aGUgdW5pcXVlIHJlcHJlc2VudGF0aXZlCi0gKiBtZW1iZXJzLgotICoKLSAqIEBkZXByZWNhdGVkIE1vdmVkIHRvIGJhZyBzdWJwYWNrYWdlIGFuZCByZXdyaXR0ZW4gaW50ZXJuYWxseS4gRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKiAKLSAqIEBhdXRob3IgQ2h1Y2sgQnVyZGljawotICovCi1wdWJsaWMgY2xhc3MgVHJlZUJhZyBleHRlbmRzIERlZmF1bHRNYXBCYWcgaW1wbGVtZW50cyBTb3J0ZWRCYWcgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSA8Y29kZT5UcmVlQmFnPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZUJhZygpIHsKLSAgICAgICAgc3VwZXIobmV3IFRyZWVNYXAoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSB7QGxpbmsgQmFnfSB0aGF0IG1haW50YWlucyBvcmRlciBvbiBpdHMgdW5pcXVlCi0gICAgICogcmVwcmVzZW50YXRpdmUgbWVtYmVycyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBDb21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFRyZWVCYWcoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBUcmVlTWFwKGNvbXBhcmF0b3IpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIEJhZ30gY29udGFpbmluZyBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuCi0gICAgICogY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY29weSBpbnRvIHRoZSBiYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZUJhZyhDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBhZGRBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBmaXJzdCgpIHsKLSAgICAgICAgcmV0dXJuICgoU29ydGVkTWFwKSBnZXRNYXAoKSkuZmlyc3RLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3QoKSB7Ci0gICAgICAgIHJldHVybiAoKFNvcnRlZE1hcCkgZ2V0TWFwKCkpLmxhc3RLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKChTb3J0ZWRNYXApIGdldE1hcCgpKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VuYm91bmRlZEZpZm9CdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9VbmJvdW5kZWRGaWZvQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2OTVmNzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VuYm91bmRlZEZpZm9CdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVW5ib3VuZGVkRmlmb0J1ZmZlciBpcyBhIHZlcnkgZWZmaWNpZW50IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4KLSAqIEFjY29yZGluZyB0byBwZXJmb3JtYW5jZSB0ZXN0aW5nLCBpdCBleGhpYml0cyBhIGNvbnN0YW50IGFjY2VzcyB0aW1lLCBidXQgaXQKLSAqIGFsc28gb3V0cGVyZm9ybXMgQXJyYXlMaXN0IHdoZW4gdXNlZCBmb3IgdGhlIHNhbWUgcHVycG9zZS4KLSAqIDxwPgotICogVGhlIHJlbW92YWwgb3JkZXIgb2YgYW4gPGNvZGU+VW5ib3VuZGVkRmlmb0J1ZmZlcjwvY29kZT4gaXMgYmFzZWQgb24gdGhlIGluc2VydGlvbgotICogb3JkZXI7IGVsZW1lbnRzIGFyZSByZW1vdmVkIGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KLSAqIFRoZSBpdGVyYXRpb24gb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW92YWwgb3JkZXIuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgI3JlbW92ZSgpfSBhbmQge0BsaW5rICNnZXQoKX0gb3BlcmF0aW9ucyBwZXJmb3JtIGluIGNvbnN0YW50IHRpbWUuCi0gKiBUaGUge0BsaW5rICNhZGQoT2JqZWN0KX0gb3BlcmF0aW9uIHBlcmZvcm1zIGluIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAgQWxsCi0gKiBvdGhlciBvcGVyYXRpb25zIHBlcmZvcm0gaW4gbGluZWFyIHRpbWUgb3Igd29yc2UuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuICBUaGUgZm9sbG93aW5nIGNhbiBiZQotICogdXNlZCB0byBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8geW91ciA8Y29kZT5VbmJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPjoKLSAqIDxwcmU+Ci0gKiAgIEJ1ZmZlciBmaWZvID0gQnVmZmVyVXRpbHMuc3luY2hyb25pemVkQnVmZmVyKG5ldyBVbmJvdW5kZWRGaWZvQnVmZmVyKCkpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgYnVmZmVyIHByZXZlbnRzIG51bGwgb2JqZWN0cyBmcm9tIGJlaW5nIGFkZGVkLgotICogCi0gKiBAZGVwcmVjYXRlZCBNb3ZlZCB0byBidWZmZXIgc3VicGFja2FnZS4gRHVlIHRvIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOCAkCi0gKgotICogQGF1dGhvciBBdmFsb24KLSAqIEBhdXRob3IgRmVkZXJpY28gQmFyYmllcmkKLSAqIEBhdXRob3IgQmVyaW4gTG9yaXRzY2gKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBBbmRyZWFzIFNjaGxvc3NlcgotICovCi1wdWJsaWMgY2xhc3MgVW5ib3VuZGVkRmlmb0J1ZmZlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbiBpbXBsZW1lbnRzIEJ1ZmZlciB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIG1fYnVmZmVyOwotICAgIHByb3RlY3RlZCBpbnQgbV9oZWFkOwotICAgIHByb3RlY3RlZCBpbnQgbV90YWlsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmJvdW5kZWRGaWZvQnVmZmVyIHdpdGggdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgICAqIEl0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nOgotICAgICAqCi0gICAgICogPHByZT4KLSAgICAgKiAgIG5ldyBVbmJvdW5kZWRGaWZvQnVmZmVyKDMyKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgVW5ib3VuZGVkRmlmb0J1ZmZlcigpIHsKLSAgICAgICAgdGhpcygzMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmJvdW5kZWRGaWZvQnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICogVGhlIGludGVnZXIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxTaXplICB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5ib3VuZGVkRmlmb0J1ZmZlcihpbnQgaW5pdGlhbFNpemUpIHsKLSAgICAgICAgaWYgKGluaXRpYWxTaXplIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKLSAgICAgICAgfQotICAgICAgICBtX2J1ZmZlciA9IG5ldyBPYmplY3RbaW5pdGlhbFNpemUgKyAxXTsKLSAgICAgICAgbV9oZWFkID0gMDsKLSAgICAgICAgbV90YWlsID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyJ3Mgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotCi0gICAgICAgIGlmIChtX3RhaWwgPCBtX2hlYWQpIHsKLSAgICAgICAgICAgIHNpemUgPSBtX2J1ZmZlci5sZW5ndGggLSBtX2hlYWQgKyBtX3RhaWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplID0gbV90YWlsIC0gbV9oZWFkOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gKHNpemUoKSA9PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBlbGVtZW50IHRvIHRoaXMgYnVmZmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIGVsZW1lbnQgdG8gYWRkCi0gICAgICogQHJldHVybiB0cnVlLCBhbHdheXMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBudWxsCi0gICAgICogQHRocm93cyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiAgaWYgdGhpcyBidWZmZXIgaXMgZnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBdHRlbXB0ZWQgdG8gYWRkIG51bGwgb2JqZWN0IHRvIGJ1ZmZlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemUoKSArIDEgPj0gbV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSB0bXAgPSBuZXcgT2JqZWN0WygobV9idWZmZXIubGVuZ3RoIC0gMSkgKiAyKSArIDFdOwotCi0gICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbV9oZWFkOyBpICE9IG1fdGFpbDspIHsKLSAgICAgICAgICAgICAgICB0bXBbal0gPSBtX2J1ZmZlcltpXTsKLSAgICAgICAgICAgICAgICBtX2J1ZmZlcltpXSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGlmIChpID09IG1fYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fYnVmZmVyID0gdG1wOwotICAgICAgICAgICAgbV9oZWFkID0gMDsKLSAgICAgICAgICAgIG1fdGFpbCA9IGo7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2J1ZmZlclttX3RhaWxdID0gb2JqOwotICAgICAgICBtX3RhaWwrKzsKLSAgICAgICAgaWYgKG1fdGFpbCA+PSBtX2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgIG1fdGFpbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBidWZmZXIKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiAgaWYgdGhpcyBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbV9idWZmZXJbbV9oZWFkXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBidWZmZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgb2JqZWN0Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoKSB7Ci0gICAgICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oIlRoZSBidWZmZXIgaXMgYWxyZWFkeSBlbXB0eSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBtX2J1ZmZlclttX2hlYWRdOwotCi0gICAgICAgIGlmIChudWxsICE9IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIG1fYnVmZmVyW21faGVhZF0gPSBudWxsOwotCi0gICAgICAgICAgICBtX2hlYWQrKzsKLSAgICAgICAgICAgIGlmIChtX2hlYWQgPj0gbV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgbV9oZWFkID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudHMgdGhlIGludGVybmFsIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGluY3JlbWVudAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgaW5kZXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBpbmNyZW1lbnQoaW50IGluZGV4KSB7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGlmIChpbmRleCA+PSBtX2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjcmVtZW50cyB0aGUgaW50ZXJuYWwgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gZGVjcmVtZW50Ci0gICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBpbmRleAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGRlY3JlbWVudChpbnQgaW5kZXgpIHsKLSAgICAgICAgaW5kZXgtLTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgaW5kZXggPSBtX2J1ZmZlci5sZW5ndGggLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBidWZmZXIncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGJ1ZmZlcidzIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IG1faGVhZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9IG1fdGFpbDsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGluY3JlbWVudChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fYnVmZmVyW2xhc3RSZXR1cm5lZEluZGV4XTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCBxdWlja2x5Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID09IG1faGVhZCkgewotICAgICAgICAgICAgICAgICAgICBVbmJvdW5kZWRGaWZvQnVmZmVyLnRoaXMucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPdGhlciBlbGVtZW50cyByZXF1aXJlIHVzIHRvIHNoaWZ0IHRoZSBzdWJzZXF1ZW50IGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgaW50IGkgPSBpbmNyZW1lbnQobGFzdFJldHVybmVkSW5kZXgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpICE9IG1fdGFpbCkgewotICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcltkZWNyZW1lbnQoaSldID0gbV9idWZmZXJbaV07Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBpbmNyZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBtX3RhaWwgPSBkZWNyZW1lbnQobV90YWlsKTsKLSAgICAgICAgICAgICAgICBtX2J1ZmZlclttX3RhaWxdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGRlY3JlbWVudChpbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVW5tb2RpZmlhYmxlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVW5tb2RpZmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5ZmE0ZjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1VubW9kaWZpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczsKLQotLyoqCi0gKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBjb2xsZWN0aW9ucywgbWFwcyBhbmQgaXRlcmF0b3JzIHRoYXQgYXJlIHVubW9kaWZpYWJsZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgZW5hYmxlcyB0ZXN0aW5nIHN1Y2ggYXM6Ci0gKiA8cHJlPgotICogaWYgKGNvbGwgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAqICAgY29sbCA9IG5ldyBBcnJheUxpc3QoY29sbCk7Ci0gKiB9Ci0gKiAvLyBub3cgd2Uga25vdyBjb2xsIGlzIG1vZGlmaWFibGUKLSAqIDwvcHJlPgotICogT2YgY291cnNlIGFsbCB0aGlzIG9ubHkgd29ya3MgaWYgeW91IHVzZSB0aGUgVW5tb2RpZmlhYmxlIGNsYXNzZXMgZGVmaW5lZAotICogaW4gdGhpcyBsaWJyYXJ5LiBJZiB5b3UgdXNlIHRoZSBKREsgdW5tb2RpZmlhYmxlIGNsYXNzIHZpYSBqYXZhIHV0aWwgQ29sbGVjdGlvbnMKLSAqIHRoZW4gdGhlIGludGVyZmFjZSB3b24ndCBiZSB0aGVyZS4KLSAqICAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoxOSAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGludGVyZmFjZSBVbm1vZGlmaWFibGUgewotICAgIC8vIG1hcmtlciBpbnRlcmZhY2UgLSBubyBtZXRob2RzIHRvIGltcGxlbWVudAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdEJhZ0RlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdEJhZ0RlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDEzMWI2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvQWJzdHJhY3RCYWdEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJhZzwvY29kZT4gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGJlaGF2aW91ci4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgZm9yd2FyZGVkIGRpcmVjdGx5IHRvIHRoZSBkZWNvcmF0ZWQgYmFnLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJhZ0RlY29yYXRvcgotICAgICAgICBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvciBpbXBsZW1lbnRzIEJhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBvbmx5IHVzZWQgaW4gZGVzZXJpYWxpemF0aW9uLCBkbyBub3QgdXNlIG90aGVyd2lzZS4KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RCYWdEZWNvcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3QgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEJhZ0RlY29yYXRvcihCYWcgYmFnKSB7Ci0gICAgICAgIHN1cGVyKGJhZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYmFnIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYmFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJhZyBnZXRCYWcoKSB7Ci0gICAgICAgIHJldHVybiAoQmFnKSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gZ2V0QmFnKCkuZ2V0Q291bnQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRCYWcoKS5hZGQob2JqZWN0LCBjb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBjb3VudCkgewotICAgICAgICByZXR1cm4gZ2V0QmFnKCkucmVtb3ZlKG9iamVjdCwgY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgdW5pcXVlU2V0KCkgewotICAgICAgICByZXR1cm4gZ2V0QmFnKCkudW5pcXVlU2V0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0TWFwQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0TWFwQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NWQ3NmUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdE1hcEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVW5tb2RpZmlhYmxlU2V0OwotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uCi0gKiBvZiBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgc3BlY2lmeSBhIE1hcCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYXMgdGhlIGludGVybmFsIHN0b3JhZ2UuCi0gKiBUaGUgbWFwIHdpbGwgYmUgdXNlZCB0byBtYXAgYmFnIGVsZW1lbnRzIHRvIGEgbnVtYmVyOyB0aGUgbnVtYmVyIHJlcHJlc2VudHMKLSAqIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhhdCBlbGVtZW50IGluIHRoZSBiYWcuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wIChwcmV2aW91c2x5IERlZmF1bHRNYXBCYWcgdjIuMCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIENodWNrIEJ1cmRpY2sKLSAqIEBhdXRob3IgTWljaGFlbCBBLiBTbWl0aAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSmFuZWsgQm9ndWNraQotICogQGF1dGhvciBTdGV2ZSBDbGFyawotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXBCYWcgaW1wbGVtZW50cyBCYWcgewotICAgIAotICAgIC8qKiBUaGUgbWFwIHRvIHVzZSB0byBzdG9yZSB0aGUgZGF0YSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcCBtYXA7Ci0gICAgLyoqIFRoZSBjdXJyZW50IHRvdGFsIHNpemUgb2YgdGhlIGJhZyAqLwotICAgIHByaXZhdGUgaW50IHNpemU7Ci0gICAgLyoqIFRoZSBtb2RpZmljYXRpb24gY291bnQgZm9yIGZhaWwgZmFzdCBpdGVyYXRvcnMgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgbW9kQ291bnQ7Ci0gICAgLyoqIFRoZSBtb2RpZmljYXRpb24gY291bnQgZm9yIGZhaWwgZmFzdCBpdGVyYXRvcnMgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTZXQgdW5pcXVlU2V0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgbmVlZGVkIGZvciBzdWJjbGFzcyBzZXJpYWxpc2F0aW9uLgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdE1hcEJhZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFzc2lnbnMgdGhlIHNwZWNpZmllZCBNYXAgYXMgdGhlIGJhY2tpbmcgc3RvcmUuCi0gICAgICogVGhlIG1hcCBtdXN0IGJlIGVtcHR5IGFuZCBub24tbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGFzc2lnbgotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdE1hcEJhZyhNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBpbXBsZW1lbnRhdGlvbnMgdG8gYWNjZXNzIHRoZSBtYXAgdGhhdCBiYWNrcwotICAgICAqIHRoaXMgYmFnLiBOb3QgaW50ZW5kZWQgZm9yIGludGVyYWN0aXZlIHVzZSBvdXRzaWRlIG9mIHN1YmNsYXNzZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFwIGJlaW5nIHVzZWQgYnkgdGhlIEJhZwotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgZ2V0TWFwKCkgewotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBiYWcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYmFnCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgbWFwIGlzIGVtcHR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIGJhZyBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoaXMgYmFnCi0gICAgICogYnkgbG9va2luZyB1cCBpdHMgY291bnQgaW4gdGhlIHVuZGVybHlpbmcgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBvYmplY3QsIHplcm8gaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb3VudChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIE11dGFibGVJbnRlZ2VyIGNvdW50ID0gKE11dGFibGVJbnRlZ2VyKSBtYXAuZ2V0KG9iamVjdCk7Ci0gICAgICAgIGlmIChjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY291bnQudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIGJhZyBjb250YWlucyB0aGUgZ2l2ZW4gZWxlbWVudCBieSBjaGVja2luZyBpZiB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIG1hcCBjb250YWlucyB0aGUgZWxlbWVudCBhcyBhIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmFnIGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgYmFnIGNvbnRhaW5zIHRoZSBnaXZlbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2sgYWdhaW5zdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEJhZyBjb250YWlucyBhbGwgdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgaW5zdGFuY2VvZiBCYWcpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250YWluc0FsbCgoQmFnKSBjb2xsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNBbGwobmV3IEhhc2hCYWcoY29sbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJhZyBjb250YWlucyBhbGwgZWxlbWVudHMgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiwgcmVzcGVjdGluZyBjYXJkaW5hbGl0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3RoZXIgIHRoZSBiYWcgdG8gY2hlY2sgYWdhaW5zdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEJhZyBjb250YWlucyBhbGwgdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbnRhaW5zQWxsKEJhZyBvdGhlcikgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gb3RoZXIudW5pcXVlU2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zID0gZ2V0Q291bnQoY3VycmVudCkgPj0gb3RoZXIuZ2V0Q291bnQoY3VycmVudCk7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgY29udGFpbnM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIHRoZSBiYWcgZWxlbWVudHMuCi0gICAgICogRWxlbWVudHMgcHJlc2VudCBpbiB0aGUgQmFnIG1vcmUgdGhhbiBvbmNlIHdpbGwgYmUgcmV0dXJuZWQgcmVwZWF0ZWRseS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCYWdJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBpdGVyYXRvciBmb3IgdGhlIEJhZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgQmFnSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgICAgIHByaXZhdGUgQWJzdHJhY3RNYXBCYWcgcGFyZW50OwotICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIGVudHJ5SXRlcmF0b3I7Ci0gICAgICAgIHByaXZhdGUgTWFwLkVudHJ5IGN1cnJlbnQ7Ci0gICAgICAgIHByaXZhdGUgaW50IGl0ZW1Db3VudDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbW9kczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGJhZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJhZ0l0ZXJhdG9yKEFic3RyYWN0TWFwQmFnIHBhcmVudCkgewotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICB0aGlzLmVudHJ5SXRlcmF0b3IgPSBwYXJlbnQubWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLm1vZHMgPSBwYXJlbnQubW9kQ291bnQ7Ci0gICAgICAgICAgICB0aGlzLmNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoaXRlbUNvdW50ID4gMCB8fCBlbnRyeUl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50Lm1vZENvdW50ICE9IG1vZHMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ZW1Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudCA9IChNYXAuRW50cnkpIGVudHJ5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA9ICgoTXV0YWJsZUludGVnZXIpIGN1cnJlbnQuZ2V0VmFsdWUoKSkudmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSB0cnVlOwotICAgICAgICAgICAgaXRlbUNvdW50LS07Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gbW9kcykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FuUmVtb3ZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTXV0YWJsZUludGVnZXIgbXV0ID0gKE11dGFibGVJbnRlZ2VyKSBjdXJyZW50LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAobXV0LnZhbHVlID4gMSkgewotICAgICAgICAgICAgICAgIG11dC52YWx1ZS0tOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbnRyeUl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50LnNpemUtLTsKLSAgICAgICAgICAgIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0byB0aGUgYmFnLCBpbmNyZW1lbnRpbmcgaXRzIGNvdW50IGluIHRoZSB1bmRlcmx5aW5nIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gYWRkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IHdhcyBub3QgYWxyZWFkeSBpbiB0aGUgPGNvZGU+dW5pcXVlU2V0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBhZGQob2JqZWN0LCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGJhZywgaW5jcmVtZW50aW5nIGl0cyBjb3VudCBpbiB0aGUgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBzZWFyY2ggZm9yCi0gICAgICogQHBhcmFtIG5Db3BpZXMgIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGFkZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCB3YXMgbm90IGFscmVhZHkgaW4gdGhlIDxjb2RlPnVuaXF1ZVNldDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCwgaW50IG5Db3BpZXMpIHsKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgaWYgKG5Db3BpZXMgPiAwKSB7Ci0gICAgICAgICAgICBNdXRhYmxlSW50ZWdlciBtdXQgPSAoTXV0YWJsZUludGVnZXIpIG1hcC5nZXQob2JqZWN0KTsKLSAgICAgICAgICAgIHNpemUgKz0gbkNvcGllczsKLSAgICAgICAgICAgIGlmIChtdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hcC5wdXQob2JqZWN0LCBuZXcgTXV0YWJsZUludGVnZXIobkNvcGllcykpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdXQudmFsdWUgKz0gbkNvcGllczsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHtAbGluayAjYWRkKE9iamVjdCl9IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gYWRkCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhbGwgY2hhbmdlZCB0aGUgYmFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGNvbGwuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFkZGVkID0gYWRkKGkubmV4dCgpKTsKLSAgICAgICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IGFkZGVkOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGJhZyBieSBjbGVhcmluZyB0aGUgdW5kZXJseWluZyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgICAgIG1hcC5jbGVhcigpOwotICAgICAgICBzaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBjb3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgYmFnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBiYWcgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIE11dGFibGVJbnRlZ2VyIG11dCA9IChNdXRhYmxlSW50ZWdlcikgbWFwLmdldChvYmplY3QpOwotICAgICAgICBpZiAobXV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICBtYXAucmVtb3ZlKG9iamVjdCk7Ci0gICAgICAgIHNpemUgLT0gbXV0LnZhbHVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb3BpZXMgb2YgYW4gb2JqZWN0IGZyb20gdGhlIGJhZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIHJlbW92ZQotICAgICAqIEBwYXJhbSBuQ29waWVzICB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJhZyBjaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBuQ29waWVzKSB7Ci0gICAgICAgIE11dGFibGVJbnRlZ2VyIG11dCA9IChNdXRhYmxlSW50ZWdlcikgbWFwLmdldChvYmplY3QpOwotICAgICAgICBpZiAobXV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobkNvcGllcyA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgaWYgKG5Db3BpZXMgPCBtdXQudmFsdWUpIHsKLSAgICAgICAgICAgIG11dC52YWx1ZSAtPSBuQ29waWVzOwotICAgICAgICAgICAgc2l6ZSAtPSBuQ29waWVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFwLnJlbW92ZShvYmplY3QpOwotICAgICAgICAgICAgc2l6ZSAtPSBtdXQudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBvYmplY3RzIGZyb20gdGhlIGJhZyBhY2NvcmRpbmcgdG8gdGhlaXIgY291bnQgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byB1c2UKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJhZyBjaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBpZiAoY29sbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gY29sbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gcmVtb3ZlKGkubmV4dCgpLCAxKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgY2hhbmdlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbnkgbWVtYmVycyBvZiB0aGUgYmFnIHRoYXQgYXJlIG5vdCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiBiYWcsIHJlc3BlY3RpbmcgY2FyZGluYWxpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gcmV0YWluCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCBjaGFuZ2VkIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBpZiAoY29sbCBpbnN0YW5jZW9mIEJhZykgewotICAgICAgICAgICAgcmV0dXJuIHJldGFpbkFsbCgoQmFnKSBjb2xsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0YWluQWxsKG5ldyBIYXNoQmFnKGNvbGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYW55IG1lbWJlcnMgb2YgdGhlIGJhZyB0aGF0IGFyZSBub3QgaW4gdGhlIGdpdmVuCi0gICAgICogYmFnLCByZXNwZWN0aW5nIGNhcmRpbmFsaXR5LgotICAgICAqIEBzZWUgI3JldGFpbkFsbChDb2xsZWN0aW9uKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvdGhlciAgdGhlIGJhZyB0byByZXRhaW4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2FsbCBjaGFuZ2VkIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgYm9vbGVhbiByZXRhaW5BbGwoQmFnIG90aGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIEJhZyBleGNlc3MgPSBuZXcgSGFzaEJhZygpOwotICAgICAgICBJdGVyYXRvciBpID0gdW5pcXVlU2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudCA9IGkubmV4dCgpOwotICAgICAgICAgICAgaW50IG15Q291bnQgPSBnZXRDb3VudChjdXJyZW50KTsKLSAgICAgICAgICAgIGludCBvdGhlckNvdW50ID0gb3RoZXIuZ2V0Q291bnQoY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoMSA8PSBvdGhlckNvdW50ICYmIG90aGVyQ291bnQgPD0gbXlDb3VudCkgewotICAgICAgICAgICAgICAgIGV4Y2Vzcy5hZGQoY3VycmVudCwgbXlDb3VudCAtIG90aGVyQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBleGNlc3MuYWRkKGN1cnJlbnQsIG15Q291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVtb3ZlQWxsKGV4Y2Vzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogTXV0YWJsZSBpbnRlZ2VyIGNsYXNzIGZvciBzdG9yaW5nIHRoZSBkYXRhLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTXV0YWJsZUludGVnZXIgewotICAgICAgICAvKiogVGhlIHZhbHVlIG9mIHRoaXMgbXV0YWJsZS4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCB2YWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICogQHBhcmFtIHZhbHVlICB0aGUgaW5pdGlhbCB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgTXV0YWJsZUludGVnZXIoaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTXV0YWJsZUludGVnZXIgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKChNdXRhYmxlSW50ZWdlcikgb2JqKS52YWx1ZSA9PSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBvZiB0aGlzIGJhZydzIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l6ZSgpXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gZ2V0Q291bnQoY3VycmVudCk7IGluZGV4ID4gMDsgaW5kZXgtLSkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpKytdID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBwb3B1bGF0ZQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIG9mIHRoaXMgYmFnJ3MgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA8IHNpemUpIHsKLSAgICAgICAgICAgIGFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSBnZXRDb3VudChjdXJyZW50KTsgaW5kZXggPiAwOyBpbmRleC0tKSB7Ci0gICAgICAgICAgICAgICAgYXJyYXlbaSsrXSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgIGFycmF5W3NpemVdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgdW5kZXJseWluZyBtYXAncyBrZXkgc2V0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGlzIGJhZwotICAgICAqLwotICAgIHB1YmxpYyBTZXQgdW5pcXVlU2V0KCkgewotICAgICAgICBpZiAodW5pcXVlU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHVuaXF1ZVNldCA9IFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShtYXAua2V5U2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1bmlxdWVTZXQ7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Xcml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGVJbnQobWFwLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KCgoTXV0YWJsZUludGVnZXIpIGVudHJ5LmdldFZhbHVlKCkpLnZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdXNlCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvUmVhZE9iamVjdChNYXAgbWFwLCBPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5tYXAgPSBtYXA7Ci0gICAgICAgIGludCBlbnRyeVNpemUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlTaXplOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBtYXAucHV0KG9iaiwgbmV3IE11dGFibGVJbnRlZ2VyKGNvdW50KSk7Ci0gICAgICAgICAgICBzaXplICs9IGNvdW50OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIEJhZyB0byBhbm90aGVyLgotICAgICAqIFRoaXMgQmFnIGVxdWFscyBhbm90aGVyIEJhZyBpZiBpdCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YKLSAgICAgKiB0aGUgc2FtZSBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgQmFnIHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCYWcgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBCYWcgb3RoZXIgPSAoQmFnKSBvYmplY3Q7Ci0gICAgICAgIGlmIChvdGhlci5zaXplKCkgIT0gc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvdGhlci5nZXRDb3VudChlbGVtZW50KSAhPSBnZXRDb3VudChlbGVtZW50KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgaGFzaCBjb2RlIGZvciB0aGUgQmFnIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBlcXVhbHMuCi0gICAgICogVGhlIGhhc2ggY29kZSBpcyBkZWZpbmVkIGFzIHRoZSBzdW0gdG90YWwgb2YgYSBoYXNoIGNvZGUgZm9yIGVhY2ggZWxlbWVudC4KLSAgICAgKiBUaGUgcGVyIGVsZW1lbnQgaGFzaCBjb2RlIGlzIGRlZmluZWQgYXMKLSAgICAgKiA8Y29kZT4oZT09bnVsbCA/IDAgOiBlLmhhc2hDb2RlKCkpIF4gbm9PY2N1cmFuY2VzKTwvY29kZT4uCi0gICAgICogVGhpcyBoYXNoIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBTZXQgaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGUgQmFnCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBNdXRhYmxlSW50ZWdlciBjb3VudCA9IChNdXRhYmxlSW50ZWdlcikgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRvdGFsICs9IChlbGVtZW50ID09IG51bGwgPyAwIDogZWxlbWVudC5oYXNoQ29kZSgpKSBeIGNvdW50LnZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgYSB0b1N0cmluZygpIG1ldGhvZCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBkZWJ1Z2dpbmcgdG9TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiW10iOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSB1bmlxdWVTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGdldENvdW50KGN1cnJlbnQpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChjb3VudCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL0Fic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMzA2NjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9BYnN0cmFjdFNvcnRlZEJhZ0RlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Tb3J0ZWRCYWc7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkQmFnPC9jb2RlPiB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBiYWcuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RCYWdEZWNvcmF0b3IgaW1wbGVtZW50cyBTb3J0ZWRCYWcgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U29ydGVkQmFnRGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTb3J0ZWRCYWdEZWNvcmF0b3IoU29ydGVkQmFnIGJhZykgewotICAgICAgICBzdXBlcihiYWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJhZyBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIGJhZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRCYWcgZ2V0U29ydGVkQmFnKCkgewotICAgICAgICByZXR1cm4gKFNvcnRlZEJhZykgZ2V0Q29sbGVjdGlvbigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkQmFnKCkuZmlyc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRCYWcoKS5sYXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhcmF0b3IgY29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJhZygpLmNvbXBhcmF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvSGFzaEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9IYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyMjAwYWYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9IYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CYWc7Ci0KLS8qKgotICogSW1wbGVtZW50cyA8Y29kZT5CYWc8L2NvZGU+LCB1c2luZyBhIDxjb2RlPkhhc2hNYXA8L2NvZGU+IHRvIHByb3ZpZGUgdGhlCi0gKiBkYXRhIHN0b3JhZ2UuIFRoaXMgaXMgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIGEgYmFnLgotICogPHA+Ci0gKiBBIDxjb2RlPkJhZzwvY29kZT4gc3RvcmVzIGVhY2ggb2JqZWN0IGluIHRoZSBjb2xsZWN0aW9uIHRvZ2V0aGVyIHdpdGggYQotICogY291bnQgb2Ygb2NjdXJyZW5jZXMuIEV4dHJhIG1ldGhvZHMgb24gdGhlIGludGVyZmFjZSBhbGxvdyBtdWx0aXBsZSBjb3BpZXMKLSAqIG9mIGFuIG9iamVjdCB0byBiZSBhZGRlZCBvciByZW1vdmVkIGF0IG9uY2UuIEl0IGlzIGltcG9ydGFudCB0byByZWFkIHRoZQotICogaW50ZXJmYWNlIGphdmFkb2MgY2FyZWZ1bGx5IGFzIHNldmVyYWwgbWV0aG9kcyB2aW9sYXRlIHRoZQotICogPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wIChwcmV2aW91c2x5IGluIG1haW4gcGFja2FnZSB2Mi4wKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBhdXRob3IgQ2h1Y2sgQnVyZGljawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEhhc2hCYWcKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1hcEJhZyBpbXBsZW1lbnRzIEJhZywgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBsb2NrICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY1NjExMTU0MzU4MDI1NTQwMTNMOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgPGNvZGU+SGFzaEJhZzwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIEhhc2hCYWcoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBIYXNoTWFwKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBiYWcgY29udGFpbmluZyBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIGEgY29sbGVjdGlvbiB0byBjb3B5IGludG8gdGhpcyBiYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaEJhZyhDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBhZGRBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBiYWcgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgc3VwZXIuZG9Xcml0ZU9iamVjdChvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGJhZyBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBzdXBlci5kb1JlYWRPYmplY3QobmV3IEhhc2hNYXAoKSwgaW4pOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvUHJlZGljYXRlZEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiOTE2MWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlByZWRpY2F0ZWRDb2xsZWN0aW9uOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJhZzwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBiYWcgZXhpc3RzIHRvIHByb3ZpZGUgdmFsaWRhdGlvbiBmb3IgdGhlIGRlY29yYXRlZCBiYWcuCi0gKiBJdCBpcyBub3JtYWxseSBjcmVhdGVkIHRvIGRlY29yYXRlIGFuIGVtcHR5IGJhZy4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGJhZywgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIDxwPgotICogT25lIHVzYWdlIHdvdWxkIGJlIHRvIGVuc3VyZSB0aGF0IG5vIG51bGwgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIGJhZy4KLSAqIDxwcmU+QmFnIGJhZyA9IFByZWRpY2F0ZWRCYWcuZGVjb3JhdGUobmV3IEhhc2hCYWcoKSwgTm90TnVsbFByZWRpY2F0ZS5JTlNUQU5DRSk7PC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkaWNhdGVkQmFnCi0gICAgICAgIGV4dGVuZHMgUHJlZGljYXRlZENvbGxlY3Rpb24gaW1wbGVtZW50cyBCYWcgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTc1ODMzMTQwMzQ0NzM2ODc2TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHByZWRpY2F0ZWQgKHZhbGlkYXRpbmcpIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGJhZyBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgcHJlZGljYXRlZCBCYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgb3IgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYmFnIGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJhZyBkZWNvcmF0ZShCYWcgYmFnLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZEJhZyhiYWcsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgYmFnIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJhZyBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZWRCYWcoQmFnIGJhZywgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcihiYWcsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVjb3JhdGVkIGJhZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYmFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJhZyBnZXRCYWcoKSB7Ci0gICAgICAgIHJldHVybiAoQmFnKSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiBnZXRCYWcoKS5hZGQob2JqZWN0LCBjb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBjb3VudCkgewotICAgICAgICByZXR1cm4gZ2V0QmFnKCkucmVtb3ZlKG9iamVjdCwgY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgdW5pcXVlU2V0KCkgewotICAgICAgICByZXR1cm4gZ2V0QmFnKCkudW5pcXVlU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb3VudChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBnZXRCYWcoKS5nZXRDb3VudChvYmplY3QpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9QcmVkaWNhdGVkU29ydGVkQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1ByZWRpY2F0ZWRTb3J0ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNhOGFjOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1ByZWRpY2F0ZWRTb3J0ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmFnOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNvcnRlZEJhZzwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBiYWcgZXhpc3RzIHRvIHByb3ZpZGUgdmFsaWRhdGlvbiBmb3IgdGhlIGRlY29yYXRlZCBiYWcuCi0gKiBJdCBpcyBub3JtYWxseSBjcmVhdGVkIHRvIGRlY29yYXRlIGFuIGVtcHR5IGJhZy4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGJhZywgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIDxwPgotICogT25lIHVzYWdlIHdvdWxkIGJlIHRvIGVuc3VyZSB0aGF0IG5vIG51bGwgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIGJhZy4KLSAqIDxwcmU+U29ydGVkQmFnIGJhZyA9IFByZWRpY2F0ZWRTb3J0ZWRCYWcuZGVjb3JhdGUobmV3IFRyZWVCYWcoKSwgTm90TnVsbFByZWRpY2F0ZS5JTlNUQU5DRSk7PC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkaWNhdGVkU29ydGVkQmFnCi0gICAgICAgIGV4dGVuZHMgUHJlZGljYXRlZEJhZyBpbXBsZW1lbnRzIFNvcnRlZEJhZyB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzQ0ODU4MTMxNDA4NjQwNjYxNkw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBiYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBiYWcgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHZhbGlkYXRpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHByZWRpY2F0ZWQgU29ydGVkQmFnCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJhZyBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRCYWcgZGVjb3JhdGUoU29ydGVkQmFnIGJhZywgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRCYWcoYmFnLCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGJhZyBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJhZyBvciBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBiYWcgY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHByb3RlY3RlZCBQcmVkaWNhdGVkU29ydGVkQmFnKFNvcnRlZEJhZyBiYWcsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgc3VwZXIoYmFnLCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlY29yYXRlZCBzb3J0ZWQgYmFnLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBiYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkQmFnIGdldFNvcnRlZEJhZygpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRCYWcpIGdldENvbGxlY3Rpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRCYWcoKS5maXJzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJhZygpLmxhc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkQmFnKCkuY29tcGFyYXRvcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRCYWcuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvU3luY2hyb25pemVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkNzVkNDQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZzsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlN5bmNocm9uaXplZENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5TeW5jaHJvbml6ZWRTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QmFnPC9jb2RlPiB0byBzeW5jaHJvbml6ZSBpdHMgYmVoYXZpb3VyCi0gKiBmb3IgYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgc3luY2hyb25pemVkLCB0aGVuIGZvcndhcmRlZCB0byB0aGUgZGVjb3JhdGVkIGJhZy4KLSAqIEl0ZXJhdG9ycyBtdXN0IGJlIHNlcGFyYXRlbHkgc3luY2hyb25pemVkIGFyb3VuZCB0aGUgbG9vcC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQmFnCi0gICAgICAgIGV4dGVuZHMgU3luY2hyb25pemVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEJhZyB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODA4NDY3NDU3MDc1MzgzNzEwOUw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBzeW5jaHJvbml6ZWQgYmFnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHN5bmNocm9uaXplZCBCYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmFnIGRlY29yYXRlKEJhZyBiYWcpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRCYWcoYmFnKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTeW5jaHJvbml6ZWRCYWcoQmFnIGJhZykgewotICAgICAgICBzdXBlcihiYWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbG9jayAgdGhlIGxvY2sgdG8gdXNlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3luY2hyb25pemVkQmFnKEJhZyBiYWcsIE9iamVjdCBsb2NrKSB7Ci0gICAgICAgIHN1cGVyKGJhZywgbG9jayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYmFnIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYmFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJhZyBnZXRCYWcoKSB7Ci0gICAgICAgIHJldHVybiAoQmFnKSBjb2xsZWN0aW9uOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QsIGludCBjb3VudCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCYWcoKS5hZGQob2JqZWN0LCBjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGdldEJhZygpLnJlbW92ZShvYmplY3QsIGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgdW5pcXVlU2V0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIFNldCBzZXQgPSBnZXRCYWcoKS51bmlxdWVTZXQoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY2hyb25pemVkQmFnU2V0KHNldCwgbG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmFnKCkuZ2V0Q291bnQob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU3luY2hyb25pemVkIFNldCBmb3IgdGhlIEJhZyBjbGFzcy4KLSAgICAgKi8KLSAgICBjbGFzcyBTeW5jaHJvbml6ZWRCYWdTZXQgZXh0ZW5kcyBTeW5jaHJvbml6ZWRTZXQgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUKLSAgICAgICAgICogQHBhcmFtIGxvY2sgIHRoZSBsb2NrIHRvIHVzZSwgc2hhcmVkIHdpdGggdGhlIGJhZwotICAgICAgICAgKi8KLSAgICAgICAgU3luY2hyb25pemVkQmFnU2V0KFNldCBzZXQsIE9iamVjdCBsb2NrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXQsIGxvY2spOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1N5bmNocm9uaXplZFNvcnRlZEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9TeW5jaHJvbml6ZWRTb3J0ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQwMDc3Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1N5bmNocm9uaXplZFNvcnRlZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Tb3J0ZWRCYWc7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkQmFnPC9jb2RlPiB0byBzeW5jaHJvbml6ZSBpdHMgYmVoYXZpb3VyCi0gKiBmb3IgYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgc3luY2hyb25pemVkLCB0aGVuIGZvcndhcmRlZCB0byB0aGUgZGVjb3JhdGVkIGJhZy4KLSAqIEl0ZXJhdG9ycyBtdXN0IGJlIHNlcGFyYXRlbHkgc3luY2hyb25pemVkIGFyb3VuZCB0aGUgbG9vcC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU29ydGVkQmFnCi0gICAgICAgIGV4dGVuZHMgU3luY2hyb25pemVkQmFnIGltcGxlbWVudHMgU29ydGVkQmFnIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjIzNzQwNTY3MTg0OTc4NThMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgc3luY2hyb25pemVkIHNvcnRlZCBiYWcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgc3luY2hyb25pemVkIFNvcnRlZEJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJhZyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRCYWcgZGVjb3JhdGUoU29ydGVkQmFnIGJhZykgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZFNvcnRlZEJhZyhiYWcpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJhZyBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNocm9uaXplZFNvcnRlZEJhZyhTb3J0ZWRCYWcgYmFnKSB7Ci0gICAgICAgIHN1cGVyKGJhZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBsb2NrICB0aGUgbG9jayB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTeW5jaHJvbml6ZWRTb3J0ZWRCYWcoQmFnIGJhZywgT2JqZWN0IGxvY2spIHsKLSAgICAgICAgc3VwZXIoYmFnLCBsb2NrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBiYWcgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBiYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkQmFnIGdldFNvcnRlZEJhZygpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRCYWcpIGNvbGxlY3Rpb247Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBmaXJzdCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U29ydGVkQmFnKCkuZmlyc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGxhc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJhZygpLmxhc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRCYWcoKS5jb21wYXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRCYWcuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjcwYzlkOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1RyYW5zZm9ybWVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVHJhbnNmb3JtZWRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVHJhbnNmb3JtZWRTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QmFnPC9jb2RlPiB0byB0cmFuc2Zvcm0gb2JqZWN0cyB0aGF0IGFyZSBhZGRlZC4KLSAqIDxwPgotICogVGhlIGFkZCBtZXRob2RzIGFyZSBhZmZlY3RlZCBieSB0aGlzIGNsYXNzLgotICogVGh1cyBvYmplY3RzIG11c3QgYmUgcmVtb3ZlZCBvciBzZWFyY2hlZCBmb3IgdXNpbmcgdGhlaXIgdHJhbnNmb3JtZWQgZm9ybS4KLSAqIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gY29udmVydHMgU3RyaW5ncyB0byBJbnRlZ2VycywgeW91IG11c3QKLSAqIHVzZSB0aGUgSW50ZWdlciBmb3JtIHRvIHJlbW92ZSBvYmplY3RzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1lZEJhZwotICAgICAgICBleHRlbmRzIFRyYW5zZm9ybWVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEJhZyB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTQyMTE3MDkxMTI5OTA3NDE4NUw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0cmFuc2Zvcm1pbmcgYmFnLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgYmFnIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZWQgQmFnCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJhZyBkZWNvcmF0ZShCYWcgYmFnLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkQmFnKGJhZywgdHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBiYWcgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciBjb252ZXJzaW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNmb3JtZWRCYWcoQmFnIGJhZywgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgc3VwZXIoYmFnLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVjb3JhdGVkIGJhZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYmFnCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJhZyBnZXRCYWcoKSB7Ci0gICAgICAgIHJldHVybiAoQmFnKSBjb2xsZWN0aW9uOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldEJhZygpLmdldENvdW50KG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBuQ29waWVzKSB7Ci0gICAgICAgIHJldHVybiBnZXRCYWcoKS5yZW1vdmUob2JqZWN0LCBuQ29waWVzKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QsIGludCBuQ29waWVzKSB7Ci0gICAgICAgIG9iamVjdCA9IHRyYW5zZm9ybShvYmplY3QpOwotICAgICAgICByZXR1cm4gZ2V0QmFnKCkuYWRkKG9iamVjdCwgbkNvcGllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCB1bmlxdWVTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBnZXRCYWcoKS51bmlxdWVTZXQoKTsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVkU2V0LmRlY29yYXRlKHNldCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmFuc2Zvcm1lZFNvcnRlZEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmFuc2Zvcm1lZFNvcnRlZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzc2ZWJhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHJhbnNmb3JtZWRTb3J0ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRCYWc8L2NvZGU+IHRvIHRyYW5zZm9ybSBvYmplY3RzIHRoYXQgYXJlIGFkZGVkLgotICogPHA+Ci0gKiBUaGUgYWRkIG1ldGhvZHMgYXJlIGFmZmVjdGVkIGJ5IHRoaXMgY2xhc3MuCi0gKiBUaHVzIG9iamVjdHMgbXVzdCBiZSByZW1vdmVkIG9yIHNlYXJjaGVkIGZvciB1c2luZyB0aGVpciB0cmFuc2Zvcm1lZCBmb3JtLgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb252ZXJ0cyBTdHJpbmdzIHRvIEludGVnZXJzLCB5b3UgbXVzdAotICogdXNlIHRoZSBJbnRlZ2VyIGZvcm0gdG8gcmVtb3ZlIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkU29ydGVkQmFnCi0gICAgICAgIGV4dGVuZHMgVHJhbnNmb3JtZWRCYWcgaW1wbGVtZW50cyBTb3J0ZWRCYWcgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTE3Mzc3NDI2NDk0MDE5MzBMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHJhbnNmb3JtaW5nIHNvcnRlZCBiYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBiYWcgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciBjb252ZXJzaW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lZCBTb3J0ZWRCYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkQmFnIGRlY29yYXRlKFNvcnRlZEJhZyBiYWcsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRCYWcoYmFnLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGJhZyBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIGNvbnZlcnNpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2Zvcm1lZFNvcnRlZEJhZyhTb3J0ZWRCYWcgYmFnLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcihiYWcsIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWNvcmF0ZWQgYmFnLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBiYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkQmFnIGdldFNvcnRlZEJhZygpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRCYWcpIGNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRCYWcoKS5maXJzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJhZygpLmxhc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkQmFnKCkuY29tcGFyYXRvcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UcmVlQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1RyZWVCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNkODRjZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1RyZWVCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlNvcnRlZEJhZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIDxjb2RlPlNvcnRlZEJhZzwvY29kZT4sIHVzaW5nIGEgPGNvZGU+VHJlZU1hcDwvY29kZT4gdG8gcHJvdmlkZQotICogdGhlIGRhdGEgc3RvcmFnZS4gVGhpcyBpcyB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgYSBzb3J0ZWQgYmFnLgotICogPHA+Ci0gKiBPcmRlciB3aWxsIGJlIG1haW50YWluZWQgYW1vbmcgdGhlIGJhZyBtZW1iZXJzIGFuZCBjYW4gYmUgdmlld2VkIHRocm91Z2ggdGhlCi0gKiBpdGVyYXRvci4KLSAqIDxwPgotICogQSA8Y29kZT5CYWc8L2NvZGU+IHN0b3JlcyBlYWNoIG9iamVjdCBpbiB0aGUgY29sbGVjdGlvbiB0b2dldGhlciB3aXRoIGEKLSAqIGNvdW50IG9mIG9jY3VycmVuY2VzLiBFeHRyYSBtZXRob2RzIG9uIHRoZSBpbnRlcmZhY2UgYWxsb3cgbXVsdGlwbGUgY29waWVzCi0gKiBvZiBhbiBvYmplY3QgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZCBhdCBvbmNlLiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVhZCB0aGUKLSAqIGludGVyZmFjZSBqYXZhZG9jIGNhcmVmdWxseSBhcyBzZXZlcmFsIG1ldGhvZHMgdmlvbGF0ZSB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMCAocHJldmlvdXNseSBpbiBtYWluIHBhY2thZ2UgdjIuMCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIENodWNrIEJ1cmRpY2sKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQmFnCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXBCYWcgaW1wbGVtZW50cyBTb3J0ZWRCYWcsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gbG9jayAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NzQwMTQ2NTExMDkxNjA2Njc2TDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDxjb2RlPlRyZWVCYWc8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBUcmVlQmFnKCkgewotICAgICAgICBzdXBlcihuZXcgVHJlZU1hcCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGJhZyB0aGF0IG1haW50YWlucyBvcmRlciBvbiBpdHMgdW5pcXVlCi0gICAgICogcmVwcmVzZW50YXRpdmUgbWVtYmVycyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBDb21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFRyZWVCYWcoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBUcmVlTWFwKGNvbXBhcmF0b3IpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+VHJlZUJhZzwvY29kZT4gY29udGFpbmluZyBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIGNvcHkgaW50byB0aGUgYmFnCi0gICAgICovCi0gICAgcHVibGljIFRyZWVCYWcoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgYWRkQWxsKGNvbGwpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotICAgICAgICByZXR1cm4gKChTb3J0ZWRNYXApIGdldE1hcCgpKS5maXJzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdCgpIHsKLSAgICAgICAgcmV0dXJuICgoU29ydGVkTWFwKSBnZXRNYXAoKSkubGFzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiAoKFNvcnRlZE1hcCkgZ2V0TWFwKCkpLmNvbXBhcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGJhZyBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QoY29tcGFyYXRvcigpKTsKLSAgICAgICAgc3VwZXIuZG9Xcml0ZU9iamVjdChvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGJhZyBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBDb21wYXJhdG9yIGNvbXAgPSAoQ29tcGFyYXRvcikgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICBzdXBlci5kb1JlYWRPYmplY3QobmV3IFRyZWVNYXAoY29tcCksIGluKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1R5cGVkQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1R5cGVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2MWUyMjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UeXBlZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJhZzwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBlbGVtZW50cyBhZGRlZAotICogYXJlIG9mIGEgc3BlY2lmaWMgdHlwZS4KLSAqIDxwPgotICogVGhlIHZhbGlkYXRpb24gb2YgYWRkaXRpb25zIGlzIHBlcmZvcm1lZCB2aWEgYW4gaW5zdGFuY2VvZiB0ZXN0IGFnYWluc3QgCi0gKiBhIHNwZWNpZmllZCA8Y29kZT5DbGFzczwvY29kZT4uIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlCi0gKiBjb2xsZWN0aW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZEJhZyB7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0eXBlZCBiYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBiYWcgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIHRvIGFsbG93IGludG8gdGhlIGJhZywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZWQgQmFnCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIG9yIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBiYWcgY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmFnIGRlY29yYXRlKEJhZyBiYWcsIENsYXNzIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkQmFnKGJhZywgSW5zdGFuY2VvZlByZWRpY2F0ZS5nZXRJbnN0YW5jZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RpdmUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFR5cGVkQmFnKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UeXBlZFNvcnRlZEJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9UeXBlZFNvcnRlZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjI0Njc0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVHlwZWRTb3J0ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlNvcnRlZEJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW5zdGFuY2VvZlByZWRpY2F0ZTsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRCYWc8L2NvZGU+IHRvIHZhbGlkYXRlIHRoYXQgZWxlbWVudHMgYWRkZWQKLSAqIGFyZSBvZiBhIHNwZWNpZmljIHR5cGUuCi0gKiA8cD4KLSAqIFRoZSB2YWxpZGF0aW9uIG9mIGFkZGl0aW9ucyBpcyBwZXJmb3JtZWQgdmlhIGFuIGluc3RhbmNlb2YgdGVzdCBhZ2FpbnN0IAotICogYSBzcGVjaWZpZWQgPGNvZGU+Q2xhc3M8L2NvZGU+LiBJZiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoZQotICogY29sbGVjdGlvbiwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBNYXR0aGV3IEhhd3Rob3JuZQotICovCi1wdWJsaWMgY2xhc3MgVHlwZWRTb3J0ZWRCYWcgewotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHlwZWQgc29ydGVkIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGJhZyBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgaW50byB0aGUgYmFnLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lZCBTb3J0ZWRCYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgb3IgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJhZyBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRCYWcgZGVjb3JhdGUoU29ydGVkQmFnIGJhZywgQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRCYWcoYmFnLCBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGl2ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHlwZWRTb3J0ZWRCYWcoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1VubW9kaWZpYWJsZUJhZy5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9Vbm1vZGlmaWFibGVCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA2OTVkMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1VubW9kaWZpYWJsZUJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJhZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5Vbm1vZGlmaWFibGVTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QmFnPC9jb2RlPiB0byBlbnN1cmUgaXQgY2FuJ3QgYmUgYWx0ZXJlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlQmFnCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RCYWdEZWNvcmF0b3IgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4NzM3OTk5NzUxNTcwOTk2MjRMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBiYWcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGJhZyBwYXNzZWQgaW4gaXMgYWxyZWFkeSB1bm1vZGlmaWFibGUsIGl0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBCYWcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmFnIGRlY29yYXRlKEJhZyBiYWcpIHsKLSAgICAgICAgaWYgKGJhZyBpbnN0YW5jZW9mIFVubW9kaWZpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGJhZzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUJhZyhiYWcpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFnICB0aGUgYmFnIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmFnIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZUJhZyhCYWcgYmFnKSB7Ci0gICAgICAgIHN1cGVyKGJhZyk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBjb2xsZWN0aW9uIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjb2xsZWN0aW9uIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlSXRlcmF0b3IuZGVjb3JhdGUoZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QsIGludCBjb3VudCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgdW5pcXVlU2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gZ2V0QmFnKCkudW5pcXVlU2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVW5tb2RpZmlhYmxlU29ydGVkQmFnLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL1VubW9kaWZpYWJsZVNvcnRlZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYmIxY2VmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iYWcvVW5tb2RpZmlhYmxlU29ydGVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iYWc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmFnOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRCYWc8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVTb3J0ZWRCYWcKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNvcnRlZEJhZ0RlY29yYXRvciBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzE5MDQzNzI1MjY2NTcxNzg0MUw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gdW5tb2RpZmlhYmxlIGJhZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYmFnIHBhc3NlZCBpbiBpcyBhbHJlYWR5IHVubW9kaWZpYWJsZSwgaXQgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhZyAgdGhlIGJhZyB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIFNvcnRlZEJhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJhZyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRCYWcgZGVjb3JhdGUoU29ydGVkQmFnIGJhZykgewotICAgICAgICBpZiAoYmFnIGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmFnOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlU29ydGVkQmFnKGJhZyk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYWcgIHRoZSBiYWcgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlU29ydGVkQmFnKFNvcnRlZEJhZyBiYWcpIHsKLSAgICAgICAgc3VwZXIoYmFnKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGNvbGxlY3Rpb24gb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGNvbGxlY3Rpb24gaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVJdGVyYXRvci5kZWNvcmF0ZShnZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0LCBpbnQgY291bnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCB1bmlxdWVTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBnZXRCYWcoKS51bmlxdWVTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JhZy9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VjMzdmZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmFnL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0gJElkOiBwYWNrYWdlLmh0bWwsdiAxLjEgMjAwOS8wNS8yNyAyMjoxNjozNCBtcGFya2VyIEV4cCAkIC0tPgotIDwhLS0KLSAgIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPEJPRFk+Ci08cD4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi17QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJhZyBCYWd9IGFuZCAKLXtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmFnIFNvcnRlZEJhZ30gaW50ZXJmYWNlcy4KLUEgYmFnIHN0b3JlcyBhbiBvYmplY3QgYW5kIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvY2N1cmVuY2VzIG9mIHRoZSBvYmplY3QuCi08cD4KLVRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgcGFja2FnZToKLTx1bD4KLTxsaT5IYXNoQmFnIC0gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgSGFzaE1hcCB0byBzdG9yZSB0aGUgZGF0YQotPGxpPlRyZWVCYWcgLSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgYSBUcmVlTWFwIHRvIHN0b3JlIHRoZSBkYXRhCi08L3VsPgotPHA+Ci1UaGUgZm9sbG93aW5nIGRlY29yYXRvcnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPlN5bmNocm9uaXplZCAtIHN5bmNocm9uaXplcyBtZXRob2QgYWNjZXNzIGZvciBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMKLTxsaT5Vbm1vZGlmaWFibGUgLSBlbnN1cmVzIHRoZSBiYWcgY2Fubm90IGJlIGFsdGVyZWQKLTxsaT5QcmVkaWNhdGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nIHRvIGEgcHJlZGljYXRlIGNhbiBiZSBhZGRlZAotPGxpPlR5cGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlIGNhbiBiZSBhZGRlZAotPGxpPlRyYW5zZm9ybWVkIC0gdHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgYWRkZWQgdG8gdGhlIGJhZwotPC91bD4KLTwvcHJlPgotPC9CT0RZPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RCaWRpTWFwRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJkZWRiYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmlkaW1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkFic3RyYWN0TWFwRGVjb3JhdG9yOwotCi0vKiogCi0gKiBQcm92aWRlcyBhIGJhc2UgZGVjb3JhdG9yIHRoYXQgZW5hYmxlcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gYmUgYWRkZWQKLSAqIHRvIGEgQmlkaU1hcCB2aWEgZGVjb3JhdGlvbi4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgZm9yd2FyZGVkIGRpcmVjdGx5IHRvIHRoZSBkZWNvcmF0ZWQgbWFwLgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IHNwZWNpYWwgcHJvY2Vzc2luZyB3aXRoIHRoZSBtYXAgdmlld3MuCi0gKiBJbnN0ZWFkIGl0IHNpbXBseSByZXR1cm5zIHRoZSBzZXQvY29sbGVjdGlvbiBmcm9tIHRoZSB3cmFwcGVkIG1hcC4gVGhpcyBtYXkgYmUKLSAqIHVuZGVzaXJhYmxlLCBmb3IgZXhhbXBsZSBpZiB5b3UgYXJlIHRyeWluZyB0byB3cml0ZSBhIHZhbGlkYXRpbmcgaW1wbGVtZW50YXRpb24KLSAqIGl0IHdvdWxkIHByb3ZpZGUgYSBsb29waG9sZSBhcm91bmQgdGhlIHZhbGlkYXRpb24uCi0gKiBCdXQsIHlvdSBtaWdodCB3YW50IHRoYXQgbG9vcGhvbGUsIHNvIHRoaXMgY2xhc3MgaXMga2VwdCBzaW1wbGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmlkaU1hcERlY29yYXRvcgotICAgICAgICBleHRlbmRzIEFic3RyYWN0TWFwRGVjb3JhdG9yIGltcGxlbWVudHMgQmlkaU1hcCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IoQmlkaU1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlkaU1hcCBnZXRCaWRpTWFwKCkgewotICAgICAgICByZXR1cm4gKEJpZGlNYXApIG1hcDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0QmlkaU1hcCgpLm1hcEl0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaWRpTWFwKCkuZ2V0S2V5KHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZVZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZ2V0QmlkaU1hcCgpLnJlbW92ZVZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpZGlNYXAoKS5pbnZlcnNlQmlkaU1hcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3REdWFsQmlkaU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YWU4MGIzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0RHVhbEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJpZGlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5SZXNldHRhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvcjsKLQotLyoqCi0gKiBBYnN0cmFjdCA8Y29kZT5CaWRpTWFwPC9jb2RlPiBpbXBsZW1lbnRlZCB1c2luZyB0d28gbWFwcy4KLSAqIDxwPgotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGJlIHdyaXR0ZW4gc2ltcGx5IGJ5IGltcGxlbWVudGluZyB0aGUKLSAqIDxjb2RlPmNyZWF0ZU1hcDwvY29kZT4gbWV0aG9kLgotICogCi0gKiBAc2VlIER1YWxIYXNoQmlkaU1hcAotICogQHNlZSBEdWFsVHJlZUJpZGlNYXAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJElkOiBBYnN0cmFjdER1YWxCaWRpTWFwLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMjoxNjozMiBtcGFya2VyIEV4cCAkCi0gKiAKLSAqIEBhdXRob3IgTWF0dGhldyBIYXd0aG9ybmUKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER1YWxCaWRpTWFwIGltcGxlbWVudHMgQmlkaU1hcCB7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxlZ2F0ZSBtYXAgYXJyYXkuICBUaGUgZmlyc3QgbWFwIGNvbnRhaW5zIHN0YW5kYXJkIGVudHJpZXMsIGFuZCB0aGUgCi0gICAgICogc2Vjb25kIGNvbnRhaW5zIGludmVyc2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgZmluYWwgTWFwW10gbWFwcyA9IG5ldyBNYXBbMl07Ci0gICAgLyoqCi0gICAgICogSW52ZXJzZSB2aWV3IG9mIHRoaXMgbWFwLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCA9IG51bGw7Ci0gICAgLyoqCi0gICAgICogVmlldyBvZiB0aGUga2V5cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFNldCBrZXlTZXQgPSBudWxsOwotICAgIC8qKgotICAgICAqIFZpZXcgb2YgdGhlIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IENvbGxlY3Rpb24gdmFsdWVzID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiBWaWV3IG9mIHRoZSBlbnRyaWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU2V0IGVudHJ5U2V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWFwLCBpbml0aWFsaXNlZCBieSA8Y29kZT5jcmVhdGVNYXA8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgcmVtYWlucyBpbiBwbGFjZSBmb3IgZGVzZXJpYWxpemF0aW9uLgotICAgICAqIEFsbCBvdGhlciB1c2FnZSBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZgotICAgICAqIHtAbGluayAjQWJzdHJhY3REdWFsQmlkaU1hcChNYXAsIE1hcCl9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdER1YWxCaWRpTWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtYXBzWzBdID0gY3JlYXRlTWFwKCk7Ci0gICAgICAgIG1hcHNbMV0gPSBjcmVhdGVNYXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IG1hcCB1c2luZyB0aGUgdHdvIG1hcHMgc3BlY2lmaWVkIGFzIHN0b3JhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHR3byBtYXBzIG11c3QgYmUgYSBtYXRjaGluZyBwYWlyLCBub3JtYWwgYW5kIHJldmVyc2UuCi0gICAgICogVGhleSB3aWxsIHR5cGljYWxseSBib3RoIGJlIGVtcHR5LgotICAgICAqIDxwPgotICAgICAqIE5laXRoZXIgbWFwIGlzIHZhbGlkYXRlZCwgc28gbnVsbHMgbWF5IGJlIHBhc3NlZCBpbi4KLSAgICAgKiBJZiB5b3UgY2hvb3NlIHRvIGRvIHRoaXMgdGhlbiB0aGUgc3ViY2xhc3MgY29uc3RydWN0b3IgbXVzdCBwb3B1bGF0ZQotICAgICAqIHRoZSA8Y29kZT5tYXBzW108L2NvZGU+IGluc3RhbmNlIHZhcmlhYmxlIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9ybWFsTWFwICB0aGUgbm9ybWFsIGRpcmVjdGlvbiBtYXAKLSAgICAgKiBAcGFyYW0gcmV2ZXJzZU1hcCAgdGhlIHJldmVyc2UgZGlyZWN0aW9uIG1hcAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdER1YWxCaWRpTWFwKE1hcCBub3JtYWxNYXAsIE1hcCByZXZlcnNlTWFwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1hcHNbMF0gPSBub3JtYWxNYXA7Ci0gICAgICAgIG1hcHNbMV0gPSByZXZlcnNlTWFwOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbWFwIHRoYXQgZGVjb3JhdGVzIHRoZSBzcGVjaWZpZWQgbWFwcywKLSAgICAgKiB1c2VkIGJ5IHRoZSBzdWJjbGFzcyA8Y29kZT5jcmVhdGVCaWRpTWFwPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub3JtYWxNYXAgIHRoZSBub3JtYWwgZGlyZWN0aW9uIG1hcAotICAgICAqIEBwYXJhbSByZXZlcnNlTWFwICB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gbWFwCi0gICAgICogQHBhcmFtIGludmVyc2VCaWRpTWFwICB0aGUgaW52ZXJzZSBCaWRpTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RHVhbEJpZGlNYXAoTWFwIG5vcm1hbE1hcCwgTWFwIHJldmVyc2VNYXAsIEJpZGlNYXAgaW52ZXJzZUJpZGlNYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbWFwc1swXSA9IG5vcm1hbE1hcDsKLSAgICAgICAgbWFwc1sxXSA9IHJldmVyc2VNYXA7Ci0gICAgICAgIHRoaXMuaW52ZXJzZUJpZGlNYXAgPSBpbnZlcnNlQmlkaU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBtYXAgdXNlZCBieSB0aGUgc3ViY2xhc3MgdG8gc3RvcmUgZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGRlc2lnbiBpcyBkZWVwbHkgZmxhd2VkIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgotICAgICAqIEl0IHJlbGllZCBvbiBzdWJjbGFzcyBkYXRhIGJlaW5nIHVzZWQgZHVyaW5nIGEgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXAgdG8gYmUgdXNlZCBmb3IgaW50ZXJuYWwgc3RvcmFnZQotICAgICAqIEBkZXByZWNhdGVkIEZvciBjb25zdHJ1Y3RvcnMsIHVzZSB0aGUgbmV3IHR3byBtYXAgY29uc3RydWN0b3IuCi0gICAgICogRm9yIGRlc2VyaWFsaXphdGlvbiwgcG9wdWxhdGUgdGhlIG1hcHMgYXJyYXkgZGlyZWN0bHkgaW4gcmVhZE9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwIGNyZWF0ZU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3ViY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vcm1hbE1hcCAgdGhlIG5vcm1hbCBkaXJlY3Rpb24gbWFwCi0gICAgICogQHBhcmFtIHJldmVyc2VNYXAgIHRoZSByZXZlcnNlIGRpcmVjdGlvbiBtYXAKLSAgICAgKiBAcGFyYW0gaW52ZXJzZU1hcCAgdGhpcyBtYXAsIHdoaWNoIGlzIHRoZSBpbnZlcnNlIGluIHRoZSBuZXcgbWFwCi0gICAgICogQHJldHVybiB0aGUgaW52ZXJzZSBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQmlkaU1hcCBjcmVhdGVCaWRpTWFwKE1hcCBub3JtYWxNYXAsIE1hcCByZXZlcnNlTWFwLCBCaWRpTWFwIGludmVyc2VNYXApOwotCi0gICAgLy8gTWFwIGRlbGVnYXRpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWFwc1swXS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBzWzBdLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbWFwc1swXS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWFwc1swXS5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBtYXBzWzBdLmVxdWFscyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBzWzBdLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1hcHNbMF0udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBCaWRpTWFwIGNoYW5nZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXBzWzBdLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIG1hcHNbMV0ucmVtb3ZlKG1hcHNbMF0uZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXBzWzFdLmNvbnRhaW5zS2V5KHZhbHVlKSkgewotICAgICAgICAgICAgbWFwc1swXS5yZW1vdmUobWFwc1sxXS5nZXQodmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbWFwc1swXS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIG1hcHNbMV0ucHV0KHZhbHVlLCBrZXkpOwotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKG1hcHNbMF0uY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgdmFsdWUgPSBtYXBzWzBdLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgbWFwc1sxXS5yZW1vdmUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbWFwc1swXS5jbGVhcigpOwotICAgICAgICBtYXBzWzFdLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1hcHNbMV0uY29udGFpbnNLZXkodmFsdWUpOwotICAgIH0KLQotICAgIC8vIEJpZGlNYXAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogT2J0YWlucyBhIDxjb2RlPk1hcEl0ZXJhdG9yPC9jb2RlPiBvdmVyIHRoZSBtYXAuCi0gICAgICogVGhlIGl0ZXJhdG9yIGltcGxlbWVudHMgPGNvZGU+UmVzZXRhYmxlTWFwSXRlcmF0b3I8L2NvZGU+LgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSBlbnRyeVNldCBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2V0VmFsdWUoKSBtZXRob2RzIG9ubHkgYWxsb3cgYSBuZXcgdmFsdWUgdG8gYmUgc2V0LgotICAgICAqIElmIHRoZSB2YWx1ZSBiZWluZyBzZXQgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiBpcyB0aHJvd24gKGFzIHNldFZhbHVlIGNhbm5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG1hcCkuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWRpTWFwSXRlcmF0b3IodGhpcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWFwc1sxXS5nZXQodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBudWxsOwotICAgICAgICBpZiAobWFwc1sxXS5jb250YWluc0tleSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGtleSA9IG1hcHNbMV0ucmVtb3ZlKHZhbHVlKTsKLSAgICAgICAgICAgIG1hcHNbMF0ucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCgpIHsKLSAgICAgICAgaWYgKGludmVyc2VCaWRpTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGludmVyc2VCaWRpTWFwID0gY3JlYXRlQmlkaU1hcChtYXBzWzFdLCBtYXBzWzBdLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52ZXJzZUJpZGlNYXA7Ci0gICAgfQotICAgIAotICAgIC8vIE1hcCB2aWV3cwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEga2V5U2V0IHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgb24gdGhlIHZpZXcgYXJlIHJlZmxlY3RlZCBpbiB0aGUgbWFwLgotICAgICAqIFRoZSBzZXQgc3VwcG9ydHMgcmVtb3ZlIGFuZCBjbGVhciBidXQgbm90IGFkZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXlTZXQgdmlldwotICAgICAqLwotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBpZiAoa2V5U2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGtleVNldCA9IG5ldyBLZXlTZXQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEga2V5IHNldCBpdGVyYXRvci4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHJldHVybiBpdGVyYXRvcnMgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAqIEByZXR1cm4gdGhlIGtleVNldCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVLZXlTZXRJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICByZXR1cm4gbmV3IEtleVNldEl0ZXJhdG9yKGl0ZXJhdG9yLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmFsdWVzIHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgb24gdGhlIHZpZXcgYXJlIHJlZmxlY3RlZCBpbiB0aGUgbWFwLgotICAgICAqIFRoZSBzZXQgc3VwcG9ydHMgcmVtb3ZlIGFuZCBjbGVhciBidXQgbm90IGFkZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgdmlldwotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSBuZXcgVmFsdWVzKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHZhbHVlcyBpdGVyYXRvci4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHJldHVybiBpdGVyYXRvcnMgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVWYWx1ZXNJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICByZXR1cm4gbmV3IFZhbHVlc0l0ZXJhdG9yKGl0ZXJhdG9yLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGVudHJ5U2V0IHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgb24gdGhlIHNldCBhcmUgcmVmbGVjdGVkIGluIHRoZSBtYXAuCi0gICAgICogVGhlIHNldCBzdXBwb3J0cyByZW1vdmUgYW5kIGNsZWFyIGJ1dCBub3QgYWRkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBNYXAgRW50cnkgc2V0VmFsdWUoKSBtZXRob2Qgb25seSBhbGxvdyBhIG5ldyB2YWx1ZSB0byBiZSBzZXQuCi0gICAgICogSWYgdGhlIHZhbHVlIGJlaW5nIHNldCBpcyBhbHJlYWR5IGluIHRoZSBtYXAsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqIGlzIHRocm93biAoYXMgc2V0VmFsdWUgY2Fubm90IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbWFwKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeVNldCB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgaWYgKGVudHJ5U2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeVNldDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbnRyeSBzZXQgaXRlcmF0b3IuCi0gICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gaXRlcmF0b3JzIHdpdGggZGlmZmVyZW50IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeVNldCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVFbnRyeVNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRJdGVyYXRvcihpdGVyYXRvciwgdGhpcyk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIFZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBWaWV3IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3REdWFsQmlkaU1hcCBwYXJlbnQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyB2aWV3IG9mIHRoZSBCaWRpTWFwLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHZpZXcgYmVpbmcgZGVjb3JhdGVkCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgQmlkaU1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIFZpZXcoQ29sbGVjdGlvbiBjb2xsLCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoY29sbCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQuaXNFbXB0eSgpIHx8IGNvbGwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbnRhaW5zKGl0Lm5leHQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb2xsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHBhcmVudC5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbnRhaW5zKGl0Lm5leHQoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgcGFyZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIEtleVNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEtleVNldCBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBTZXQgewotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgdmlldyBvZiB0aGUgQmlkaU1hcC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgQmlkaU1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIEtleVNldChBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50Lm1hcHNbMF0ua2V5U2V0KCksIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNyZWF0ZUtleVNldEl0ZXJhdG9yKHN1cGVyLml0ZXJhdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50Lm1hcHNbMF0uY29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50Lm1hcHNbMF0uY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmVudC5tYXBzWzBdLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIHBhcmVudC5tYXBzWzFdLnJlbW92ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgS2V5U2V0SXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBLZXlTZXRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3IgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudDsKLSAgICAgICAgLyoqIFRoZSBsYXN0IHJldHVybmVkIGtleSAqLwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGxhc3RLZXkgPSBudWxsOwotICAgICAgICAvKiogV2hldGhlciByZW1vdmUgaXMgYWxsb3dlZCBhdCBwcmVzZW50ICovCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIEtleVNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoaXRlcmF0b3IpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGxhc3RLZXkgPSBzdXBlci5uZXh0KCk7Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGxhc3RLZXk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciByZW1vdmUoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBhZnRlciBuZXh0KCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmVudC5tYXBzWzBdLmdldChsYXN0S2V5KTsKLSAgICAgICAgICAgIHN1cGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgcGFyZW50Lm1hcHNbMV0ucmVtb3ZlKHZhbHVlKTsKLSAgICAgICAgICAgIGxhc3RLZXkgPSBudWxsOwotICAgICAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgVmFsdWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmFsdWVzIGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFNldCB7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyB2aWV3IG9mIHRoZSBCaWRpTWFwLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBCaWRpTWFwCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgVmFsdWVzKEFic3RyYWN0RHVhbEJpZGlNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQubWFwc1swXS52YWx1ZXMoKSwgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlVmFsdWVzSXRlcmF0b3Ioc3VwZXIuaXRlcmF0b3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5tYXBzWzFdLmNvbnRhaW5zS2V5KHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQubWFwc1sxXS5jb250YWluc0tleSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gcGFyZW50Lm1hcHNbMV0ucmVtb3ZlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQubWFwc1swXS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBWYWx1ZXNJdGVyYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFZhbHVlc0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhcmVudCBtYXAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0RHVhbEJpZGlNYXAgcGFyZW50OwotICAgICAgICAvKiogVGhlIGxhc3QgcmV0dXJuZWQgdmFsdWUgKi8KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBsYXN0VmFsdWUgPSBudWxsOwotICAgICAgICAvKiogV2hldGhlciByZW1vdmUgaXMgYWxsb3dlZCBhdCBwcmVzZW50ICovCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIFZhbHVlc0l0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoaXRlcmF0b3IpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGxhc3RWYWx1ZSA9IHN1cGVyLm5leHQoKTsKLSAgICAgICAgICAgIGNhblJlbW92ZSA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAoY2FuUmVtb3ZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgcmVtb3ZlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgbmV4dCgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTsgLy8gcmVtb3ZlcyBmcm9tIG1hcHNbMF0KLSAgICAgICAgICAgIHBhcmVudC5tYXBzWzFdLnJlbW92ZShsYXN0VmFsdWUpOwotICAgICAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIEVudHJ5U2V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgU2V0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXcgb2YgdGhlIEJpZGlNYXAuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IEJpZGlNYXAKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBFbnRyeVNldChBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50Lm1hcHNbMF0uZW50cnlTZXQoKSwgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlRW50cnlTZXRJdGVyYXRvcihzdXBlci5pdGVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvYmo7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJlbnQubWFwc1swXS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCA/IGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCA6IHZhbHVlLmVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnQubWFwc1swXS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50Lm1hcHNbMV0ucmVtb3ZlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIEVudHJ5U2V0SXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBFbnRyeVNldEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhcmVudCBtYXAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0RHVhbEJpZGlNYXAgcGFyZW50OwotICAgICAgICAvKiogVGhlIGxhc3QgcmV0dXJuZWQgZW50cnkgKi8KLSAgICAgICAgcHJvdGVjdGVkIE1hcC5FbnRyeSBsYXN0ID0gbnVsbDsKLSAgICAgICAgLyoqIFdoZXRoZXIgcmVtb3ZlIGlzIGFsbG93ZWQgYXQgcHJlc2VudCAqLwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBtYXAKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBFbnRyeVNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoaXRlcmF0b3IpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGxhc3QgPSBuZXcgTWFwRW50cnkoKE1hcC5FbnRyeSkgc3VwZXIubmV4dCgpLCBwYXJlbnQpOwotICAgICAgICAgICAgY2FuUmVtb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAoY2FuUmVtb3ZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgcmVtb3ZlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgbmV4dCgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdG9yZSB2YWx1ZSBhcyByZW1vdmUgbWF5IGNoYW5nZSB0aGUgZW50cnkgaW4gdGhlIGRlY29yYXRvciAoZWcuVHJlZU1hcCkKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGxhc3QuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHN1cGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgcGFyZW50Lm1hcHNbMV0ucmVtb3ZlKHZhbHVlKTsKLSAgICAgICAgICAgIGxhc3QgPSBudWxsOwotICAgICAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBNYXBFbnRyeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1hcEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvciB7Ci0KLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0RHVhbEJpZGlNYXAgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBkZWNvcmF0ZQotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIE1hcEVudHJ5KE1hcC5FbnRyeSBlbnRyeSwgQWJzdHJhY3REdWFsQmlkaU1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKGVudHJ5KTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IE1hcEVudHJ5LnRoaXMuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50Lm1hcHNbMV0uY29udGFpbnNLZXkodmFsdWUpICYmCi0gICAgICAgICAgICAgICAgcGFyZW50Lm1hcHNbMV0uZ2V0KHZhbHVlKSAhPSBrZXkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdXNlIHNldFZhbHVlKCkgd2hlbiB0aGUgb2JqZWN0IGJlaW5nIHNldCBpcyBhbHJlYWR5IGluIHRoZSBtYXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2xkVmFsdWUgPSBzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgTWFwSXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCaWRpTWFwSXRlcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciwgUmVzZXR0YWJsZUl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3REdWFsQmlkaU1hcCBwYXJlbnQ7Ci0gICAgICAgIC8qKiBUaGUgaXRlcmF0b3IgYmVpbmcgd3JhcHBlZCAqLwotICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgICAgIC8qKiBUaGUgbGFzdCByZXR1cm5lZCBlbnRyeSAqLwotICAgICAgICBwcm90ZWN0ZWQgTWFwLkVudHJ5IGxhc3QgPSBudWxsOwotICAgICAgICAvKiogV2hldGhlciByZW1vdmUgaXMgYWxsb3dlZCBhdCBwcmVzZW50ICovCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIEJpZGlNYXBJdGVyYXRvcihBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IHBhcmVudC5tYXBzWzBdLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGxhc3QgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGxhc3QuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciByZW1vdmUoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBhZnRlciBuZXh0KCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHN0b3JlIHZhbHVlIGFzIHJlbW92ZSBtYXkgY2hhbmdlIHRoZSBlbnRyeSBpbiB0aGUgZGVjb3JhdG9yIChlZy5UcmVlTWFwKQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbGFzdC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICBwYXJlbnQubWFwc1sxXS5yZW1vdmUodmFsdWUpOwotICAgICAgICAgICAgbGFzdCA9IG51bGw7Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgZ2V0S2V5KCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGFzdC5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgZ2V0VmFsdWUoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsYXN0LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3Igc2V0VmFsdWUoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQubWFwc1sxXS5jb250YWluc0tleSh2YWx1ZSkgJiYKLSAgICAgICAgICAgICAgICBwYXJlbnQubWFwc1sxXS5nZXQodmFsdWUpICE9IGxhc3QuZ2V0S2V5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdXNlIHNldFZhbHVlKCkgd2hlbiB0aGUgb2JqZWN0IGJlaW5nIHNldCBpcyBhbHJlYWR5IGluIHRoZSBtYXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQucHV0KGxhc3QuZ2V0S2V5KCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IHBhcmVudC5tYXBzWzBdLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGxhc3QgPSBudWxsOwotICAgICAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJNYXBJdGVyYXRvclsiICsgZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpICsgIl0iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1hcEl0ZXJhdG9yW10iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RPcmRlcmVkQmlkaU1hcERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RPcmRlcmVkQmlkaU1hcERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZThiMDhmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL0Fic3RyYWN0T3JkZXJlZEJpZGlNYXBEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmlkaW1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkQmlkaU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZE1hcEl0ZXJhdG9yOwotCi0vKiogCi0gKiBQcm92aWRlcyBhIGJhc2UgZGVjb3JhdG9yIHRoYXQgZW5hYmxlcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gYmUgYWRkZWQKLSAqIHRvIGFuIE9yZGVyZWRCaWRpTWFwIHZpYSBkZWNvcmF0aW9uLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBtYXAuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nIHdpdGggdGhlIG1hcCB2aWV3cy4KLSAqIEluc3RlYWQgaXQgc2ltcGx5IHJldHVybnMgdGhlIGludmVyc2UgZnJvbSB0aGUgd3JhcHBlZCBtYXAuIFRoaXMgbWF5IGJlCi0gKiB1bmRlc2lyYWJsZSwgZm9yIGV4YW1wbGUgaWYgeW91IGFyZSB0cnlpbmcgdG8gd3JpdGUgYSB2YWxpZGF0aW5nIGltcGxlbWVudGF0aW9uCi0gKiBpdCB3b3VsZCBwcm92aWRlIGEgbG9vcGhvbGUgYXJvdW5kIHRoZSB2YWxpZGF0aW9uLgotICogQnV0LCB5b3UgbWlnaHQgd2FudCB0aGF0IGxvb3Bob2xlLCBzbyB0aGlzIGNsYXNzIGlzIGtlcHQgc2ltcGxlLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9yZGVyZWRCaWRpTWFwRGVjb3JhdG9yCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RCaWRpTWFwRGVjb3JhdG9yIGltcGxlbWVudHMgT3JkZXJlZEJpZGlNYXAgewotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RPcmRlcmVkQmlkaU1hcERlY29yYXRvcihPcmRlcmVkQmlkaU1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3JkZXJlZEJpZGlNYXAgZ2V0T3JkZXJlZEJpZGlNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoT3JkZXJlZEJpZGlNYXApIG1hcDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPcmRlcmVkQmlkaU1hcCgpLm9yZGVyZWRNYXBJdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZmlyc3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPcmRlcmVkQmlkaU1hcCgpLmZpcnN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBsYXN0S2V5KCkgewotICAgICAgICByZXR1cm4gZ2V0T3JkZXJlZEJpZGlNYXAoKS5sYXN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldE9yZGVyZWRCaWRpTWFwKCkubmV4dEtleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gZ2V0T3JkZXJlZEJpZGlNYXAoKS5wcmV2aW91c0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcmRlcmVkQmlkaU1hcCBpbnZlcnNlT3JkZXJlZEJpZGlNYXAoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPcmRlcmVkQmlkaU1hcCgpLmludmVyc2VPcmRlcmVkQmlkaU1hcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvQWJzdHJhY3RTb3J0ZWRCaWRpTWFwRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdFNvcnRlZEJpZGlNYXBEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNjZDFmMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9BYnN0cmFjdFNvcnRlZEJpZGlNYXBEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmlkaW1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmlkaU1hcDsKLQotLyoqIAotICogUHJvdmlkZXMgYSBiYXNlIGRlY29yYXRvciB0aGF0IGVuYWJsZXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGJlIGFkZGVkCi0gKiB0byBhIFNvcnRlZEJpZGlNYXAgdmlhIGRlY29yYXRpb24uCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIGZvcndhcmRlZCBkaXJlY3RseSB0byB0aGUgZGVjb3JhdGVkIG1hcC4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSBzcGVjaWFsIHByb2Nlc3Npbmcgd2l0aCB0aGUgbWFwIHZpZXdzLgotICogSW5zdGVhZCBpdCBzaW1wbHkgcmV0dXJucyB0aGUgaW52ZXJzZSBmcm9tIHRoZSB3cmFwcGVkIG1hcC4gVGhpcyBtYXkgYmUKLSAqIHVuZGVzaXJhYmxlLCBmb3IgZXhhbXBsZSBpZiB5b3UgYXJlIHRyeWluZyB0byB3cml0ZSBhIHZhbGlkYXRpbmcgaW1wbGVtZW50YXRpb24KLSAqIGl0IHdvdWxkIHByb3ZpZGUgYSBsb29waG9sZSBhcm91bmQgdGhlIHZhbGlkYXRpb24uCi0gKiBCdXQsIHlvdSBtaWdodCB3YW50IHRoYXQgbG9vcGhvbGUsIHNvIHRoaXMgY2xhc3MgaXMga2VwdCBzaW1wbGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U29ydGVkQmlkaU1hcERlY29yYXRvcgotICAgICAgICBleHRlbmRzIEFic3RyYWN0T3JkZXJlZEJpZGlNYXBEZWNvcmF0b3IgaW1wbGVtZW50cyBTb3J0ZWRCaWRpTWFwIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0U29ydGVkQmlkaU1hcERlY29yYXRvcihTb3J0ZWRCaWRpTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIG1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRCaWRpTWFwIGdldFNvcnRlZEJpZGlNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoU29ydGVkQmlkaU1hcCkgbWFwOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgU29ydGVkQmlkaU1hcCBpbnZlcnNlU29ydGVkQmlkaU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJpZGlNYXAoKS5pbnZlcnNlU29ydGVkQmlkaU1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRCaWRpTWFwKCkuY29tcGFyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgc3ViTWFwKE9iamVjdCBmcm9tS2V5LCBPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJpZGlNYXAoKS5zdWJNYXAoZnJvbUtleSwgdG9LZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgaGVhZE1hcChPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJpZGlNYXAoKS5oZWFkTWFwKHRvS2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHRhaWxNYXAoT2JqZWN0IGZyb21LZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZEJpZGlNYXAoKS50YWlsTWFwKGZyb21LZXkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbEhhc2hCaWRpTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsSGFzaEJpZGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjY0ZWJhMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsSGFzaEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CaWRpTWFwOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkJpZGlNYXA8L2NvZGU+IHRoYXQgdXNlcyB0d28gPGNvZGU+SGFzaE1hcDwvY29kZT4gaW5zdGFuY2VzLgotICogPHA+Ci0gKiBUd28gPGNvZGU+SGFzaE1hcDwvY29kZT4gaW5zdGFuY2VzIGFyZSB1c2VkIGluIHRoaXMgY2xhc3MuCi0gKiBUaGlzIHByb3ZpZGVzIGZhc3QgbG9va3VwcyBhdCB0aGUgZXhwZW5zZSBvZiBzdG9yaW5nIHR3byBzZXRzIG9mIG1hcCBlbnRyaWVzLgotICogQ29tbW9ucyBDb2xsZWN0aW9ucyB3b3VsZCB3ZWxjb21lIHRoZSBhZGRpdGlvbiBvZiBhIGRpcmVjdCBoYXNoLWJhc2VkCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+QmlkaU1hcDwvY29kZT4gaW50ZXJmYWNlLgotICogPHA+Ci0gKiBOT1RFOiBGcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLCBhbGwgc3ViY2xhc3NlcyB3aWxsIHVzZSA8Y29kZT5IYXNoTWFwPC9jb2RlPgotICogYW5kIHRoZSBmbGF3ZWQgPGNvZGU+Y3JlYXRlTWFwPC9jb2RlPiBtZXRob2QgaXMgaWdub3JlZC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkSWQ6IER1YWxIYXNoQmlkaU1hcC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzIgbXBhcmtlciBFeHAgJAotICogCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRHVhbEhhc2hCaWRpTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3REdWFsQmlkaU1hcCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogRW5zdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyMTk2OTMyODM2MTgwOEw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkhhc2hCaWRpTWFwPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRHVhbEhhc2hCaWRpTWFwKCkgewotICAgICAgICBzdXBlcihuZXcgSGFzaE1hcCgpLCBuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkhhc2hCaWRpTWFwPC9jb2RlPiBhbmQgY29waWVzIHRoZSBtYXBwaW5ncyBmcm9tCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPk1hcDwvY29kZT4uICAKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgd2hvc2UgbWFwcGluZ3MgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBEdWFsSGFzaEJpZGlNYXAoTWFwIG1hcCkgewotICAgICAgICBzdXBlcihuZXcgSGFzaE1hcCgpLCBuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+SGFzaEJpZGlNYXA8L2NvZGU+IHRoYXQgZGVjb3JhdGVzIHRoZSBzcGVjaWZpZWQgbWFwcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub3JtYWxNYXAgIHRoZSBub3JtYWwgZGlyZWN0aW9uIG1hcAotICAgICAqIEBwYXJhbSByZXZlcnNlTWFwICB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gbWFwCi0gICAgICogQHBhcmFtIGludmVyc2VCaWRpTWFwICB0aGUgaW52ZXJzZSBCaWRpTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIER1YWxIYXNoQmlkaU1hcChNYXAgbm9ybWFsTWFwLCBNYXAgcmV2ZXJzZU1hcCwgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCkgewotICAgICAgICBzdXBlcihub3JtYWxNYXAsIHJldmVyc2VNYXAsIGludmVyc2VCaWRpTWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBub3JtYWxNYXAgIHRoZSBub3JtYWwgZGlyZWN0aW9uIG1hcAotICAgICAqIEBwYXJhbSByZXZlcnNlTWFwICB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gbWFwCi0gICAgICogQHBhcmFtIGludmVyc2VCaWRpTWFwICB0aGUgaW52ZXJzZSBCaWRpTWFwCi0gICAgICogQHJldHVybiBuZXcgYmlkaSBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlkaU1hcCBjcmVhdGVCaWRpTWFwKE1hcCBub3JtYWxNYXAsIE1hcCByZXZlcnNlTWFwLCBCaWRpTWFwIGludmVyc2VCaWRpTWFwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRHVhbEhhc2hCaWRpTWFwKG5vcm1hbE1hcCwgcmV2ZXJzZU1hcCwgaW52ZXJzZUJpZGlNYXApOwotICAgIH0KLQotICAgIC8vIFNlcmlhbGl6YXRpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcHNbMF0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBtYXBzWzBdID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWFwc1sxXSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIHB1dEFsbChtYXApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvRHVhbFRyZWVCaWRpTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsVHJlZUJpZGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTMzZDBjNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9EdWFsVHJlZUJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmlkaU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZEJpZGlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Tb3J0ZWRCaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuQWJzdHJhY3RTb3J0ZWRNYXBEZWNvcmF0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+QmlkaU1hcDwvY29kZT4gdGhhdCB1c2VzIHR3byA8Y29kZT5UcmVlTWFwPC9jb2RlPiBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIFRoZSBzZXRWYWx1ZSgpIG1ldGhvZCBvbiBpdGVyYXRvcnMgd2lsbCBzdWNjZWVkIG9ubHkgaWYgdGhlIG5ldyB2YWx1ZSBiZWluZyBzZXQgaXMKLSAqIG5vdCBhbHJlYWR5IGluIHRoZSBiaWRpbWFwLgotICogPHA+Ci0gKiBXaGVuIGNvbnNpZGVyaW5nIHdoZXRoZXIgdG8gdXNlIHRoaXMgY2xhc3MsIHRoZSB7QGxpbmsgVHJlZUJpZGlNYXB9IGNsYXNzIHNob3VsZAotICogYWxzbyBiZSBjb25zaWRlcmVkLiBJdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgdXNpbmcgYSBkZWRpY2F0ZWQgZGVzaWduLCBhbmQgZG9lcwotICogbm90IHN0b3JlIGVhY2ggb2JqZWN0IHR3aWNlLCB3aGljaCBjYW4gc2F2ZSBvbiBtZW1vcnkgdXNlLgotICogPHA+Ci0gKiBOT1RFOiBGcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLCBhbGwgc3ViY2xhc3NlcyB3aWxsIHVzZSA8Y29kZT5UcmVlTWFwPC9jb2RlPgotICogYW5kIHRoZSBmbGF3ZWQgPGNvZGU+Y3JlYXRlTWFwPC9jb2RlPiBtZXRob2QgaXMgaWdub3JlZC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkSWQ6IER1YWxUcmVlQmlkaU1hcC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzIgbXBhcmtlciBFeHAgJAotICogCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRHVhbFRyZWVCaWRpTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3REdWFsQmlkaU1hcCBpbXBsZW1lbnRzIFNvcnRlZEJpZGlNYXAsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogRW5zdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyMTk2OTMyODM2MTgwOUw7Ci0gICAgLyoqIFRoZSBjb21wYXJhdG9yIHRvIHVzZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDb21wYXJhdG9yIGNvbXBhcmF0b3I7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5EdWFsVHJlZUJpZGlNYXA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIER1YWxUcmVlQmlkaU1hcCgpIHsKLSAgICAgICAgc3VwZXIobmV3IFRyZWVNYXAoKSwgbmV3IFRyZWVNYXAoKSk7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5EdWFsVHJlZUJpZGlNYXA8L2NvZGU+IGFuZCBjb3BpZXMgdGhlIG1hcHBpbmdzIGZyb20KLSAgICAgKiBzcGVjaWZpZWQgPGNvZGU+TWFwPC9jb2RlPi4gIAotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIER1YWxUcmVlQmlkaU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBUcmVlTWFwKCksIG5ldyBUcmVlTWFwKCkpOwotICAgICAgICBwdXRBbGwobWFwKTsKLSAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkR1YWxUcmVlQmlkaU1hcDwvY29kZT4gdXNpbmcgdGhlIHNwZWNpZmllZCBDb21wYXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBDb21wYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIER1YWxUcmVlQmlkaU1hcChDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgc3VwZXIobmV3IFRyZWVNYXAoY29tcGFyYXRvciksIG5ldyBUcmVlTWFwKGNvbXBhcmF0b3IpKTsKLSAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkR1YWxUcmVlQmlkaU1hcDwvY29kZT4gdGhhdCBkZWNvcmF0ZXMgdGhlIHNwZWNpZmllZCBtYXBzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vcm1hbE1hcCAgdGhlIG5vcm1hbCBkaXJlY3Rpb24gbWFwCi0gICAgICogQHBhcmFtIHJldmVyc2VNYXAgIHRoZSByZXZlcnNlIGRpcmVjdGlvbiBtYXAKLSAgICAgKiBAcGFyYW0gaW52ZXJzZUJpZGlNYXAgIHRoZSBpbnZlcnNlIEJpZGlNYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRHVhbFRyZWVCaWRpTWFwKE1hcCBub3JtYWxNYXAsIE1hcCByZXZlcnNlTWFwLCBCaWRpTWFwIGludmVyc2VCaWRpTWFwKSB7Ci0gICAgICAgIHN1cGVyKG5vcm1hbE1hcCwgcmV2ZXJzZU1hcCwgaW52ZXJzZUJpZGlNYXApOwotICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSAoKFNvcnRlZE1hcCkgbm9ybWFsTWFwKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9ybWFsTWFwICB0aGUgbm9ybWFsIGRpcmVjdGlvbiBtYXAKLSAgICAgKiBAcGFyYW0gcmV2ZXJzZU1hcCAgdGhlIHJldmVyc2UgZGlyZWN0aW9uIG1hcAotICAgICAqIEBwYXJhbSBpbnZlcnNlTWFwICB0aGUgaW52ZXJzZSBCaWRpTWFwCi0gICAgICogQHJldHVybiBuZXcgYmlkaSBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlkaU1hcCBjcmVhdGVCaWRpTWFwKE1hcCBub3JtYWxNYXAsIE1hcCByZXZlcnNlTWFwLCBCaWRpTWFwIGludmVyc2VNYXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEdWFsVHJlZUJpZGlNYXAobm9ybWFsTWFwLCByZXZlcnNlTWFwLCBpbnZlcnNlTWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIENvbXBhcmF0b3IgY29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuICgoU29ydGVkTWFwKSBtYXBzWzBdKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuICgoU29ydGVkTWFwKSBtYXBzWzBdKS5maXJzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuICgoU29ydGVkTWFwKSBtYXBzWzBdKS5sYXN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hcHNbMF0gaW5zdGFuY2VvZiBPcmRlcmVkTWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChPcmRlcmVkTWFwKSBtYXBzWzBdKS5uZXh0S2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgU29ydGVkTWFwIHNtID0gKFNvcnRlZE1hcCkgbWFwc1swXTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBzbS50YWlsTWFwKGtleSkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgaXQubmV4dCgpOwotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXQubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFwc1swXSBpbnN0YW5jZW9mIE9yZGVyZWRNYXApIHsKLSAgICAgICAgICAgIHJldHVybiAoKE9yZGVyZWRNYXApIG1hcHNbMF0pLnByZXZpb3VzS2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgU29ydGVkTWFwIHNtID0gKFNvcnRlZE1hcCkgbWFwc1swXTsKLSAgICAgICAgU29ydGVkTWFwIGhtID0gc20uaGVhZE1hcChrZXkpOwotICAgICAgICBpZiAoaG0uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaG0ubGFzdEtleSgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIGFuIG9yZGVyZWQgbWFwIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY29waWVzIHRoZSBlbGVtZW50cyB0byBhbiBBcnJheUxpc3QgaW4gb3JkZXIgdG8KLSAgICAgKiBwcm92aWRlIHRoZSBmb3J3YXJkL2JhY2t3YXJkIGJlaGF2aW91ci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9yZGVyZWQgbWFwIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlkaU9yZGVyZWRNYXBJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkQmlkaU1hcCBpbnZlcnNlU29ydGVkQmlkaU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRCaWRpTWFwKSBpbnZlcnNlQmlkaU1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcmRlcmVkQmlkaU1hcCBpbnZlcnNlT3JkZXJlZEJpZGlNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoT3JkZXJlZEJpZGlNYXApIGludmVyc2VCaWRpTWFwKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgaGVhZE1hcChPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgU29ydGVkTWFwIHN1YiA9ICgoU29ydGVkTWFwKSBtYXBzWzBdKS5oZWFkTWFwKHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3TWFwKHRoaXMsIHN1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCB0YWlsTWFwKE9iamVjdCBmcm9tS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBzdWIgPSAoKFNvcnRlZE1hcCkgbWFwc1swXSkudGFpbE1hcChmcm9tS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3TWFwKHRoaXMsIHN1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCBzdWJNYXAoT2JqZWN0IGZyb21LZXksIE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgc3ViID0gKChTb3J0ZWRNYXApIG1hcHNbMF0pLnN1Yk1hcChmcm9tS2V5LCB0b0tleSk7Ci0gICAgICAgIHJldHVybiBuZXcgVmlld01hcCh0aGlzLCBzdWIpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgc29ydGVkIG1hcCB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmlld01hcCBleHRlbmRzIEFic3RyYWN0U29ydGVkTWFwRGVjb3JhdG9yIHsKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgYmlkaSBtYXAuICovCi0gICAgICAgIGZpbmFsIER1YWxUcmVlQmlkaU1hcCBiaWRpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gYmlkaSAgdGhlIHBhcmVudCBiaWRpIG1hcAotICAgICAgICAgKiBAcGFyYW0gc20gIHRoZSBzdWJNYXAgc29ydGVkIG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIFZpZXdNYXAoRHVhbFRyZWVCaWRpTWFwIGJpZGksIFNvcnRlZE1hcCBzbSkgewotICAgICAgICAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBncmVhdCBoZXJlLi4uCi0gICAgICAgICAgICAvLyB1c2UgdGhlIG1hcHNbMF0gYXMgdGhlIGZpbHRlcmVkIG1hcCwgYnV0IG1hcHNbMV0gYXMgdGhlIGZ1bGwgbWFwCi0gICAgICAgICAgICAvLyB0aGlzIGZvcmNlcyBjb250YWluc1ZhbHVlIGFuZCBjbGVhciB0byBiZSBvdmVycmlkZGVuCi0gICAgICAgICAgICBzdXBlcigoU29ydGVkTWFwKSBiaWRpLmNyZWF0ZUJpZGlNYXAoc20sIGJpZGkubWFwc1sxXSwgYmlkaS5pbnZlcnNlQmlkaU1hcCkpOwotICAgICAgICAgICAgdGhpcy5iaWRpID0gKER1YWxUcmVlQmlkaU1hcCkgbWFwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgLy8gb3ZlcnJpZGUgYXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdW1wcyB0byBbMV0KLSAgICAgICAgICAgIHJldHVybiBiaWRpLm1hcHNbMF0uY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgLy8gb3ZlcnJpZGUgYXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdW1wcyB0byBbMV0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBrZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU29ydGVkTWFwIGhlYWRNYXAoT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdNYXAoYmlkaSwgc3VwZXIuaGVhZE1hcCh0b0tleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNvcnRlZE1hcCB0YWlsTWFwKE9iamVjdCBmcm9tS2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdNYXAoYmlkaSwgc3VwZXIudGFpbE1hcChmcm9tS2V5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU29ydGVkTWFwIHN1Yk1hcChPYmplY3QgZnJvbUtleSwgT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdNYXAoYmlkaSwgc3VwZXIuc3ViTWFwKGZyb21LZXksIHRvS2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgTWFwSXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCaWRpT3JkZXJlZE1hcEl0ZXJhdG9yIGltcGxlbWVudHMgT3JkZXJlZE1hcEl0ZXJhdG9yLCBSZXNldHRhYmxlSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdER1YWxCaWRpTWFwIHBhcmVudDsKLSAgICAgICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICAgICAgcHJvdGVjdGVkIExpc3RJdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgLyoqIFRoZSBsYXN0IHJldHVybmVkIGVudHJ5ICovCi0gICAgICAgIHByaXZhdGUgTWFwLkVudHJ5IGxhc3QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIEJpZGlPcmRlcmVkTWFwSXRlcmF0b3IoQWJzdHJhY3REdWFsQmlkaU1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdChwYXJlbnQuZW50cnlTZXQoKSkubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3QuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0LmdldEtleSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgIHBhcmVudC5yZW1vdmUobGFzdC5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgZ2V0S2V5KCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGFzdC5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgZ2V0VmFsdWUoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsYXN0LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3Igc2V0VmFsdWUoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQubWFwc1sxXS5jb250YWluc0tleSh2YWx1ZSkgJiYKLSAgICAgICAgICAgICAgICBwYXJlbnQubWFwc1sxXS5nZXQodmFsdWUpICE9IGxhc3QuZ2V0S2V5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdXNlIHNldFZhbHVlKCkgd2hlbiB0aGUgb2JqZWN0IGJlaW5nIHNldCBpcyBhbHJlYWR5IGluIHRoZSBtYXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQucHV0KGxhc3QuZ2V0S2V5KCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QocGFyZW50LmVudHJ5U2V0KCkpLmxpc3RJdGVyYXRvcigpOwotICAgICAgICAgICAgbGFzdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJNYXBJdGVyYXRvclsiICsgZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpICsgIl0iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1hcEl0ZXJhdG9yW10iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIFNlcmlhbGl6YXRpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcHNbMF0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBtYXBzWzBdID0gbmV3IFRyZWVNYXAoY29tcGFyYXRvcik7Ci0gICAgICAgIG1hcHNbMV0gPSBuZXcgVHJlZU1hcChjb21wYXJhdG9yKTsKLSAgICAgICAgTWFwIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVHJlZUJpZGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxYzIxNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9UcmVlQmlkaU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5LZXlWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRCaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZS5Vbm1vZGlmaWFibGVNYXBFbnRyeTsKLQotLyoqCi0gKiBSZWQtQmxhY2sgdHJlZS1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBCaWRpTWFwIHdoZXJlIGFsbCBvYmplY3RzIGFkZGVkCi0gKiBpbXBsZW1lbnQgdGhlIDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+IGludGVyZmFjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBndWFyYW50ZWVzIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGluIGJvdGggYXNjZW5kaW5nIGtleSBvcmRlcgotICogYW5kIGFzY2VuZGluZyB2YWx1ZSBvcmRlciwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgbmF0dXJhbCBvcmRlciBmb3IKLSAqIHRoZSBrZXkncyBhbmQgdmFsdWUncyBjbGFzc2VzLgotICogPHA+Ci0gKiBUaGlzIE1hcCBpcyBpbnRlbmRlZCBmb3IgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBiZSBhYmxlIHRvIGxvb2sKLSAqIHVwIGEga2V5LXZhbHVlIHBhaXJpbmcgYnkgZWl0aGVyIGtleSBvciB2YWx1ZSwgYW5kIG5lZWQgdG8gZG8gc28KLSAqIHdpdGggZXF1YWwgZWZmaWNpZW5jeS4KLSAqIDxwPgotICogV2hpbGUgdGhhdCBnb2FsIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBieSB0YWtpbmcgYSBwYWlyIG9mIFRyZWVNYXBzCi0gKiBhbmQgcmVkaXJlY3RpbmcgcmVxdWVzdHMgdG8gdGhlIGFwcHJvcHJpYXRlIFRyZWVNYXAgKGUuZy4sCi0gKiBjb250YWluc0tleSB3b3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgVHJlZU1hcCB0aGF0IG1hcHMgdmFsdWVzIHRvCi0gKiBrZXlzLCBjb250YWluc1ZhbHVlIHdvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBUcmVlTWFwIHRoYXQgbWFwcyBrZXlzCi0gKiB0byB2YWx1ZXMpLCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGF0IGltcGxlbWVudGF0aW9uLgotICogSWYgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUcmVlTWFwcyBpcyBsYXJnZSwgdGhlIGNvc3Qgb2YgcmVkdW5kYW50Ci0gKiBzdG9yYWdlIGJlY29tZXMgc2lnbmlmaWNhbnQuIFRoZSB7QGxpbmsgRHVhbFRyZWVCaWRpTWFwfSBhbmQKLSAqIHtAbGluayBEdWFsSGFzaEJpZGlNYXB9IGltcGxlbWVudGF0aW9ucyB1c2UgdGhpcyBhcHByb2FjaC4KLSAqIDxwPgotICogVGhpcyBzb2x1dGlvbiBrZWVwcyBtaW5pbWl6ZXMgdGhlIGRhdGEgc3RvcmFnZSBieSBob2xkaW5nIGRhdGEgb25seSBvbmNlLgotICogVGhlIHJlZC1ibGFjayBhbGdvcml0aG0gaXMgYmFzZWQgb24gamF2YSB1dGlsIFRyZWVNYXAsIGJ1dCBoYXMgYmVlbiBtb2RpZmllZAotICogdG8gc2ltdWx0YW5lb3VzbHkgbWFwIGEgdHJlZSBub2RlIGJ5IGtleSBhbmQgYnkgdmFsdWUuIFRoaXMgZG91YmxlcyB0aGUKLSAqIGNvc3Qgb2YgcHV0IG9wZXJhdGlvbnMgKGJ1dCBzbyBkb2VzIHVzaW5nIHR3byBUcmVlTWFwcyksIGFuZCBuZWFybHkgZG91YmxlcwotICogdGhlIGNvc3Qgb2YgcmVtb3ZlIG9wZXJhdGlvbnMgKHRoZXJlIGlzIGEgc2F2aW5ncyBpbiB0aGF0IHRoZSBsb29rdXAgb2YgdGhlCi0gKiBub2RlIHRvIGJlIHJlbW92ZWQgb25seSBoYXMgdG8gYmUgcGVyZm9ybWVkIG9uY2UpLiBBbmQgc2luY2Ugb25seSBvbmUgbm9kZQotICogY29udGFpbnMgdGhlIGtleSBhbmQgdmFsdWUsIHN0b3JhZ2UgaXMgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gdGhhdAotICogcmVxdWlyZWQgYnkgdHdvIFRyZWVNYXBzLgotICogPHA+Ci0gKiBUaGUgTWFwLkVudHJ5IGluc3RhbmNlcyByZXR1cm5lZCBieSB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kcyB3aWxsCi0gKiBub3QgYWxsb3cgc2V0VmFsdWUoKSBhbmQgd2lsbCB0aHJvdyBhbgotICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gb24gYXR0ZW1wdHMgdG8gY2FsbCB0aGF0IG1ldGhvZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAgKHByZXZpb3VzbHkgRG91YmxlT3JkZXJlZE1hcCB2Mi4wKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgTWFyYyBKb2huc29uCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgVHJlZUJpZGlNYXAgaW1wbGVtZW50cyBPcmRlcmVkQmlkaU1hcCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBFTlRSWSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkVSU0VNQVBFTlRSWSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVTV9PRl9JTkRJQ0VTID0gS0VZICsgVkFMVUU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0lOREVYID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX0lORElDRVMgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRhdGFOYW1lID0gbmV3IFN0cmluZ1tdIHsgImtleSIsICJ2YWx1ZSIgfTsKLSAgICAKLSAgICBwcml2YXRlIE5vZGVbXSByb290Tm9kZSA9IG5ldyBOb2RlWzJdOwotICAgIHByaXZhdGUgaW50IG5vZGVDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbW9kaWZpY2F0aW9ucyA9IDA7Ci0gICAgcHJpdmF0ZSBTZXQga2V5U2V0OwotICAgIHByaXZhdGUgU2V0IHZhbHVlc1NldDsKLSAgICBwcml2YXRlIFNldCBlbnRyeVNldDsKLSAgICBwcml2YXRlIFRyZWVCaWRpTWFwLkludmVyc2UgaW52ZXJzZSA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBUcmVlQmlkaU1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZUJpZGlNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBUcmVlQmlkaU1hcCBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIE1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gY29weQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXlzL3ZhbHVlcyBpbiB0aGUgbWFwIGFyZQotICAgICAqICBub3QgQ29tcGFyYWJsZSBvciBhcmUgbm90IG11dHVhbGx5IGNvbXBhcmFibGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBrZXkgb3IgdmFsdWUgaW4gdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIFRyZWVCaWRpTWFwKGZpbmFsIE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbm9kZUNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgaXMgZW1wdHkgb3Igbm90LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gKG5vZGVDb3VudCA9PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUga2V5IG11c3QgaW1wbGVtZW50IDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAga2V5IHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgY2hlY2tLZXkoa2V5KTsKLSAgICAgICAgcmV0dXJuIChsb29rdXAoKENvbXBhcmFibGUpIGtleSwgS0VZKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBtdXN0IGltcGxlbWVudCA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgY2hlY2tWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiAobG9va3VwKChDb21wYXJhYmxlKSB2YWx1ZSwgVkFMVUUpICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGtleSBtdXN0IGltcGxlbWVudCA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSwKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5Ci0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGRvR2V0KChDb21wYXJhYmxlKSBrZXksIEtFWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyB0aGUga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgbWFwLCByZXBsYWNpbmcgYW55IHByZXZpb3VzIHBhaXIuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBhZGRpbmcgYSBrZXktdmFsdWUgcGFpciwgdGhlIHZhbHVlIG1heSBhbHJlYWR5IGV4aXN0IGluIHRoZSBtYXAKLSAgICAgKiBhZ2FpbnN0IGEgZGlmZmVyZW50IGtleS4gVGhhdCBtYXBwaW5nIGlzIHJlbW92ZWQsIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgICAqIHZhbHVlIG9ubHkgb2NjdXJzIG9uY2UgaW4gdGhlIGludmVyc2UgbWFwLgotICAgICAqIDxwcmU+Ci0gICAgICogIEJpZGlNYXAgbWFwMSA9IG5ldyBUcmVlQmlkaU1hcCgpOwotICAgICAqICBtYXAucHV0KCJBIiwiQiIpOyAgLy8gY29udGFpbnMgQSBtYXBwZWQgdG8gQiwgYXMgcGVyIE1hcAotICAgICAqICBtYXAucHV0KCJBIiwiQyIpOyAgLy8gY29udGFpbnMgQSBtYXBwZWQgdG8gQywgYXMgcGVyIE1hcAotICAgICAqIAotICAgICAqICBCaWRpTWFwIG1hcDIgPSBuZXcgVHJlZUJpZGlNYXAoKTsKLSAgICAgKiAgbWFwLnB1dCgiQSIsIkIiKTsgIC8vIGNvbnRhaW5zIEEgbWFwcGVkIHRvIEIsIGFzIHBlciBNYXAKLSAgICAgKiAgbWFwLnB1dCgiQyIsIkIiKTsgIC8vIGNvbnRhaW5zIEMgbWFwcGVkIHRvIEIsIGtleSBBIGlzIHJlbW92ZWQKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cD4KLSAgICAgKiBCb3RoIGtleSBhbmQgdmFsdWUgbXVzdCBpbXBsZW1lbnQgPGNvZGU+Q29tcGFyYWJsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlICBhc3NvY2lhdGVkCi0gICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGtleQotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGRvUHV0KChDb21wYXJhYmxlKSBrZXksIChDb21wYXJhYmxlKSB2YWx1ZSwgS0VZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIGFsbCB0aGUgbWFwcGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCBpbnRvIHRoaXMgbWFwLgotICAgICAqIDxwPgotICAgICAqIEFsbCBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBpbXBsZW1lbnQgPGNvZGU+Q29tcGFyYWJsZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5IGZyb20KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBtYXAgaWYgcHJlc2VudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUga2V5IG11c3QgaW1wbGVtZW50IDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCi0gICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBkb1JlbW92ZSgoQ29tcGFyYWJsZSkga2V5LCBLRVkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1vZGlmeSgpOwotCi0gICAgICAgIG5vZGVDb3VudCA9IDA7Ci0gICAgICAgIHJvb3ROb2RlW0tFWV0gPSBudWxsOwotICAgICAgICByb290Tm9kZVtWQUxVRV0gPSBudWxsOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIG11c3QgaW1wbGVtZW50IDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSB3aG9zZSBhc3NvY2lhdGVkIGtleSBpcyB0byBiZSByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUgc3BlY2lmaWVkIHZhbHVlLAotICAgICAqICBvciBudWxsIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZG9HZXQoKENvbXBhcmFibGUpIHZhbHVlLCBWQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyB2YWx1ZSBmcm9tIHRoaXMgbWFwIGlmIHByZXNlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIG11c3QgaW1wbGVtZW50IDxjb2RlPkNvbXBhcmFibGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwCi0gICAgICogQHJldHVybiBwcmV2aW91cyBrZXkgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCB2YWx1ZSwKLSAgICAgKiAgb3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgdmFsdWUuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZVZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZG9SZW1vdmUoKENvbXBhcmFibGUpIHZhbHVlLCBWQUxVRSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IChsb3dlc3QpIGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCAobG93ZXN0KSBrZXkgY3VycmVudGx5IGluIHRoaXMgc29ydGVkIG1hcAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZmlyc3RLZXkoKSB7Ci0gICAgICAgIGlmIChub2RlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1hcCBpcyBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsZWFzdE5vZGUocm9vdE5vZGVbS0VZXSwgS0VZKS5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsYXN0IChoaWdoZXN0KSBrZXkgY3VycmVudGx5IGluIHRoaXMgbWFwLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCAoaGlnaGVzdCkga2V5IGN1cnJlbnRseSBpbiB0aGlzIHNvcnRlZCBtYXAKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtYXAgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIGlmIChub2RlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1hcCBpcyBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncmVhdGVzdE5vZGUocm9vdE5vZGVbS0VZXSwgS0VZKS5nZXRLZXkoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBrZXkgYWZ0ZXIgdGhlIG9uZSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGtleSBtdXN0IGltcGxlbWVudCA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBzZWFyY2ggZm9yIG5leHQgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIG5leHQga2V5LCBudWxsIGlmIG5vIG1hdGNoIG9yIGF0IGVuZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dEtleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoZWNrS2V5KGtleSk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5leHRHcmVhdGVyKGxvb2t1cCgoQ29tcGFyYWJsZSkga2V5LCBLRVkpLCBLRVkpOwotICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldEtleSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBvbmUgc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBrZXkgbXVzdCBpbXBsZW1lbnQgPGNvZGU+Q29tcGFyYWJsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc2VhcmNoIGZvciBwcmV2aW91cyBmcm9tCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMga2V5LCBudWxsIGlmIG5vIG1hdGNoIG9yIGF0IHN0YXJ0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91c0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoZWNrS2V5KGtleSk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5leHRTbWFsbGVyKGxvb2t1cCgoQ29tcGFyYWJsZSkga2V5LCBLRVkpLCBLRVkpOwotICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldEtleSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAgaW4ga2V5IG9yZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluCi0gICAgICogdGhlIHNldCwgYW5kIHZpY2UtdmVyc2EuIElmIHRoZSBtYXAgaXMgbW9kaWZpZWQgd2hpbGUgYW4gaXRlcmF0aW9uIG92ZXIKLSAgICAgKiB0aGUgc2V0IGlzIGluIHByb2dyZXNzLCB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZwotICAgICAqIGZyb20gdGhlIG1hcC4gSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgaWYgKGtleVNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBrZXlTZXQgPSBuZXcgVmlldyh0aGlzLCBLRVksIEtFWSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVNldDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNldCB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwIGluIGtleSBvcmRlci4KLSAgICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGNhbiBiZSBjYXN0IHRvIGEgU2V0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluCi0gICAgICogdGhlIHNldCwgYW5kIHZpY2UtdmVyc2EuIElmIHRoZSBtYXAgaXMgbW9kaWZpZWQgd2hpbGUgYW4gaXRlcmF0aW9uIG92ZXIKLSAgICAgKiB0aGUgc2V0IGlzIGluIHByb2dyZXNzLCB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZwotICAgICAqIGZyb20gdGhlIG1hcC4gSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKHZhbHVlc1NldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZXNTZXQgPSBuZXcgVmlldyh0aGlzLCBLRVksIFZBTFVFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzU2V0OwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhlIGVudHJpZXMgY29udGFpbmVkIGluIHRoaXMgbWFwIGluIGtleSBvcmRlci4KLSAgICAgKiBGb3Igc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBtYXAsIHRoZSBNYXBJdGVyYXRvciBpcyBxdWlja2VyLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluCi0gICAgICogdGhlIHNldCwgYW5kIHZpY2UtdmVyc2EuIElmIHRoZSBtYXAgaXMgbW9kaWZpZWQgd2hpbGUgYW4gaXRlcmF0aW9uIG92ZXIKLSAgICAgKiB0aGUgc2V0IGlzIGluIHByb2dyZXNzLCB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZwotICAgICAqIGZyb20gdGhlIG1hcC4gSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIGFkZEFsbCBvcGVyYXRpb25zLgotICAgICAqIFRoZSByZXR1cm5lZCBNYXBFbnRyeSBvYmplY3RzIGRvIG5vdCBzdXBwb3J0IHNldFZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIGlmIChlbnRyeVNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5Vmlldyh0aGlzLCBLRVksIE1BUEVOVFJZKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnlTZXQ7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgbWFwIGVudHJpZXMuCi0gICAgICogPHA+Ci0gICAgICogRm9yIHRoaXMgbWFwLCB0aGlzIGl0ZXJhdG9yIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBpdGVyYXRlIG92ZXIgdGhlIGVudHJpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVmlld01hcEl0ZXJhdG9yKHRoaXMsIEtFWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBvcmRlcmVkIGl0ZXJhdG9yIG92ZXIgdGhlIG1hcCBlbnRyaWVzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXRlcmF0b3IgYWxsb3dzIGJvdGggZm9yd2FyZCBhbmQgcmV2ZXJzZSBpdGVyYXRpb24gb3ZlciB0aGUgZW50cmllcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFbXB0eU9yZGVyZWRNYXBJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFZpZXdNYXBJdGVyYXRvcih0aGlzLCBLRVkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbnZlcnNlIG1hcCBmb3IgY29tcGFyaXNvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnZlcnNlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBCaWRpTWFwIGludmVyc2VCaWRpTWFwKCkgewotICAgICAgICByZXR1cm4gaW52ZXJzZU9yZGVyZWRCaWRpTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW52ZXJzZSBtYXAgZm9yIGNvbXBhcmlzb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW52ZXJzZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgT3JkZXJlZEJpZGlNYXAgaW52ZXJzZU9yZGVyZWRCaWRpTWFwKCkgewotICAgICAgICBpZiAoaW52ZXJzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnZlcnNlID0gbmV3IEludmVyc2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludmVyc2U7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGZvciBlcXVhbHMgYXMgcGVyIHRoZSBBUEkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gdGhpcy5kb0VxdWFscyhvYmosIEtFWSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtYXAgYXMgcGVyIHRoZSBBUEkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9IYXNoQ29kZShLRVkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHZlcnNpb24gb2YgdGhpcyBNYXAgaW4gc3RhbmRhcmQgZm9ybWF0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdGFuZGFyZCBmb3JtYXQgc3RyaW5nIHZlcnNpb24gb2YgdGhlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRvVG9TdHJpbmcoS0VZKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbW1vbiBnZXQgbG9naWMsIHVzZWQgdG8gZ2V0IGJ5IGtleSBvciBnZXQgYnkgdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogIHRoZSBrZXkgb3IgdmFsdWUgdGhhdCB3ZSdyZSBsb29raW5nIGZvcgotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgKGlmIHRoZSB2YWx1ZSB3YXMgbWFwcGVkKSBvciB0aGUgdmFsdWUgKGlmIHRoZQotICAgICAqICAgICAgICAga2V5IHdhcyBtYXBwZWQpOyBudWxsIGlmIHdlIGNvdWxkbid0IGZpbmQgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZG9HZXQoZmluYWwgQ29tcGFyYWJsZSBvYmosIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBjaGVja05vbk51bGxDb21wYXJhYmxlKG9iaiwgaW5kZXgpOwotICAgICAgICBOb2RlIG5vZGUgPSBsb29rdXAob2JqLCBpbmRleCk7Ci0gICAgICAgIHJldHVybiAoKG5vZGUgPT0gbnVsbCkgPyBudWxsIDogbm9kZS5nZXREYXRhKG9wcG9zaXRlSW5kZXgoaW5kZXgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIHB1dCBsb2dpYywgZGlmZmVyaW5nIG9ubHkgaW4gdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5LCBhbHdheXMgdGhlIG1haW4gbWFwIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlLCBhbHdheXMgdGhlIG1haW4gbWFwIHZhbHVlCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludCwgZm9yIHRoZSByZXR1cm4gdmFsdWUgb25seQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzbHkgbWFwcGVkIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZG9QdXQoZmluYWwgQ29tcGFyYWJsZSBrZXksIGZpbmFsIENvbXBhcmFibGUgdmFsdWUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBjaGVja0tleUFuZFZhbHVlKGtleSwgdmFsdWUpOwotICAgICAgICAKLSAgICAgICAgLy8gc3RvcmUgcHJldmlvdXMgYW5kIHJlbW92ZSBwcmV2aW91cyBtYXBwaW5ncwotICAgICAgICBPYmplY3QgcHJldiA9IChpbmRleCA9PSBLRVkgPyBkb0dldChrZXksIEtFWSkgOiAgZG9HZXQodmFsdWUsIFZBTFVFKSk7Ci0gICAgICAgIGRvUmVtb3ZlKGtleSwgS0VZKTsKLSAgICAgICAgZG9SZW1vdmUodmFsdWUsIFZBTFVFKTsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgbm9kZSA9IHJvb3ROb2RlW0tFWV07Ci0gICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1hcCBpcyBlbXB0eQotICAgICAgICAgICAgTm9kZSByb290ID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByb290Tm9kZVtLRVldID0gcm9vdDsKLSAgICAgICAgICAgIHJvb3ROb2RlW1ZBTFVFXSA9IHJvb3Q7Ci0gICAgICAgICAgICBncm93KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFkZCBuZXcgbWFwcGluZwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgY21wID0gY29tcGFyZShrZXksIG5vZGUuZ2V0RGF0YShLRVkpKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN0b3JlIGEgZHVwbGljYXRlIGtleSAoXCIiICsga2V5ICsgIlwiKSBpbiB0aGlzIE1hcCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRMZWZ0KEtFWSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TGVmdChLRVkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBuZXdOb2RlID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VmFsdWUobmV3Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldExlZnQobmV3Tm9kZSwgS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUuc2V0UGFyZW50KG5vZGUsIEtFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrSW5zZXJ0KG5ld05vZGUsIEtFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncm93KCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBjbXAgPiAwCi0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldFJpZ2h0KEtFWSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UmlnaHQoS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgbmV3Tm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFZhbHVlKG5ld05vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRSaWdodChuZXdOb2RlLCBLRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5zZXRQYXJlbnQobm9kZSwgS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVkQmxhY2tJbnNlcnQobmV3Tm9kZSwgS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3coKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJldjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYnkgb2JqZWN0IChyZW1vdmUgYnkga2V5IG9yIHJlbW92ZSBieSB2YWx1ZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBvIHRoZSBrZXksIG9yIHZhbHVlLCB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUga2V5LCBpZiByZW1vdmUgYnkgdmFsdWUsIG9yIHRoZSB2YWx1ZSwgaWYgcmVtb3ZlIGJ5Ci0gICAgICogICAgICAgICBrZXkuIG51bGwgaWYgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGRvUmVtb3ZlKGZpbmFsIENvbXBhcmFibGUgbywgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGxvb2t1cChvLCBpbmRleCk7Ci0gICAgICAgIE9iamVjdCBydmFsID0gbnVsbDsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcnZhbCA9IG5vZGUuZ2V0RGF0YShvcHBvc2l0ZUluZGV4KGluZGV4KSk7Ci0gICAgICAgICAgICBkb1JlZEJsYWNrRGVsZXRlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRvIHRoZSBhY3R1YWwgbG9va3VwIG9mIGEgcGllY2Ugb2YgZGF0YQotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGtleSBvciB2YWx1ZSB0byBiZSBsb29rZWQgdXAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICogQHJldHVybiB0aGUgZGVzaXJlZCBOb2RlLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgb2YgdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgZGF0YQotICAgICAqLwotICAgIHByaXZhdGUgTm9kZSBsb29rdXAoZmluYWwgQ29tcGFyYWJsZSBkYXRhLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgTm9kZSBydmFsID0gbnVsbDsKLSAgICAgICAgTm9kZSBub2RlID0gcm9vdE5vZGVbaW5kZXhdOwotCi0gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBjbXAgPSBjb21wYXJlKGRhdGEsIG5vZGUuZ2V0RGF0YShpbmRleCkpOwotICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcnZhbCA9IG5vZGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vZGUgPSAoY21wIDwgMCkgPyBub2RlLmdldExlZnQoaW5kZXgpIDogbm9kZS5nZXRSaWdodChpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIG5leHQgbGFyZ2VyIG5vZGUgZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGJlIHNlYXJjaGVkIGZyb20KLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICogQHJldHVybiB0aGUgc3BlY2lmaWVkIG5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIE5vZGUgbmV4dEdyZWF0ZXIoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgTm9kZSBydmFsID0gbnVsbDsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcnZhbCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB0byB0aGUgbm9kZSdzIHJpZ2h0IGlzIGxhcmdlci4gVGhlIGxlYXN0IG9mCi0gICAgICAgICAgICAvLyB0aGUgcmlnaHQgbm9kZSdzIGRlc2NlbmRhbnRzIGlzIHRoZSBuZXh0IGxhcmdlciBub2RlCi0gICAgICAgICAgICBydmFsID0gbGVhc3ROb2RlKG5vZGUuZ2V0UmlnaHQoaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0cmF2ZXJzZSB1cCBvdXIgYW5jZXN0cnkgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB0aGF0Ci0gICAgICAgICAgICAvLyBpcyBudWxsIG9yIG9uZSB3aG9zZSBsZWZ0IGNoaWxkIGlzIG91ciBhbmNlc3Rvci4gSWYgd2UKLSAgICAgICAgICAgIC8vIGZpbmQgYSBudWxsLCB0aGVuIHRoaXMgbm9kZSBJUyB0aGUgbGFyZ2VzdCBub2RlIGluIHRoZQotICAgICAgICAgICAgLy8gdHJlZSwgYW5kIHRoZXJlIGlzIG5vIGdyZWF0ZXIgbm9kZS4gT3RoZXJ3aXNlLCB3ZSBhcmUKLSAgICAgICAgICAgIC8vIHRoZSBsYXJnZXN0IG5vZGUgaW4gdGhlIHN1YnRyZWUgb24gdGhhdCBhbmNlc3RvcidzIGxlZnQKLSAgICAgICAgICAgIC8vIC4uLiBhbmQgdGhhdCBhbmNlc3RvciBpcyB0aGUgbmV4dCBncmVhdGVzdCBub2RlCi0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KGluZGV4KTsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBub2RlOwotCi0gICAgICAgICAgICB3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAoY2hpbGQgPT0gcGFyZW50LmdldFJpZ2h0KGluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ2YWwgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBuZXh0IGxhcmdlciBub2RlIGZyb20gdGhlIHNwZWNpZmllZCBub2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCBmcm9tCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCBub2RlCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb2RlIG5leHRTbWFsbGVyKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIE5vZGUgcnZhbCA9IG51bGw7Ci0gICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJ2YWwgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB0byB0aGUgbm9kZSdzIGxlZnQgaXMgc21hbGxlci4gVGhlIGdyZWF0ZXN0IG9mCi0gICAgICAgICAgICAvLyB0aGUgbGVmdCBub2RlJ3MgZGVzY2VuZGFudHMgaXMgdGhlIG5leHQgc21hbGxlciBub2RlCi0gICAgICAgICAgICBydmFsID0gZ3JlYXRlc3ROb2RlKG5vZGUuZ2V0TGVmdChpbmRleCksIGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRyYXZlcnNlIHVwIG91ciBhbmNlc3RyeSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHRoYXQKLSAgICAgICAgICAgIC8vIGlzIG51bGwgb3Igb25lIHdob3NlIHJpZ2h0IGNoaWxkIGlzIG91ciBhbmNlc3Rvci4gSWYgd2UKLSAgICAgICAgICAgIC8vIGZpbmQgYSBudWxsLCB0aGVuIHRoaXMgbm9kZSBJUyB0aGUgbGFyZ2VzdCBub2RlIGluIHRoZQotICAgICAgICAgICAgLy8gdHJlZSwgYW5kIHRoZXJlIGlzIG5vIGdyZWF0ZXIgbm9kZS4gT3RoZXJ3aXNlLCB3ZSBhcmUKLSAgICAgICAgICAgIC8vIHRoZSBsYXJnZXN0IG5vZGUgaW4gdGhlIHN1YnRyZWUgb24gdGhhdCBhbmNlc3RvcidzIHJpZ2h0Ci0gICAgICAgICAgICAvLyAuLi4gYW5kIHRoYXQgYW5jZXN0b3IgaXMgdGhlIG5leHQgZ3JlYXRlc3Qgbm9kZQotICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudChpbmRleCk7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gbm9kZTsKLQotICAgICAgICAgICAgd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgKGNoaWxkID09IHBhcmVudC5nZXRMZWZ0KGluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ2YWwgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2YWw7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3Bwb3NpdGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqIEByZXR1cm4gVkFMVUUgKGlmIEtFWSB3YXMgc3BlY2lmaWVkKSwgZWxzZSBLRVkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgb3Bwb3NpdGVJbmRleChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgLy8gb2xkIHRyaWNrIC4uLiB0byBmaW5kIHRoZSBvcHBvc2l0ZSBvZiBhIHZhbHVlLCBtIG9yIG4sCi0gICAgICAgIC8vIHN1YnRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdW0gb2YgdGhlIHR3byBwb3NzaWJsZQotICAgICAgICAvLyB2YWx1ZXMuIChtICsgbikgLSBtID0gbjsgKG0gKyBuKSAtIG4gPSBtCi0gICAgICAgIHJldHVybiBTVU1fT0ZfSU5ESUNFUyAtIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdHdvIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSAgdGhlIGZpcnN0IG9iamVjdAotICAgICAqIEBwYXJhbSBvMiAgdGhlIHNlY29uZCBvYmplY3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gbmVnYXRpdmUgdmFsdWUgaWYgbzEgJmx0OyBvMjsgMCBpZiBvMSA9PSBvMjsgcG9zaXRpdmUKLSAgICAgKiAgICAgICAgIHZhbHVlIGlmIG8xICZndDsgbzIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShmaW5hbCBDb21wYXJhYmxlIG8xLCBmaW5hbCBDb21wYXJhYmxlIG8yKSB7Ci0gICAgICAgIHJldHVybiBvMS5jb21wYXJlVG8obzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGxlYXN0IG5vZGUgZnJvbSBhIGdpdmVuIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSAgdGhlIG5vZGUgZnJvbSB3aGljaCB3ZSB3aWxsIHN0YXJ0IHNlYXJjaGluZwotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBub2RlLCBmcm9tIHRoZSBzcGVjaWZpZWQgbm9kZSwgaW4gdGhlCi0gICAgICogICAgICAgICBzcGVjaWZpZWQgbWFwcGluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE5vZGUgbGVhc3ROb2RlKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIE5vZGUgcnZhbCA9IG5vZGU7Ci0gICAgICAgIGlmIChydmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChydmFsLmdldExlZnQoaW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydmFsID0gcnZhbC5nZXRMZWZ0KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBncmVhdGVzdCBub2RlIGZyb20gYSBnaXZlbiBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgIHRoZSBub2RlIGZyb20gd2hpY2ggd2Ugd2lsbCBzdGFydCBzZWFyY2hpbmcKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICogQHJldHVybiB0aGUgZ3JlYXRlc3Qgbm9kZSwgZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGdyZWF0ZXN0Tm9kZShmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBOb2RlIHJ2YWwgPSBub2RlOwotICAgICAgICBpZiAocnZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAocnZhbC5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ2YWwgPSBydmFsLmdldFJpZ2h0KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb3B5IHRoZSBjb2xvciBmcm9tIG9uZSBub2RlIHRvIGFub3RoZXIsIGRlYWxpbmcgd2l0aCB0aGUgZmFjdAotICAgICAqIHRoYXQgb25lIG9yIGJvdGggbm9kZXMgbWF5LCBpbiBmYWN0LCBiZSBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbSB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBjb3B5aW5nOyBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0byB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBjaGFuZ2luZzsgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5Q29sb3IoZmluYWwgTm9kZSBmcm9tLCBmaW5hbCBOb2RlIHRvLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHRvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBtYWtlIGl0IGJsYWNrCi0gICAgICAgICAgICAgICAgdG8uc2V0QmxhY2soaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0by5jb3B5Q29sb3IoZnJvbSwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaXMgdGhlIHNwZWNpZmllZCBub2RlIHJlZD8gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIG5vLCBpdCdzCi0gICAgICogYmxhY2ssIHRoYW5rIHlvdQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiAoKG5vZGUgPT0gbnVsbCkgPyBmYWxzZSA6IG5vZGUuaXNSZWQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGUgc3BlY2lmaWVkIGJsYWNrIHJlZD8gaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHN1cmUsCi0gICAgICogaXQncyBibGFjaywgdGhhbmsgeW91Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCbGFjayhmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKChub2RlID09IG51bGwpID8gdHJ1ZSA6IG5vZGUuaXNCbGFjayhpbmRleCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGZvcmNlIGEgbm9kZSAoaWYgaXQgZXhpc3RzKSByZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlUmVkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5vZGUuc2V0UmVkKGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGZvcmNlIGEgbm9kZSAoaWYgaXQgZXhpc3RzKSBibGFjawotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VCbGFjayhmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub2RlLnNldEJsYWNrKGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIG5vZGUncyBncmFuZHBhcmVudC4gbWluZCB5b3UsIHRoZSBub2RlLCBpdHMgcGFyZW50LCBvcgotICAgICAqIGl0cyBncmFuZHBhcmVudCBtYXkgbm90IGV4aXN0LiBubyBwcm9ibGVtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0R3JhbmRQYXJlbnQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmVudChnZXRQYXJlbnQobm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IGEgbm9kZSdzIHBhcmVudC4gbWluZCB5b3UsIHRoZSBub2RlLCBvciBpdHMgcGFyZW50LCBtYXkgbm90Ci0gICAgICogZXhpc3QuIG5vIHByb2JsZW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRQYXJlbnQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuICgobm9kZSA9PSBudWxsKSA/IG51bGwgOiBub2RlLmdldFBhcmVudChpbmRleCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIG5vZGUncyByaWdodCBjaGlsZC4gbWluZCB5b3UsIHRoZSBub2RlIG1heSBub3QgZXhpc3QuIG5vCi0gICAgICogcHJvYmxlbQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKG1heSBiZSBudWxsKSBpbiBxdWVzdGlvbgotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGdldFJpZ2h0Q2hpbGQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChub2RlID09IG51bGwpID8gbnVsbCA6IG5vZGUuZ2V0UmlnaHQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIG5vZGUncyBsZWZ0IGNoaWxkLiBtaW5kIHlvdSwgdGhlIG5vZGUgbWF5IG5vdCBleGlzdC4gbm8KLSAgICAgKiBwcm9ibGVtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0TGVmdENoaWxkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiAobm9kZSA9PSBudWxsKSA/IG51bGwgOiBub2RlLmdldExlZnQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgbm9kZSBpdHMgcGFyZW50J3MgbGVmdCBjaGlsZD8gbWluZCB5b3UsIHRoZSBub2RlLCBvcgotICAgICAqIGl0cyBwYXJlbnQsIG1heSBub3QgZXhpc3QuIG5vIHByb2JsZW0uIGlmIHRoZSBub2RlIGRvZXNuJ3QKLSAgICAgKiBleGlzdCAuLi4gaXQncyBpdHMgbm9uLWV4aXN0ZW50IHBhcmVudCdzIGxlZnQgY2hpbGQuIElmIHRoZQotICAgICAqIG5vZGUgZG9lcyBleGlzdCBidXQgaGFzIG5vIHBhcmVudCAuLi4gbm8sIHdlJ3JlIG5vdCB0aGUKLSAgICAgKiBub24tZXhpc3RlbnQgcGFyZW50J3MgbGVmdCBjaGlsZC4gT3RoZXJ3aXNlIChib3RoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBub2RlIEFORCBpdHMgcGFyZW50IGV4aXN0KSwgY2hlY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSAobWF5IGJlIG51bGwpIGluIHF1ZXN0aW9uCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMZWZ0Q2hpbGQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChub2RlID09IG51bGwpCi0gICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgIDogKChub2RlLmdldFBhcmVudChpbmRleCkgPT0gbnVsbCkgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogKG5vZGUgPT0gbm9kZS5nZXRQYXJlbnQoaW5kZXgpLmdldExlZnQoaW5kZXgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaXMgdGhpcyBub2RlIGl0cyBwYXJlbnQncyByaWdodCBjaGlsZD8gbWluZCB5b3UsIHRoZSBub2RlLCBvcgotICAgICAqIGl0cyBwYXJlbnQsIG1heSBub3QgZXhpc3QuIG5vIHByb2JsZW0uIGlmIHRoZSBub2RlIGRvZXNuJ3QKLSAgICAgKiBleGlzdCAuLi4gaXQncyBpdHMgbm9uLWV4aXN0ZW50IHBhcmVudCdzIHJpZ2h0IGNoaWxkLiBJZiB0aGUKLSAgICAgKiBub2RlIGRvZXMgZXhpc3QgYnV0IGhhcyBubyBwYXJlbnQgLi4uIG5vLCB3ZSdyZSBub3QgdGhlCi0gICAgICogbm9uLWV4aXN0ZW50IHBhcmVudCdzIHJpZ2h0IGNoaWxkLiBPdGhlcndpc2UgKGJvdGggdGhlCi0gICAgICogc3BlY2lmaWVkIG5vZGUgQU5EIGl0cyBwYXJlbnQgZXhpc3QpLCBjaGVjay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIChtYXkgYmUgbnVsbCkgaW4gcXVlc3Rpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JpZ2h0Q2hpbGQoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChub2RlID09IG51bGwpCi0gICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgIDogKChub2RlLmdldFBhcmVudChpbmRleCkgPT0gbnVsbCkgPyAKLSAgICAgICAgICAgICAgICBmYWxzZSA6IChub2RlID09IG5vZGUuZ2V0UGFyZW50KGluZGV4KS5nZXRSaWdodChpbmRleCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkbyBhIHJvdGF0ZSBsZWZ0LiBzdGFuZGFyZCBmYXJlIGluIHRoZSB3b3JsZCBvZiBiYWxhbmNlZCB0cmVlcwotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYmUgcm90YXRlZAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcm90YXRlTGVmdChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICBOb2RlIHJpZ2h0Q2hpbGQgPSBub2RlLmdldFJpZ2h0KGluZGV4KTsKLSAgICAgICAgbm9kZS5zZXRSaWdodChyaWdodENoaWxkLmdldExlZnQoaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgaWYgKHJpZ2h0Q2hpbGQuZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmlnaHRDaGlsZC5nZXRMZWZ0KGluZGV4KS5zZXRQYXJlbnQobm9kZSwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJpZ2h0Q2hpbGQuc2V0UGFyZW50KG5vZGUuZ2V0UGFyZW50KGluZGV4KSwgaW5kZXgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG5vZGUuZ2V0UGFyZW50KGluZGV4KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBub2RlIHdhcyB0aGUgcm9vdCAuLi4gbm93IGl0cyByaWdodCBjaGlsZCBpcyB0aGUgcm9vdAotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0gcmlnaHRDaGlsZDsKLSAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkgPT0gbm9kZSkgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldExlZnQocmlnaHRDaGlsZCwgaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldFJpZ2h0KHJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJpZ2h0Q2hpbGQuc2V0TGVmdChub2RlLCBpbmRleCk7Ci0gICAgICAgIG5vZGUuc2V0UGFyZW50KHJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkbyBhIHJvdGF0ZSByaWdodC4gc3RhbmRhcmQgZmFyZSBpbiB0aGUgd29ybGQgb2YgYmFsYW5jZWQgdHJlZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGJlIHJvdGF0ZWQKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZVJpZ2h0KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIE5vZGUgbGVmdENoaWxkID0gbm9kZS5nZXRMZWZ0KGluZGV4KTsKLSAgICAgICAgbm9kZS5zZXRMZWZ0KGxlZnRDaGlsZC5nZXRSaWdodChpbmRleCksIGluZGV4KTsKLSAgICAgICAgaWYgKGxlZnRDaGlsZC5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbGVmdENoaWxkLmdldFJpZ2h0KGluZGV4KS5zZXRQYXJlbnQobm9kZSwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGxlZnRDaGlsZC5zZXRQYXJlbnQobm9kZS5nZXRQYXJlbnQoaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0UGFyZW50KGluZGV4KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBub2RlIHdhcyB0aGUgcm9vdCAuLi4gbm93IGl0cyBsZWZ0IGNoaWxkIGlzIHRoZSByb290Ci0gICAgICAgICAgICByb290Tm9kZVtpbmRleF0gPSBsZWZ0Q2hpbGQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRQYXJlbnQoaW5kZXgpLmdldFJpZ2h0KGluZGV4KSA9PSBub2RlKSB7Ci0gICAgICAgICAgICBub2RlLmdldFBhcmVudChpbmRleCkuc2V0UmlnaHQobGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub2RlLmdldFBhcmVudChpbmRleCkuc2V0TGVmdChsZWZ0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlZnRDaGlsZC5zZXRSaWdodChub2RlLCBpbmRleCk7Ci0gICAgICAgIG5vZGUuc2V0UGFyZW50KGxlZnRDaGlsZCwgaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbXBsaWNhdGVkIHJlZC1ibGFjayBpbnNlcnQgc3R1ZmYuIEJhc2VkIG9uIFN1bidzIFRyZWVNYXAKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiwgdGhvdWdoIGl0J3MgYmFyZWx5IHJlY29nbml6YWJsZSBhbnkgbW9yZQotICAgICAqCi0gICAgICogQHBhcmFtIGluc2VydGVkTm9kZSB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9SZWRCbGFja0luc2VydChmaW5hbCBOb2RlIGluc2VydGVkTm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBpbnNlcnRlZE5vZGU7Ci0gICAgICAgIG1ha2VSZWQoY3VycmVudE5vZGUsIGluZGV4KTsKLQotICAgICAgICB3aGlsZSAoKGN1cnJlbnROb2RlICE9IG51bGwpCi0gICAgICAgICAgICAmJiAoY3VycmVudE5vZGUgIT0gcm9vdE5vZGVbaW5kZXhdKQotICAgICAgICAgICAgJiYgKGlzUmVkKGN1cnJlbnROb2RlLmdldFBhcmVudChpbmRleCksIGluZGV4KSkpIHsKLSAgICAgICAgICAgIGlmIChpc0xlZnRDaGlsZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSB5ID0gZ2V0UmlnaHRDaGlsZChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWQoeSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soeSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmlnaHRDaGlsZChjdXJyZW50Tm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChnZXRHcmFuZFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoZ2V0R3JhbmRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIGp1c3QgbGlrZSBjbGF1c2UgYWJvdmUsIGV4Y2VwdCBzd2FwIGxlZnQgZm9yIHJpZ2h0Ci0gICAgICAgICAgICAgICAgTm9kZSB5ID0gZ2V0TGVmdENoaWxkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmIChpc1JlZCh5LCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayh5LCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VSZWQoZ2V0R3JhbmRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZ2V0R3JhbmRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNMZWZ0Q2hpbGQoY3VycmVudE5vZGUsIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoY3VycmVudE5vZGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0R3JhbmRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGdldEdyYW5kUGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1ha2VCbGFjayhyb290Tm9kZVtpbmRleF0sIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb21wbGljYXRlZCByZWQtYmxhY2sgZGVsZXRlIHN0dWZmLiBCYXNlZCBvbiBTdW4ncyBUcmVlTWFwCi0gICAgICogaW1wbGVtZW50YXRpb24sIHRob3VnaCBpdCdzIGJhcmVseSByZWNvZ25pemFibGUgYW55IG1vcmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWxldGVkTm9kZSB0aGUgbm9kZSB0byBiZSBkZWxldGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvUmVkQmxhY2tEZWxldGUoZmluYWwgTm9kZSBkZWxldGVkTm9kZSkgewotICAgICAgICBmb3IgKGludCBpbmRleCA9IEZJUlNUX0lOREVYOyBpbmRleCA8IE5VTUJFUl9PRl9JTkRJQ0VTOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAvLyBpZiBkZWxldGVkIG5vZGUgaGFzIGJvdGggbGVmdCBhbmQgY2hpbGRyZW4sIHN3YXAgd2l0aAotICAgICAgICAgICAgLy8gdGhlIG5leHQgZ3JlYXRlciBub2RlCi0gICAgICAgICAgICBpZiAoKGRlbGV0ZWROb2RlLmdldExlZnQoaW5kZXgpICE9IG51bGwpICYmIChkZWxldGVkTm9kZS5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBzd2FwUG9zaXRpb24obmV4dEdyZWF0ZXIoZGVsZXRlZE5vZGUsIGluZGV4KSwgZGVsZXRlZE5vZGUsIGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTm9kZSByZXBsYWNlbWVudCA9Ci0gICAgICAgICAgICAgICAgKChkZWxldGVkTm9kZS5nZXRMZWZ0KGluZGV4KSAhPSBudWxsKSA/IGRlbGV0ZWROb2RlLmdldExlZnQoaW5kZXgpIDogZGVsZXRlZE5vZGUuZ2V0UmlnaHQoaW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRQYXJlbnQoZGVsZXRlZE5vZGUuZ2V0UGFyZW50KGluZGV4KSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByb290Tm9kZVtpbmRleF0gPSByZXBsYWNlbWVudDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbGV0ZWROb2RlID09IGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlZE5vZGUuZ2V0UGFyZW50KGluZGV4KS5zZXRMZWZ0KHJlcGxhY2VtZW50LCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlZE5vZGUuZ2V0UGFyZW50KGluZGV4KS5zZXRSaWdodChyZXBsYWNlbWVudCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbGV0ZWROb2RlLnNldExlZnQobnVsbCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZWROb2RlLnNldFJpZ2h0KG51bGwsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5zZXRQYXJlbnQobnVsbCwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQmxhY2soZGVsZXRlZE5vZGUsIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrRGVsZXRlRml4dXAocmVwbGFjZW1lbnQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gcmVwbGFjZW1lbnQgaXMgbnVsbAotICAgICAgICAgICAgICAgIGlmIChkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSB0cmVlCi0gICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlW2luZGV4XSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVkIG5vZGUgaGFkIG5vIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0JsYWNrKGRlbGV0ZWROb2RlLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVkQmxhY2tEZWxldGVGaXh1cChkZWxldGVkTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWROb2RlID09IGRlbGV0ZWROb2RlLmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldExlZnQobnVsbCwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVkTm9kZS5nZXRQYXJlbnQoaW5kZXgpLnNldFJpZ2h0KG51bGwsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZE5vZGUuc2V0UGFyZW50KG51bGwsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzaHJpbmsoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb21wbGljYXRlZCByZWQtYmxhY2sgZGVsZXRlIHN0dWZmLiBCYXNlZCBvbiBTdW4ncyBUcmVlTWFwCi0gICAgICogaW1wbGVtZW50YXRpb24sIHRob3VnaCBpdCdzIGJhcmVseSByZWNvZ25pemFibGUgYW55IG1vcmUuIFRoaXMKLSAgICAgKiByZWJhbGFuY2VzIHRoZSB0cmVlIChzb21ld2hhdCwgYXMgcmVkLWJsYWNrIHRyZWVzIGFyZSBub3QKLSAgICAgKiBwZXJmZWN0bHkgYmFsYW5jZWQgLS0gcGVyZmVjdCBiYWxhbmNpbmcgdGFrZXMgbG9uZ2VyKQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcGxhY2VtZW50Tm9kZSB0aGUgbm9kZSBiZWluZyByZXBsYWNlZAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9SZWRCbGFja0RlbGV0ZUZpeHVwKGZpbmFsIE5vZGUgcmVwbGFjZW1lbnROb2RlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IHJlcGxhY2VtZW50Tm9kZTsKLQotICAgICAgICB3aGlsZSAoKGN1cnJlbnROb2RlICE9IHJvb3ROb2RlW2luZGV4XSkgJiYgKGlzQmxhY2soY3VycmVudE5vZGUsIGluZGV4KSkpIHsKLSAgICAgICAgICAgIGlmIChpc0xlZnRDaGlsZChjdXJyZW50Tm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBzaWJsaW5nTm9kZSA9IGdldFJpZ2h0Q2hpbGQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmIChpc1JlZChzaWJsaW5nTm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9IGdldFJpZ2h0Q2hpbGQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNCbGFjayhnZXRMZWZ0Q2hpbGQoc2libGluZ05vZGUsIGluZGV4KSwgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQmxhY2soZ2V0UmlnaHRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhY2soZ2V0UmlnaHRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRMZWZ0Q2hpbGQoc2libGluZ05vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoc2libGluZ05vZGUsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ05vZGUgPSBnZXRSaWdodENoaWxkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb3B5Q29sb3IoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIHNpYmxpbmdOb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UmlnaHRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHJvb3ROb2RlW2luZGV4XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE5vZGUgc2libGluZ05vZGUgPSBnZXRMZWZ0Q2hpbGQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmIChpc1JlZChzaWJsaW5nTm9kZSwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VCbGFjayhzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlUmVkKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2libGluZ05vZGUgPSBnZXRMZWZ0Q2hpbGQoZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNCbGFjayhnZXRSaWdodENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAmJiBpc0JsYWNrKGdldExlZnRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhY2soZ2V0TGVmdENoaWxkKHNpYmxpbmdOb2RlLCBpbmRleCksIGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldFJpZ2h0Q2hpbGQoc2libGluZ05vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlZChzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdChzaWJsaW5nTm9kZSwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9IGdldExlZnRDaGlsZChnZXRQYXJlbnQoY3VycmVudE5vZGUsIGluZGV4KSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29weUNvbG9yKGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBzaWJsaW5nTm9kZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBtYWtlQmxhY2soZ2V0UGFyZW50KGN1cnJlbnROb2RlLCBpbmRleCksIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUJsYWNrKGdldExlZnRDaGlsZChzaWJsaW5nTm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVJpZ2h0KGdldFBhcmVudChjdXJyZW50Tm9kZSwgaW5kZXgpLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSByb290Tm9kZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWFrZUJsYWNrKGN1cnJlbnROb2RlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3dhcCB0d28gbm9kZXMgKGV4Y2VwdCBmb3IgdGhlaXIgY29udGVudCksIHRha2luZyBjYXJlIG9mCi0gICAgICogc3BlY2lhbCBjYXNlcyB3aGVyZSBvbmUgaXMgdGhlIG90aGVyJ3MgcGFyZW50IC4uLiBoZXksIGl0Ci0gICAgICogaGFwcGVucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4IG9uZSBub2RlCi0gICAgICogQHBhcmFtIHkgYW5vdGhlciBub2RlCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzd2FwUG9zaXRpb24oZmluYWwgTm9kZSB4LCBmaW5hbCBOb2RlIHksIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAvLyBTYXZlIGluaXRpYWwgdmFsdWVzLgotICAgICAgICBOb2RlIHhGb3JtZXJQYXJlbnQgPSB4LmdldFBhcmVudChpbmRleCk7Ci0gICAgICAgIE5vZGUgeEZvcm1lckxlZnRDaGlsZCA9IHguZ2V0TGVmdChpbmRleCk7Ci0gICAgICAgIE5vZGUgeEZvcm1lclJpZ2h0Q2hpbGQgPSB4LmdldFJpZ2h0KGluZGV4KTsKLSAgICAgICAgTm9kZSB5Rm9ybWVyUGFyZW50ID0geS5nZXRQYXJlbnQoaW5kZXgpOwotICAgICAgICBOb2RlIHlGb3JtZXJMZWZ0Q2hpbGQgPSB5LmdldExlZnQoaW5kZXgpOwotICAgICAgICBOb2RlIHlGb3JtZXJSaWdodENoaWxkID0geS5nZXRSaWdodChpbmRleCk7Ci0gICAgICAgIGJvb2xlYW4geFdhc0xlZnRDaGlsZCA9ICh4LmdldFBhcmVudChpbmRleCkgIT0gbnVsbCkgJiYgKHggPT0geC5nZXRQYXJlbnQoaW5kZXgpLmdldExlZnQoaW5kZXgpKTsKLSAgICAgICAgYm9vbGVhbiB5V2FzTGVmdENoaWxkID0gKHkuZ2V0UGFyZW50KGluZGV4KSAhPSBudWxsKSAmJiAoeSA9PSB5LmdldFBhcmVudChpbmRleCkuZ2V0TGVmdChpbmRleCkpOwotCi0gICAgICAgIC8vIFN3YXAsIGhhbmRsaW5nIHNwZWNpYWwgY2FzZXMgb2Ygb25lIGJlaW5nIHRoZSBvdGhlcidzIHBhcmVudC4KLSAgICAgICAgaWYgKHggPT0geUZvcm1lclBhcmVudCkgeyAvLyB4IHdhcyB5J3MgcGFyZW50Ci0gICAgICAgICAgICB4LnNldFBhcmVudCh5LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh5V2FzTGVmdENoaWxkKSB7Ci0gICAgICAgICAgICAgICAgeS5zZXRMZWZ0KHgsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB5LnNldFJpZ2h0KHhGb3JtZXJSaWdodENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHkuc2V0UmlnaHQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHkuc2V0TGVmdCh4Rm9ybWVyTGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4LnNldFBhcmVudCh5Rm9ybWVyUGFyZW50LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh5Rm9ybWVyUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoeVdhc0xlZnRDaGlsZCkgewotICAgICAgICAgICAgICAgICAgICB5Rm9ybWVyUGFyZW50LnNldExlZnQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHlGb3JtZXJQYXJlbnQuc2V0UmlnaHQoeCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeS5zZXRMZWZ0KHhGb3JtZXJMZWZ0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgICAgIHkuc2V0UmlnaHQoeEZvcm1lclJpZ2h0Q2hpbGQsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh5ID09IHhGb3JtZXJQYXJlbnQpIHsgLy8geSB3YXMgeCdzIHBhcmVudAotICAgICAgICAgICAgeS5zZXRQYXJlbnQoeCwgaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAoeFdhc0xlZnRDaGlsZCkgewotICAgICAgICAgICAgICAgIHguc2V0TGVmdCh5LCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgeC5zZXRSaWdodCh5Rm9ybWVyUmlnaHRDaGlsZCwgaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4LnNldFJpZ2h0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB4LnNldExlZnQoeUZvcm1lckxlZnRDaGlsZCwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeS5zZXRQYXJlbnQoeEZvcm1lclBhcmVudCwgaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAoeEZvcm1lclBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHhXYXNMZWZ0Q2hpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgeEZvcm1lclBhcmVudC5zZXRMZWZ0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4Rm9ybWVyUGFyZW50LnNldFJpZ2h0KHksIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHguc2V0TGVmdCh5Rm9ybWVyTGVmdENoaWxkLCBpbmRleCk7Ci0gICAgICAgICAgICB4LnNldFJpZ2h0KHlGb3JtZXJSaWdodENoaWxkLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaXggY2hpbGRyZW4ncyBwYXJlbnQgcG9pbnRlcnMKLSAgICAgICAgaWYgKHguZ2V0TGVmdChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgeC5nZXRMZWZ0KGluZGV4KS5zZXRQYXJlbnQoeCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHguZ2V0UmlnaHQoaW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHguZ2V0UmlnaHQoaW5kZXgpLnNldFBhcmVudCh4LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeS5nZXRMZWZ0KGluZGV4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB5LmdldExlZnQoaW5kZXgpLnNldFBhcmVudCh5LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeS5nZXRSaWdodChpbmRleCkgIT0gbnVsbCkgewotICAgICAgICAgICAgeS5nZXRSaWdodChpbmRleCkuc2V0UGFyZW50KHksIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHguc3dhcENvbG9ycyh5LCBpbmRleCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgcm9vdCBjaGFuZ2VkCi0gICAgICAgIGlmIChyb290Tm9kZVtpbmRleF0gPT0geCkgewotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0geTsKLSAgICAgICAgfSBlbHNlIGlmIChyb290Tm9kZVtpbmRleF0gPT0geSkgewotICAgICAgICAgICAgcm9vdE5vZGVbaW5kZXhdID0geDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBmaXQgdG8gYmUgcHJvcGVyIGlucHV0IC4uLiBoYXMgdG8gYmUKLSAgICAgKiBDb21wYXJhYmxlIGFuZCBub24tbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIG8gdGhlIG9iamVjdCBiZWluZyBjaGVja2VkCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludCAodXNlZCB0byBwdXQgdGhlIHJpZ2h0IHdvcmQgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgIGV4Y2VwdGlvbiBtZXNzYWdlKQotICAgICAqCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBvIGlzIG5vdCBDb21wYXJhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja05vbk51bGxDb21wYXJhYmxlKGZpbmFsIE9iamVjdCBvLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKGRhdGFOYW1lW2luZGV4XSArICIgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29tcGFyYWJsZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oZGF0YU5hbWVbaW5kZXhdICsgIiBtdXN0IGJlIENvbXBhcmFibGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEga2V5IGZvciB2YWxpZGl0eSAobm9uLW51bGwgYW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBjaGVja2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtleSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYga2V5IGlzIG5vdCBDb21wYXJhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0tleShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoZWNrTm9uTnVsbENvbXBhcmFibGUoa2V5LCBLRVkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEgdmFsdWUgZm9yIHZhbGlkaXR5IChub24tbnVsbCBhbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlKQotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHZhbHVlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB2YWx1ZSBpcyBub3QgQ29tcGFyYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgY2hlY2tOb25OdWxsQ29tcGFyYWJsZSh2YWx1ZSwgVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGEga2V5IGFuZCBhIHZhbHVlIGZvciB2YWxpZGl0eSAobm9uLW51bGwgYW5kIGltcGxlbWVudHMKLSAgICAgKiBDb21wYXJhYmxlKQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IG9yIHZhbHVlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBrZXkgb3IgdmFsdWUgaXMgbm90IENvbXBhcmFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrS2V5QW5kVmFsdWUoZmluYWwgT2JqZWN0IGtleSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGNoZWNrS2V5KGtleSk7Ci0gICAgICAgIGNoZWNrVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGluY3JlbWVudCB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IC0tIHVzZWQgdG8gY2hlY2sgZm9yCi0gICAgICogY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlIG1hcCB0aHJvdWdoIHRoZSBtYXAgYW5kIHRocm91Z2gKLSAgICAgKiBhbiBJdGVyYXRvciBmcm9tIG9uZSBvZiBpdHMgU2V0IG9yIENvbGxlY3Rpb24gdmlld3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbW9kaWZ5KCkgewotICAgICAgICBtb2RpZmljYXRpb25zKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVtcCB1cCB0aGUgc2l6ZSBhbmQgbm90ZSB0aGF0IHRoZSBtYXAgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICAgICAgbW9kaWZ5KCk7Ci0gICAgICAgIG5vZGVDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRlY3JlbWVudCB0aGUgc2l6ZSBhbmQgbm90ZSB0aGF0IHRoZSBtYXAgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hyaW5rKCkgewotICAgICAgICBtb2RpZnkoKTsKLSAgICAgICAgbm9kZUNvdW50LS07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5zZXJ0IGEgbm9kZSBieSBpdHMgdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdOb2RlIHRoZSBub2RlIHRvIGJlIGluc2VydGVkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSB2YWx1ZSBtYXBwaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydFZhbHVlKGZpbmFsIE5vZGUgbmV3Tm9kZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHJvb3ROb2RlW1ZBTFVFXTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW50IGNtcCA9IGNvbXBhcmUobmV3Tm9kZS5nZXREYXRhKFZBTFVFKSwgbm9kZS5nZXREYXRhKFZBTFVFKSk7Ci0KLSAgICAgICAgICAgIGlmIChjbXAgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc3RvcmUgYSBkdXBsaWNhdGUgdmFsdWUgKFwiIiArIG5ld05vZGUuZ2V0RGF0YShWQUxVRSkgKyAiXCIpIGluIHRoaXMgTWFwIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRMZWZ0KFZBTFVFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldExlZnQoVkFMVUUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0TGVmdChuZXdOb2RlLCBWQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05vZGUuc2V0UGFyZW50KG5vZGUsIFZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgZG9SZWRCbGFja0luc2VydChuZXdOb2RlLCBWQUxVRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsgLy8gY21wID4gMAotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldFJpZ2h0KFZBTFVFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFJpZ2h0KFZBTFVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBub2RlLnNldFJpZ2h0KG5ld05vZGUsIFZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5zZXRQYXJlbnQobm9kZSwgVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBkb1JlZEJsYWNrSW5zZXJ0KG5ld05vZGUsIFZBTFVFKTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGZvciBlcXVhbHMgYXMgcGVyIHRoZSBBUEkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9FcXVhbHMoT2JqZWN0IG9iaiwgZmluYWwgaW50IHR5cGUpIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG90aGVyID0gKE1hcCkgb2JqOwotICAgICAgICBpZiAob3RoZXIuc2l6ZSgpICE9IHNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vZGVDb3VudCA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXBJdGVyYXRvciBpdCA9IG5ldyBWaWV3TWFwSXRlcmF0b3IodGhpcywgdHlwZSk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMob3RoZXIuZ2V0KGtleSkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbWFwIGFzIHBlciB0aGUgQVBJLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGRvSGFzaENvZGUoZmluYWwgaW50IHR5cGUpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgaWYgKG5vZGVDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoTWFwSXRlcmF0b3IgaXQgPSBuZXcgVmlld01hcEl0ZXJhdG9yKHRoaXMsIHR5cGUpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSAoa2V5Lmhhc2hDb2RlKCkgXiB2YWx1ZS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHN0cmluZyBmb3JtIG9mIHRoaXMgbWFwIGFzIHBlciBBYnN0cmFjdE1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBmb3JtIG9mIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZG9Ub1N0cmluZyhmaW5hbCBpbnQgdHlwZSkgewotICAgICAgICBpZiAobm9kZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAie30iOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG5vZGVDb3VudCAqIDMyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgneycpOwotICAgICAgICBNYXBJdGVyYXRvciBpdCA9IG5ldyBWaWV3TWFwSXRlcmF0b3IodGhpcywgdHlwZSk7Ci0gICAgICAgIGJvb2xlYW4gaGFzTmV4dCA9IGl0Lmhhc05leHQoKTsKLSAgICAgICAgd2hpbGUgKGhhc05leHQpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChrZXkgPT0gdGhpcyA/ICIodGhpcyBNYXApIiA6IGtleSkKLSAgICAgICAgICAgICAgIC5hcHBlbmQoJz0nKQotICAgICAgICAgICAgICAgLmFwcGVuZCh2YWx1ZSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDogdmFsdWUpOwotCi0gICAgICAgICAgICBoYXNOZXh0ID0gaXQuaGFzTmV4dCgpOwotICAgICAgICAgICAgaWYgKGhhc05leHQpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnVmLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEEgdmlldyBvZiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgVmlldyBleHRlbmRzIEFic3RyYWN0U2V0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcC4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFRyZWVCaWRpTWFwIG1haW47Ci0gICAgICAgIC8qKiBXaGV0aGVyIHRvIHJldHVybiBLRVkgb3IgVkFMVUUgb3JkZXIuICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgb3JkZXJUeXBlOwotICAgICAgICAvKiogV2hldGhlciB0byByZXR1cm4gS0VZLCBWQUxVRSwgTUFQRU5UUlkgb3IgSU5WRVJTRU1BUEVOVFJZIGRhdGEuICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgZGF0YVR5cGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFpbiAgdGhlIG1haW4gbWFwCi0gICAgICAgICAqIEBwYXJhbSBvcmRlclR5cGUgIHRoZSBLRVkgb3IgVkFMVUUgaW50IGZvciB0aGUgb3JkZXIKLSAgICAgICAgICogQHBhcmFtIGRhdGFUeXBlICB0aGUgS0VZLCBWQUxVRSwgTUFQRU5UUlkgb3IgSU5WRVJTRU1BUEVOVFJZIGludAotICAgICAgICAgKi8KLSAgICAgICAgVmlldyhmaW5hbCBUcmVlQmlkaU1hcCBtYWluLCBmaW5hbCBpbnQgb3JkZXJUeXBlLCBmaW5hbCBpbnQgZGF0YVR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLm1haW4gPSBtYWluOwotICAgICAgICAgICAgdGhpcy5vcmRlclR5cGUgPSBvcmRlclR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmlld0l0ZXJhdG9yKG1haW4sIG9yZGVyVHlwZSwgZGF0YVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgY2hlY2tOb25OdWxsQ29tcGFyYWJsZShvYmosIGRhdGFUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiAobWFpbi5sb29rdXAoKENvbXBhcmFibGUpIG9iaiwgZGF0YVR5cGUpICE9IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKGZpbmFsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiAobWFpbi5kb1JlbW92ZSgoQ29tcGFyYWJsZSkgb2JqLCBkYXRhVHlwZSkgIT0gbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1haW4uY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBbiBpdGVyYXRvciBvdmVyIHRoZSBtYXAuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFZpZXdJdGVyYXRvciBpbXBsZW1lbnRzIE9yZGVyZWRJdGVyYXRvciB7Ci0KLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwLiAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVHJlZUJpZGlNYXAgbWFpbjsKLSAgICAgICAgLyoqIFdoZXRoZXIgdG8gcmV0dXJuIEtFWSBvciBWQUxVRSBvcmRlci4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBvcmRlclR5cGU7Ci0gICAgICAgIC8qKiBXaGV0aGVyIHRvIHJldHVybiBLRVksIFZBTFVFLCBNQVBFTlRSWSBvciBJTlZFUlNFTUFQRU5UUlkgZGF0YS4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBkYXRhVHlwZTsKLSAgICAgICAgLyoqIFRoZSBsYXN0IG5vZGUgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiAqLwotICAgICAgICBwcm90ZWN0ZWQgTm9kZSBsYXN0UmV0dXJuZWROb2RlOwotICAgICAgICAvKiogVGhlIG5leHQgbm9kZSB0byBiZSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICovCi0gICAgICAgIHByb3RlY3RlZCBOb2RlIG5leHROb2RlOwotICAgICAgICAvKiogVGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNlcXVlbmNlIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gKi8KLSAgICAgICAgcHJvdGVjdGVkIE5vZGUgcHJldmlvdXNOb2RlOwotICAgICAgICAvKiogVGhlIG1vZGlmaWNhdGlvbiBjb3VudC4gKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RpZmljYXRpb25zOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1haW4gIHRoZSBtYWluIG1hcAotICAgICAgICAgKiBAcGFyYW0gb3JkZXJUeXBlICB0aGUgS0VZIG9yIFZBTFVFIGludCBmb3IgdGhlIG9yZGVyCi0gICAgICAgICAqIEBwYXJhbSBkYXRhVHlwZSAgdGhlIEtFWSwgVkFMVUUsIE1BUEVOVFJZIG9yIElOVkVSU0VNQVBFTlRSWSBpbnQKLSAgICAgICAgICovCi0gICAgICAgIFZpZXdJdGVyYXRvcihmaW5hbCBUcmVlQmlkaU1hcCBtYWluLCBmaW5hbCBpbnQgb3JkZXJUeXBlLCBmaW5hbCBpbnQgZGF0YVR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLm1haW4gPSBtYWluOwotICAgICAgICAgICAgdGhpcy5vcmRlclR5cGUgPSBvcmRlclR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZGlmaWNhdGlvbnMgPSBtYWluLm1vZGlmaWNhdGlvbnM7Ci0gICAgICAgICAgICBuZXh0Tm9kZSA9IGxlYXN0Tm9kZShtYWluLnJvb3ROb2RlW29yZGVyVHlwZV0sIG9yZGVyVHlwZSk7Ci0gICAgICAgICAgICBsYXN0UmV0dXJuZWROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIChuZXh0Tm9kZSAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGlmIChuZXh0Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYWluLm1vZGlmaWNhdGlvbnMgIT0gZXhwZWN0ZWRNb2RpZmljYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3RSZXR1cm5lZE5vZGUgPSBuZXh0Tm9kZTsKLSAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IG5leHROb2RlOwotICAgICAgICAgICAgbmV4dE5vZGUgPSBtYWluLm5leHRHcmVhdGVyKG5leHROb2RlLCBvcmRlclR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIGRvR2V0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzTm9kZSAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBpZiAocHJldmlvdXNOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1haW4ubW9kaWZpY2F0aW9ucyAhPSBleHBlY3RlZE1vZGlmaWNhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dE5vZGUgPSBsYXN0UmV0dXJuZWROb2RlOwotICAgICAgICAgICAgaWYgKG5leHROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG1haW4ubmV4dEdyZWF0ZXIocHJldmlvdXNOb2RlLCBvcmRlclR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGFzdFJldHVybmVkTm9kZSA9IHByZXZpb3VzTm9kZTsKLSAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IG1haW4ubmV4dFNtYWxsZXIocHJldmlvdXNOb2RlLCBvcmRlclR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIGRvR2V0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGRhdGEgdmFsdWUgZm9yIHRoZSBsYXN0UmV0dXJuZWROb2RlIGZpZWxkLgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0RGF0YSgpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEtFWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXR1cm5lZE5vZGUuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBWQUxVRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXR1cm5lZE5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIE1BUEVOVFJZOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJldHVybmVkTm9kZTsKLSAgICAgICAgICAgICAgICBjYXNlIElOVkVSU0VNQVBFTlRSWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVNYXBFbnRyeShsYXN0UmV0dXJuZWROb2RlLmdldFZhbHVlKCksIGxhc3RSZXR1cm5lZE5vZGUuZ2V0S2V5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdFJldHVybmVkTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1haW4ubW9kaWZpY2F0aW9ucyAhPSBleHBlY3RlZE1vZGlmaWNhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFpbi5kb1JlZEJsYWNrRGVsZXRlKGxhc3RSZXR1cm5lZE5vZGUpOwotICAgICAgICAgICAgZXhwZWN0ZWRNb2RpZmljYXRpb25zKys7Ci0gICAgICAgICAgICBsYXN0UmV0dXJuZWROb2RlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChuZXh0Tm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gVHJlZUJpZGlNYXAuZ3JlYXRlc3ROb2RlKG1haW4ucm9vdE5vZGVbb3JkZXJUeXBlXSwgb3JkZXJUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gbWFpbi5uZXh0U21hbGxlcihuZXh0Tm9kZSwgb3JkZXJUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBbiBpdGVyYXRvciBvdmVyIHRoZSBtYXAuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFZpZXdNYXBJdGVyYXRvciBleHRlbmRzIFZpZXdJdGVyYXRvciBpbXBsZW1lbnRzIE9yZGVyZWRNYXBJdGVyYXRvciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3Bwb3NpdGVUeXBlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFpbiAgdGhlIG1haW4gbWFwCi0gICAgICAgICAqIEBwYXJhbSBvcmRlclR5cGUgIHRoZSBLRVkgb3IgVkFMVUUgaW50IGZvciB0aGUgb3JkZXIKLSAgICAgICAgICovCi0gICAgICAgIFZpZXdNYXBJdGVyYXRvcihmaW5hbCBUcmVlQmlkaU1hcCBtYWluLCBmaW5hbCBpbnQgb3JkZXJUeXBlKSB7Ci0gICAgICAgICAgICBzdXBlcihtYWluLCBvcmRlclR5cGUsIG9yZGVyVHlwZSk7Ci0gICAgICAgICAgICB0aGlzLm9wcG9zaXRlVHlwZSA9IG9wcG9zaXRlSW5kZXgoZGF0YVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciBnZXRLZXkoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWROb2RlLmdldERhdGEoZGF0YVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciBnZXRWYWx1ZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBuZXh0KCkgYW5kIGJlZm9yZSByZW1vdmUoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXR1cm5lZE5vZGUuZ2V0RGF0YShvcHBvc2l0ZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBIHZpZXcgb2YgdGhpcyBtYXAuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIEVudHJ5VmlldyBleHRlbmRzIFZpZXcgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3Bwb3NpdGVUeXBlOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFpbiAgdGhlIG1haW4gbWFwCi0gICAgICAgICAqIEBwYXJhbSBvcmRlclR5cGUgIHRoZSBLRVkgb3IgVkFMVUUgaW50IGZvciB0aGUgb3JkZXIKLSAgICAgICAgICogQHBhcmFtIGRhdGFUeXBlICB0aGUgTUFQRU5UUlkgb3IgSU5WRVJTRU1BUEVOVFJZIGludCBmb3IgdGhlIHJldHVybmVkIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIEVudHJ5VmlldyhmaW5hbCBUcmVlQmlkaU1hcCBtYWluLCBmaW5hbCBpbnQgb3JkZXJUeXBlLCBmaW5hbCBpbnQgZGF0YVR5cGUpIHsKLSAgICAgICAgICAgIHN1cGVyKG1haW4sIG9yZGVyVHlwZSwgZGF0YVR5cGUpOwotICAgICAgICAgICAgdGhpcy5vcHBvc2l0ZVR5cGUgPSBUcmVlQmlkaU1hcC5vcHBvc2l0ZUluZGV4KG9yZGVyVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvYmo7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTm9kZSBub2RlID0gbWFpbi5sb29rdXAoKENvbXBhcmFibGUpIGVudHJ5LmdldEtleSgpLCBvcmRlclR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXREYXRhKG9wcG9zaXRlVHlwZSkuZXF1YWxzKHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBtYWluLmxvb2t1cCgoQ29tcGFyYWJsZSkgZW50cnkuZ2V0S2V5KCksIG9yZGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0RGF0YShvcHBvc2l0ZVR5cGUpLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBtYWluLmRvUmVkQmxhY2tEZWxldGUobm9kZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQSBub2RlIHVzZWQgdG8gc3RvcmUgdGhlIGRhdGEuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIE5vZGUgaW1wbGVtZW50cyBNYXAuRW50cnksIEtleVZhbHVlIHsKLQotICAgICAgICBwcml2YXRlIENvbXBhcmFibGVbXSBkYXRhOwotICAgICAgICBwcml2YXRlIE5vZGVbXSBsZWZ0Tm9kZTsKLSAgICAgICAgcHJpdmF0ZSBOb2RlW10gcmlnaHROb2RlOwotICAgICAgICBwcml2YXRlIE5vZGVbXSBwYXJlbnROb2RlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW5bXSBibGFja0NvbG9yOwotICAgICAgICBwcml2YXRlIGludCBoYXNoY29kZVZhbHVlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FsY3VsYXRlZEhhc2hDb2RlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNYWtlIGEgbmV3IGNlbGwgd2l0aCBnaXZlbiBrZXkgYW5kIHZhbHVlLCBhbmQgd2l0aCBudWxsCi0gICAgICAgICAqIGxpbmtzLCBhbmQgYmxhY2sgKHRydWUpIGNvbG9ycy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGtleQotICAgICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIE5vZGUoZmluYWwgQ29tcGFyYWJsZSBrZXksIGZpbmFsIENvbXBhcmFibGUgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICBkYXRhID0gbmV3IENvbXBhcmFibGVbXSB7IGtleSwgdmFsdWUgfTsKLSAgICAgICAgICAgIGxlZnROb2RlID0gbmV3IE5vZGVbMl07Ci0gICAgICAgICAgICByaWdodE5vZGUgPSBuZXcgTm9kZVsyXTsKLSAgICAgICAgICAgIHBhcmVudE5vZGUgPSBuZXcgTm9kZVsyXTsKLSAgICAgICAgICAgIGJsYWNrQ29sb3IgPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgdHJ1ZSB9OwotICAgICAgICAgICAgY2FsY3VsYXRlZEhhc2hDb2RlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBzcGVjaWZpZWQgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBrZXkgb3IgdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQ29tcGFyYWJsZSBnZXREYXRhKGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGFbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGlzIG5vZGUncyBsZWZ0IG5vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBub2RlICB0aGUgbmV3IGxlZnQgbm9kZQotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0TGVmdChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgbGVmdE5vZGVbaW5kZXhdID0gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIGxlZnQgbm9kZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBsZWZ0IG5vZGUsIG1heSBiZSBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE5vZGUgZ2V0TGVmdChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBsZWZ0Tm9kZVtpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoaXMgbm9kZSdzIHJpZ2h0IG5vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBub2RlICB0aGUgbmV3IHJpZ2h0IG5vZGUKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFJpZ2h0KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByaWdodE5vZGVbaW5kZXhdID0gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHJpZ2h0IG5vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgICAgICogQHJldHVybiB0aGUgcmlnaHQgbm9kZSwgbWF5IGJlIG51bGwKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTm9kZSBnZXRSaWdodChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiByaWdodE5vZGVbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGlzIG5vZGUncyBwYXJlbnQgbm9kZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5vZGUgIHRoZSBuZXcgcGFyZW50IG5vZGUKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFBhcmVudChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcGFyZW50Tm9kZVtpbmRleF0gPSBub2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcGFyZW50IG5vZGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIEtFWSBvciBWQUxVRSBpbnQKLSAgICAgICAgICogQHJldHVybiB0aGUgcGFyZW50IG5vZGUsIG1heSBiZSBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE5vZGUgZ2V0UGFyZW50KGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5vZGVbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEV4Y2hhbmdlIGNvbG9ycyB3aXRoIGFub3RoZXIgbm9kZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5vZGUgIHRoZSBub2RlIHRvIHN3YXAgd2l0aAotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc3dhcENvbG9ycyhmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgLy8gU3dhcCBjb2xvcnMgLS0gb2xkIGhhY2tlcidzIHRyaWNrCi0gICAgICAgICAgICBibGFja0NvbG9yW2luZGV4XSAgICAgIF49IG5vZGUuYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgICAgICBub2RlLmJsYWNrQ29sb3JbaW5kZXhdIF49IGJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICAgICAgYmxhY2tDb2xvcltpbmRleF0gICAgICBePSBub2RlLmJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoaXMgbm9kZSBibGFjaz8KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYmxhY2sgKHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgdHJ1ZSBib29sZWFuKQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmxhY2soZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSXMgdGhpcyBub2RlIHJlZD8KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4ICB0aGUgS0VZIG9yIFZBTFVFIGludAotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm9uLWJsYWNrCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWQoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gIWJsYWNrQ29sb3JbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1ha2UgdGhpcyBub2RlIGJsYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0QmxhY2soZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBibGFja0NvbG9yW2luZGV4XSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWFrZSB0aGlzIG5vZGUgcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0UmVkKGZpbmFsIGludCBpbmRleCkgewotICAgICAgICAgICAgYmxhY2tDb2xvcltpbmRleF0gPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNYWtlIHRoaXMgbm9kZSB0aGUgc2FtZSBjb2xvciBhcyBhbm90aGVyCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB3aG9zZSBjb2xvciB3ZSdyZSBhZG9wdGluZwotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBLRVkgb3IgVkFMVUUgaW50Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY29weUNvbG9yKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBibGFja0NvbG9yW2luZGV4XSA9IG5vZGUuYmxhY2tDb2xvcltpbmRleF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGtleS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW50cnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhW0tFWV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdmFsdWUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW50cnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGFbVkFMVUVdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9wdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaWdub3JlZAotICAgICAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybgotICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgaWdub3JlZCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJNYXAuRW50cnkuc2V0VmFsdWUgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBlbnRyeSBmb3IgZXF1YWxpdHkuCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFsc28gYSBtYXAgZW50cnkgYW5kCi0gICAgICAgICAqIHRoZSB0d28gZW50cmllcyByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIGVudHJ5LgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBlbnRyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIHJldHVybiBkYXRhW0tFWV0uZXF1YWxzKGUuZ2V0S2V5KCkpICYmIGRhdGFbVkFMVUVdLmVxdWFscyhlLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtYXAgZW50cnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgaWYgKCFjYWxjdWxhdGVkSGFzaENvZGUpIHsKLSAgICAgICAgICAgICAgICBoYXNoY29kZVZhbHVlID0gZGF0YVtLRVldLmhhc2hDb2RlKCkgXiBkYXRhW1ZBTFVFXS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIYXNoQ29kZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaGFzaGNvZGVWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQSBub2RlIHVzZWQgdG8gc3RvcmUgdGhlIGRhdGEuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIEludmVyc2UgaW1wbGVtZW50cyBPcmRlcmVkQmlkaU1hcCB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhcmVudCBtYXAuICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgVHJlZUJpZGlNYXAgbWFpbjsKLSAgICAgICAgLyoqIFN0b3JlIHRoZSBrZXlTZXQgb25jZSBjcmVhdGVkLiAqLwotICAgICAgICBwcml2YXRlIFNldCBrZXlTZXQ7Ci0gICAgICAgIC8qKiBTdG9yZSB0aGUgdmFsdWVzU2V0IG9uY2UgY3JlYXRlZC4gKi8KLSAgICAgICAgcHJpdmF0ZSBTZXQgdmFsdWVzU2V0OwotICAgICAgICAvKiogU3RvcmUgdGhlIGVudHJ5U2V0IG9uY2UgY3JlYXRlZC4gKi8KLSAgICAgICAgcHJpdmF0ZSBTZXQgZW50cnlTZXQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICAgICAqIEBwYXJhbSBtYWluICB0aGUgbWFpbiBtYXAKLSAgICAgICAgICovCi0gICAgICAgIEludmVyc2UoZmluYWwgVHJlZUJpZGlNYXAgbWFpbikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMubWFpbiA9IG1haW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbi5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uZ2V0S2V5KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBtYWluLmdldCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbi5jb250YWluc1ZhbHVlKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uY29udGFpbnNLZXkodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgICAgIGlmIChtYWluLm5vZGVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1hcCBpcyBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRyZWVCaWRpTWFwLmxlYXN0Tm9kZShtYWluLnJvb3ROb2RlW1ZBTFVFXSwgVkFMVUUpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgICAgICBpZiAobWFpbi5ub2RlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJNYXAgaXMgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUcmVlQmlkaU1hcC5ncmVhdGVzdE5vZGUobWFpbi5yb290Tm9kZVtWQUxVRV0sIFZBTFVFKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEtleShPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICBjaGVja0tleShrZXkpOwotICAgICAgICAgICAgTm9kZSBub2RlID0gbWFpbi5uZXh0R3JlYXRlcihtYWluLmxvb2t1cCgoQ29tcGFyYWJsZSkga2V5LCBWQUxVRSksIFZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybiAobm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIGNoZWNrS2V5KGtleSk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBtYWluLm5leHRTbWFsbGVyKG1haW4ubG9va3VwKChDb21wYXJhYmxlKSBrZXksIFZBTFVFKSwgVkFMVUUpOwotICAgICAgICAgICAgcmV0dXJuIChub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHV0KGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uZG9QdXQoKENvbXBhcmFibGUpIHZhbHVlLCAoQ29tcGFyYWJsZSkga2V5LCBWQUxVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbi5yZW1vdmVWYWx1ZShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCByZW1vdmVWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBtYWluLnJlbW92ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1haW4uY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICAgICAgaWYgKGtleVNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAga2V5U2V0ID0gbmV3IFZpZXcobWFpbiwgVkFMVUUsIFZBTFVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBrZXlTZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWVzU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZXNTZXQgPSBuZXcgVmlldyhtYWluLCBWQUxVRSwgS0VZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNTZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICAgICAgaWYgKGVudHJ5U2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5VmlldyhtYWluLCBWQUxVRSwgSU5WRVJTRU1BUEVOVFJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlbnRyeVNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eU9yZGVyZWRNYXBJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmlld01hcEl0ZXJhdG9yKG1haW4sIFZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPcmRlcmVkTWFwSXRlcmF0b3Igb3JkZXJlZE1hcEl0ZXJhdG9yKCkgewotICAgICAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eU9yZGVyZWRNYXBJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmlld01hcEl0ZXJhdG9yKG1haW4sIFZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCaWRpTWFwIGludmVyc2VCaWRpTWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1haW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPcmRlcmVkQmlkaU1hcCBpbnZlcnNlT3JkZXJlZEJpZGlNYXAoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBtYWluLmRvRXF1YWxzKG9iaiwgVkFMVUUpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbi5kb0hhc2hDb2RlKFZBTFVFKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1haW4uZG9Ub1N0cmluZyhWQUxVRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZUJpZGlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZUJpZGlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRhOGM5OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9Vbm1vZGlmaWFibGVCaWRpTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iaWRpbWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJpZGlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuVW5tb2RpZmlhYmxlRW50cnlTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5Vbm1vZGlmaWFibGVTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QmlkaU1hcDwvY29kZT4gdG8gZW5zdXJlIGl0IGNhbid0IGJlIGFsdGVyZWQuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVubW9kaWZpYWJsZUJpZGlNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEJpZGlNYXBEZWNvcmF0b3IgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUgewotICAgIAotICAgIC8qKiBUaGUgaW52ZXJzZSB1bm1vZGlmaWFibGUgbWFwICovCi0gICAgcHJpdmF0ZSBVbm1vZGlmaWFibGVCaWRpTWFwIGludmVyc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gdW5tb2RpZmlhYmxlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWFwIHBhc3NlZCBpbiBpcyBhbHJlYWR5IHVubW9kaWZpYWJsZSwgaXQgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIEJpZGlNYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmlkaU1hcCBkZWNvcmF0ZShCaWRpTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlQmlkaU1hcChtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZUJpZGlNYXAoQmlkaU1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcFRvQ29weSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBzdXBlci5lbnRyeVNldCgpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlRW50cnlTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IHN1cGVyLmtleVNldCgpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBzdXBlci52YWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUNvbGxlY3Rpb24uZGVjb3JhdGUoY29sbCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgTWFwSXRlcmF0b3IgaXQgPSBnZXRCaWRpTWFwKCkubWFwSXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yLmRlY29yYXRlKGl0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCgpIHsKLSAgICAgICAgaWYgKGludmVyc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaW52ZXJzZSA9IG5ldyBVbm1vZGlmaWFibGVCaWRpTWFwKGdldEJpZGlNYXAoKS5pbnZlcnNlQmlkaU1hcCgpKTsKLSAgICAgICAgICAgIGludmVyc2UuaW52ZXJzZSA9IHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludmVyc2U7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZU9yZGVyZWRCaWRpTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzZDBjNjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmlkaU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRCaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5Vbm1vZGlmaWFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlT3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuVW5tb2RpZmlhYmxlRW50cnlTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5Vbm1vZGlmaWFibGVTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+T3JkZXJlZEJpZGlNYXA8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVPcmRlcmVkQmlkaU1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0T3JkZXJlZEJpZGlNYXBEZWNvcmF0b3IgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUgewotICAgIAotICAgIC8qKiBUaGUgaW52ZXJzZSB1bm1vZGlmaWFibGUgbWFwICovCi0gICAgcHJpdmF0ZSBVbm1vZGlmaWFibGVPcmRlcmVkQmlkaU1hcCBpbnZlcnNlOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1hcCBwYXNzZWQgaW4gaXMgYWxyZWFkeSB1bm1vZGlmaWFibGUsIGl0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBPcmRlcmVkQmlkaU1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcmRlcmVkQmlkaU1hcCBkZWNvcmF0ZShPcmRlcmVkQmlkaU1hcCBtYXApIHsKLSAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIFVubW9kaWZpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU9yZGVyZWRCaWRpTWFwKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAoT3JkZXJlZEJpZGlNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXBUb0NvcHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gc3VwZXIuZW50cnlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUVudHJ5U2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBzdXBlci5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gc3VwZXIudmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVDb2xsZWN0aW9uLmRlY29yYXRlKGNvbGwpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZVZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwSXRlcmF0b3IgbWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBvcmRlcmVkTWFwSXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlkaU1hcCBpbnZlcnNlQmlkaU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGludmVyc2VPcmRlcmVkQmlkaU1hcCgpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIE9yZGVyZWRNYXBJdGVyYXRvciBpdCA9IGdldE9yZGVyZWRCaWRpTWFwKCkub3JkZXJlZE1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVPcmRlcmVkTWFwSXRlcmF0b3IuZGVjb3JhdGUoaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcmRlcmVkQmlkaU1hcCBpbnZlcnNlT3JkZXJlZEJpZGlNYXAoKSB7Ci0gICAgICAgIGlmIChpbnZlcnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGludmVyc2UgPSBuZXcgVW5tb2RpZmlhYmxlT3JkZXJlZEJpZGlNYXAoZ2V0T3JkZXJlZEJpZGlNYXAoKS5pbnZlcnNlT3JkZXJlZEJpZGlNYXAoKSk7Ci0gICAgICAgICAgICBpbnZlcnNlLmludmVyc2UgPSB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnZlcnNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2JpZGltYXAvVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzUwZmEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL1VubW9kaWZpYWJsZVNvcnRlZEJpZGlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJpZGltYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CaWRpTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZEJpZGlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuU29ydGVkQmlkaU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlVubW9kaWZpYWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVPcmRlcmVkTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5Vbm1vZGlmaWFibGVFbnRyeVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLlVubW9kaWZpYWJsZVNvcnRlZE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRCaWRpTWFwPC9jb2RlPiB0byBlbnN1cmUgaXQgY2FuJ3QgYmUgYWx0ZXJlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0U29ydGVkQmlkaU1hcERlY29yYXRvciBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBpbnZlcnNlIHVubW9kaWZpYWJsZSBtYXAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZVNvcnRlZEJpZGlNYXAgaW52ZXJzZTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtYXAgcGFzc2VkIGluIGlzIGFscmVhZHkgdW5tb2RpZmlhYmxlLCBpdCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgU29ydGVkQmlkaU1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRCaWRpTWFwIGRlY29yYXRlKFNvcnRlZEJpZGlNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVTb3J0ZWRCaWRpTWFwKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlU29ydGVkQmlkaU1hcChTb3J0ZWRCaWRpTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwVG9Db3B5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IHN1cGVyLmVudHJ5U2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVFbnRyeVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gc3VwZXIua2V5U2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbCA9IHN1cGVyLnZhbHVlcygpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlQ29sbGVjdGlvbi5kZWNvcmF0ZShjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCByZW1vdmVWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gb3JkZXJlZE1hcEl0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZGlNYXAgaW52ZXJzZUJpZGlNYXAoKSB7Ci0gICAgICAgIHJldHVybiBpbnZlcnNlU29ydGVkQmlkaU1hcCgpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9yZGVyZWRNYXBJdGVyYXRvciBvcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIE9yZGVyZWRNYXBJdGVyYXRvciBpdCA9IGdldFNvcnRlZEJpZGlNYXAoKS5vcmRlcmVkTWFwSXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZU9yZGVyZWRNYXBJdGVyYXRvci5kZWNvcmF0ZShpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9yZGVyZWRCaWRpTWFwIGludmVyc2VPcmRlcmVkQmlkaU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGludmVyc2VTb3J0ZWRCaWRpTWFwKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTb3J0ZWRCaWRpTWFwIGludmVyc2VTb3J0ZWRCaWRpTWFwKCkgewotICAgICAgICBpZiAoaW52ZXJzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnZlcnNlID0gbmV3IFVubW9kaWZpYWJsZVNvcnRlZEJpZGlNYXAoZ2V0U29ydGVkQmlkaU1hcCgpLmludmVyc2VTb3J0ZWRCaWRpTWFwKCkpOwotICAgICAgICAgICAgaW52ZXJzZS5pbnZlcnNlID0gdGhpczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52ZXJzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHN1Yk1hcChPYmplY3QgZnJvbUtleSwgT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBzbSA9IGdldFNvcnRlZEJpZGlNYXAoKS5zdWJNYXAoZnJvbUtleSwgdG9LZXkpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU29ydGVkTWFwLmRlY29yYXRlKHNtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIGhlYWRNYXAoT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBzbSA9IGdldFNvcnRlZEJpZGlNYXAoKS5oZWFkTWFwKHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNvcnRlZE1hcC5kZWNvcmF0ZShzbSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCB0YWlsTWFwKE9iamVjdCBmcm9tS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBzbSA9IGdldFNvcnRlZEJpZGlNYXAoKS50YWlsTWFwKGZyb21LZXkpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU29ydGVkTWFwLmRlY29yYXRlKHNtKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9iaWRpbWFwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTUxZWFkYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYmlkaW1hcC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzIgbXBhcmtlciBFeHAgJCAtLT4KLSA8IS0tCi0gICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxCT0RZPgotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZQote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CaWRpTWFwIEJpZGlNYXB9LAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkQmlkaU1hcCBPcmRlcmVkQmlkaU1hcH0gYW5kIAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Tb3J0ZWRCaWRpTWFwIFNvcnRlZEJpZGlNYXB9IGludGVyZmFjZXMuCi1BIEJpZGlNYXAgaXMgYW4gZXh0ZW5zaW9uIHRvIE1hcCB0aGF0IGFsbG93cyBrZXlzIGFuZCB2YWx1ZXMgdG8gYmUgbG9va2VkIHVwIHdpdGggZXF1YWwgZWFzZS4KLU9uZSBleGFtcGxlIHVzYWdlIGlzIGEgc3lzdGVtIGNvbW11bmljYXRpbmcgdG8gYSBsZWdhY3kgZGF0YXNvdXJjZSB0aGF0IG11c3QgY29udmVydCBjb2RlcwotZnJvbSB0aGUgbmV3IGZvcm1hdCB0byB0aGUgb2xkIGZvcm1hdCBhbmQgdmljZSB2ZXJzYS4KLTxwPgotVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPkR1YWxIYXNoQmlkaU1hcCAtIHVzZXMgdHdvIEhhc2hNYXBzIHRvIGltcGxlbWVudCBCaWRpTWFwCi08bGk+RHVhbFRyZWVCaWRpTWFwIC0gdXNlcyB0d28gVHJlZU1hcHMgdG8gaW1wbGVtZW50IFNvcnRlZEJpZGlNYXAKLTxsaT5UcmVlQmlkaU1hcCAtIHJlZC1ibGFjayB0cmVlIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWRCaWRpTWFwCi08L3VsPgotPHA+Ci1UaGUgZm9sbG93aW5nIGRlY29yYXRvcnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPlVubW9kaWZpYWJsZSAtIGVuc3VyZXMgdGhlIG1hcCBjYW5ub3QgYmUgYWx0ZXJlZAotPCEtLQotPGxpPlN5bmNocm9uaXplZCAtIHN5bmNocm9uaXplcyBtZXRob2QgYWNjZXNzIGZvciBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMKLTxsaT5QcmVkaWNhdGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nIHRvIGEgcHJlZGljYXRlIGNhbiBiZSBhZGRlZAotPGxpPlR5cGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlIGNhbiBiZSBhZGRlZAotPGxpPlRyYW5zZm9ybWVkIC0gdHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgYWRkZWQKLTxsaT5GaXhlZFNpemUgLSBlbnN1cmVzIHRoYXQgdGhlIHNpemUgb2YgdGhlIG1hcCBjYW5ub3QgY2hhbmdlCi08bGk+TGF6eSAtIGNyZWF0ZXMgb2JqZWN0cyBpbiB0aGUgbWFwIG9uIGRlbWFuZAotPGxpPkxpc3RPcmRlcmVkIC0gZW5zdXJlcyB0aGF0IGluc2VydGlvbiBvcmRlciBpcyByZXRhaW5lZC0tPgotPC91bD4KLTwvcHJlPgotPC9CT0RZPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9BYnN0cmFjdEJ1ZmZlckRlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9BYnN0cmFjdEJ1ZmZlckRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjAyYzE3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQWJzdHJhY3RCdWZmZXJEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5BYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QnVmZmVyPC9jb2RlPiB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBidWZmZXIuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnVmZmVyRGVjb3JhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yIGltcGxlbWVudHMgQnVmZmVyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIG9ubHkgdXNlZCBpbiBkZXNlcmlhbGl6YXRpb24sIGRvIG5vdCB1c2Ugb3RoZXJ3aXNlLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEJ1ZmZlckRlY29yYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0QnVmZmVyRGVjb3JhdG9yKEJ1ZmZlciBidWZmZXIpIHsKLSAgICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBidWZmZXIgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBidWZmZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnVmZmVyIGdldEJ1ZmZlcigpIHsKLSAgICAgICAgcmV0dXJuIChCdWZmZXIpIGdldENvbGxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLnJlbW92ZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9CbG9ja2luZ0J1ZmZlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9CbG9ja2luZ0J1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2RlM2VkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQmxvY2tpbmdCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QnVmZmVyPC9jb2RlPiB0byBtYWtlIHtAbGluayAjZ2V0KCl9IGFuZAotICoge0BsaW5rICNyZW1vdmUoKX0gYmxvY2sgd2hlbiB0aGUgPGNvZGU+QnVmZmVyPC9jb2RlPiBpcyBlbXB0eS4KLSAqIDxwPgotICogSWYgZWl0aGVyIDxjb2RlPmdldDwvY29kZT4gb3IgPGNvZGU+cmVtb3ZlPC9jb2RlPiBpcyBjYWxsZWQgb24gYW4gZW1wdHkKLSAqIDxjb2RlPkJ1ZmZlcjwvY29kZT4sIHRoZSBjYWxsaW5nIHRocmVhZCB3YWl0cyBmb3Igbm90aWZpY2F0aW9uIHRoYXQKLSAqIGFuIDxjb2RlPmFkZDwvY29kZT4gb3IgPGNvZGU+YWRkQWxsPC9jb2RlPiBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KLSAqIDxwPgotICogV2hlbiBvbmUgb3IgbW9yZSBlbnRyaWVzIGFyZSBhZGRlZCB0byBhbiBlbXB0eSA8Y29kZT5CdWZmZXI8L2NvZGU+LAotICogYWxsIHRocmVhZHMgYmxvY2tlZCBpbiA8Y29kZT5nZXQ8L2NvZGU+IG9yIDxjb2RlPnJlbW92ZTwvY29kZT4gYXJlIG5vdGlmaWVkLgotICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY29uY3VycmVudCBibG9ja2VkIDxjb2RlPmdldDwvY29kZT4gb3IKLSAqIDxjb2RlPnJlbW92ZTwvY29kZT4gcmVxdWVzdHMgd2lsbCBiZSAidW5ibG9ja2VkIiBhbmQgcmVjZWl2ZSBkYXRhIGluIHRoZQotICogb3JkZXIgdGhhdCB0aGV5IGFycml2ZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYW4gZXh0cmEgZmllbGQgaW4gMy4yLCBob3dldmVyIHRoZSBzZXJpYWxpemF0aW9uCi0gKiBzcGVjaWZpY2F0aW9uIHdpbGwgaGFuZGxlIHRoaXMgZ3JhY2VmdWxseS4KLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBKYW5layBCb2d1Y2tpCi0gKiBAYXV0aG9yIFBoaWwgU3RlaXR6Ci0gKiBAYXV0aG9yIEphbWVzIENhcm1hbgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NraW5nQnVmZmVyIGV4dGVuZHMgU3luY2hyb25pemVkQnVmZmVyIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTcxOTMyODkwNTAxNzg2MDU0MUw7Ci0gICAgLyoqIFRoZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgdGltZW91dDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGJsb2NraW5nIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgYmxvY2tpbmcgQnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmxvY2tpbmdCdWZmZXIoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBibG9ja2luZyBidWZmZXIgd2l0aCBhIHRpbWVvdXQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRpbWVvdXRNaWxsaXMgIHRoZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcywgemVybyBvciBsZXNzIGZvciBubyB0aW1lb3V0Ci0gICAgICogQHJldHVybiBhIG5ldyBibG9ja2luZyBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyLCBsb25nIHRpbWVvdXRNaWxsaXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCbG9ja2luZ0J1ZmZlcihidWZmZXIsIHRpbWVvdXRNaWxsaXMpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmxvY2tpbmdCdWZmZXIoQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICBzdXBlcihidWZmZXIpOwotICAgICAgICB0aGlzLnRpbWVvdXQgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0aW1lb3V0TWlsbGlzICB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMsIHplcm8gb3IgbGVzcyBmb3Igbm8gdGltZW91dAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgbnVsbAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHByb3RlY3RlZCBCbG9ja2luZ0J1ZmZlcihCdWZmZXIgYnVmZmVyLCBsb25nIHRpbWVvdXRNaWxsaXMpIHsKLSAgICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgICAgdGhpcy50aW1lb3V0ID0gKHRpbWVvdXRNaWxsaXMgPCAwID8gMCA6IHRpbWVvdXRNaWxsaXMpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGNvbGxlY3Rpb24uYWRkKG8pOwotICAgICAgICAgICAgbG9jay5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBjb2xsZWN0aW9uLmFkZEFsbChjKTsKLSAgICAgICAgICAgIGxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBidWZmZXIsIHdhaXRpbmcgdW50aWwgYW4gb2JqZWN0IGlzCi0gICAgICogYWRkZWQgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gVGhpcyBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCB0aW1lb3V0Ci0gICAgICogc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGlmIGFuIGludGVycnVwdCBpcyByZWNlaXZlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHdoaWxlIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud2FpdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oIkNhdXNlZCBieSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIG91dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIGJ1ZmZlciwgd2FpdGluZyB1bnRpbCBhbiBvYmplY3QgaXMKLSAgICAgKiBhZGRlZCBmb3IgdXAgdG8gdGhlIHNwZWNpZmllZCB0aW1lb3V0IHZhbHVlIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZW91dCAgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgYW4gaW50ZXJydXB0IGlzIHJlY2VpdmVkCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgdGhlIHRpbWVvdXQgZXhwaXJlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIGxvbmcgdGltZW91dCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLSAgICAgICAgICAgIGxvbmcgdGltZUxlZnQgPSBleHBpcmF0aW9uIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGltZUxlZnQgPiAwICYmIGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9jay53YWl0KHRpbWVMZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgdGltZUxlZnQgPSBleHBpcmF0aW9uIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCkpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCJDYXVzZWQgYnkgSW50ZXJydXB0ZWRFeGNlcHRpb246ICIgKyBvdXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiVGltZW91dCBleHBpcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIGJ1ZmZlciwgd2FpdGluZyB1bnRpbCBhbiBvYmplY3QgaXMKLSAgICAgKiBhZGRlZCBpZiB0aGUgYnVmZmVyIGlzIGVtcHR5LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IHRpbWVvdXQKLSAgICAgKiBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgYW4gaW50ZXJydXB0IGlzIHJlY2VpdmVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgd2hpbGUgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlKHRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2Uob3V0KTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiQ2F1c2VkIGJ5IEludGVycnVwdGVkRXhjZXB0aW9uOiAiICsgb3V0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgYnVmZmVyLCB3YWl0aW5nIHVudGlsIGFuIG9iamVjdCBpcwotICAgICAqIGFkZGVkIGZvciB1cCB0byB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgdmFsdWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lb3V0ICB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiBhbiBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiB0aGUgdGltZW91dCBleHBpcmVzCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgZmluYWwgbG9uZyBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotICAgICAgICAgICAgbG9uZyB0aW1lTGVmdCA9IGV4cGlyYXRpb24gLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0aW1lTGVmdCA+IDAgJiYgY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb2NrLndhaXQodGltZUxlZnQpOwotICAgICAgICAgICAgICAgICAgICB0aW1lTGVmdCA9IGV4cGlyYXRpb24gLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oIkNhdXNlZCBieSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIG91dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCJUaW1lb3V0IGV4cGlyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Cb3VuZGVkQnVmZmVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNiYzNmMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA1LTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJvdW5kZWRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJ1ZmZlcjwvY29kZT4gdG8gZW5zdXJlIGEgZml4ZWQgbWF4aW11bSBzaXplLgotICogPHA+Ci0gKiBOb3RlOiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IG5lZWQgdG8gYWRkIGJvdW5kZWQKLSAqIGJlaGF2aW91ciB0byBhbm90aGVyIGJ1ZmZlci4gSWYgeW91IGp1c3Qgd2FudCBhIGJvdW5kZWQgYnVmZmVyIHRoZW4KLSAqIHlvdSBzaG91bGQgdXNlIHtAbGluayBCb3VuZGVkRmlmb0J1ZmZlcn0gb3Ige0BsaW5rIENpcmN1bGFyRmlmb0J1ZmZlcn0uCi0gKiA8cD4KLSAqIFRoZSBkZWNvcmF0aW9uIG1ldGhvZHMgYWxsb3cgeW91IHRvIHNwZWNpZnkgYSB0aW1lb3V0IHZhbHVlLgotICogVGhpcyBhbHRlcnMgdGhlIGJlaGF2aW91ciBvZiB0aGUgYWRkIG1ldGhvZHMgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gKiBOb3JtYWxseSwgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHRoZSBhZGQgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogV2l0aCBhIHRpbWVvdXQsIHRoZSBhZGQgbWV0aG9kcyB3aWxsIHdhaXQgZm9yIHVwIHRvIHRoZSB0aW1lb3V0IHBlcmlvZAotICogdG8gdHJ5IGFuZCBhZGQgdGhlIGVsZW1lbnRzLgotICoKLSAqIEBhdXRob3IgSmFtZXMgQ2FybWFuCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAqLwotcHVibGljIGNsYXNzIEJvdW5kZWRCdWZmZXIgZXh0ZW5kcyBTeW5jaHJvbml6ZWRCdWZmZXIgaW1wbGVtZW50cyBCb3VuZGVkQ29sbGVjdGlvbiB7Ci0KLSAgICAvKiogVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNTM2NDMyOTExMDkzOTc0MjY0TDsKLQotICAgIC8qKiBUaGUgbWF4aW11bSBzaXplLiAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IG1heGltdW1TaXplOwotICAgIC8qKiBUaGUgdGltZW91dCBtaWxsaXNlY29uZHMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBib3VuZGVkIGJ1ZmZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoZSBidWZmZXIgaXMgZnVsbCwgaXQgd2lsbCBpbW1lZGlhdGVseSB0aHJvdyBhCi0gICAgICogPGNvZGU+QnVmZmVyT3ZlcmZsb3dFeGNlcHRpb248L2NvZGU+IG9uIGNhbGxpbmcgPGNvZGU+YWRkKCk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBtYXhpbXVtU2l6ZSAgdGhlIG1heGltdW0gc2l6ZSwgbXVzdCBiZSBzaXplIG9uZSBvciBncmVhdGVyCi0gICAgICogQHJldHVybiBhIG5ldyBib3VuZGVkIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXhpbXVtIHNpemUgaXMgemVybyBvciBsZXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb3VuZGVkQnVmZmVyIGRlY29yYXRlKEJ1ZmZlciBidWZmZXIsIGludCBtYXhpbXVtU2l6ZSkgewotICAgICAgICByZXR1cm4gbmV3IEJvdW5kZWRCdWZmZXIoYnVmZmVyLCBtYXhpbXVtU2l6ZSwgMEwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGJvdW5kZWQgYnVmZmVyIHRoYXQgYmxvY2tzIGZvciBhIG1heGltdW0KLSAgICAgKiBhbW91bnQgb2YgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgIHRoZSBidWZmZXIgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUgIHRoZSBtYXhpbXVtIHNpemUsIG11c3QgYmUgc2l6ZSBvbmUgb3IgZ3JlYXRlcgotICAgICAqIEBwYXJhbSB0aW1lb3V0ICB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcwotICAgICAqIEByZXR1cm4gYSBuZXcgYm91bmRlZCBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWF4aW11bSBzaXplIGlzIHplcm8gb3IgbGVzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm91bmRlZEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyLCBpbnQgbWF4aW11bVNpemUsIGxvbmcgdGltZW91dCkgewotICAgICAgICByZXR1cm4gbmV3IEJvdW5kZWRCdWZmZXIoYnVmZmVyLCBtYXhpbXVtU2l6ZSwgdGltZW91dCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpIGFub3RoZXIgYnVmZmVyLCBtYWtpbmcgaXQgYm91bmRlZAotICAgICAqIHdhaXRpbmcgb25seSB1cCB0byBhIG1heGltdW0gYW1vdW50IG9mIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIHdyYXAsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUgIHRoZSBtYXhpbXVtIHNpemUsIG11c3QgYmUgc2l6ZSBvbmUgb3IgZ3JlYXRlcgotICAgICAqIEBwYXJhbSB0aW1lb3V0ICB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1heGltdW0gc2l6ZSBpcyB6ZXJvIG9yIGxlc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQm91bmRlZEJ1ZmZlcihCdWZmZXIgYnVmZmVyLCBpbnQgbWF4aW11bVNpemUsIGxvbmcgdGltZW91dCkgewotICAgICAgICBzdXBlcihidWZmZXIpOwotICAgICAgICBpZiAobWF4aW11bVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tYXhpbXVtU2l6ZSA9IG1heGltdW1TaXplOwotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBnZXRCdWZmZXIoKS5yZW1vdmUoKTsKLSAgICAgICAgICAgIGxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICB0aW1lb3V0V2FpdCgxKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5hZGQobyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoZmluYWwgQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgdGltZW91dFdhaXQoYy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmFkZEFsbChjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOb3RpZnlpbmdJdGVyYXRvcihjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aW1lb3V0V2FpdChmaW5hbCBpbnQgbkFkZGl0aW9ucykgewotICAgICAgICAvLyBtZXRob2Qgc3luY2hyb25pemVkIGJ5IGNhbGxlcnMKLSAgICAgICAgaWYgKG5BZGRpdGlvbnMgPiBtYXhpbXVtU2l6ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIHNpemUgY2Fubm90IGV4Y2VlZCAiICsgbWF4aW11bVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKLSAgICAgICAgICAgIC8vIG5vIHdhaXQgcGVyaW9kIChpbW1lZGlhdGUgdGltZW91dCkKLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXIoKS5zaXplKCkgKyBuQWRkaXRpb25zID4gbWF4aW11bVNpemUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIHNpemUgY2Fubm90IGV4Y2VlZCAiICsgbWF4aW11bVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGxvbmcgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLSAgICAgICAgbG9uZyB0aW1lTGVmdCA9IGV4cGlyYXRpb24gLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKHRpbWVMZWZ0ID4gMCAmJiBnZXRCdWZmZXIoKS5zaXplKCkgKyBuQWRkaXRpb25zID4gbWF4aW11bVNpemUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9jay53YWl0KHRpbWVMZWZ0KTsKLSAgICAgICAgICAgICAgICB0aW1lTGVmdCA9IGV4cGlyYXRpb24gLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhdXNlZCBieSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIG91dC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0QnVmZmVyKCkuc2l6ZSgpICsgbkFkZGl0aW9ucyA+IG1heGltdW1TaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24oIlRpbWVvdXQgZXhwaXJlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgewotICAgICAgICAvLyBzaXplKCkgaXMgc3luY2hyb25pemVkCi0gICAgICAgIHJldHVybiAoc2l6ZSgpID09IG1heFNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtYXhTaXplKCkgewotICAgICAgICByZXR1cm4gbWF4aW11bVNpemU7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEJvdW5kZWRCdWZmZXIgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBOb3RpZnlpbmdJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3IgewotCi0gICAgICAgIHB1YmxpYyBOb3RpZnlpbmdJdGVyYXRvcihJdGVyYXRvciBpdCkgewotICAgICAgICAgICAgc3VwZXIoaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgbG9jay5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEZpZm9CdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQm91bmRlZEZpZm9CdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFmMjY1My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL0JvdW5kZWRGaWZvQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Cb3VuZGVkQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBCb3VuZGVkRmlmb0J1ZmZlciBpcyBhIHZlcnkgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mCi0gKiA8Y29kZT5CdWZmZXI8L2NvZGU+IHRoYXQgaXMgb2YgYSBmaXhlZCBzaXplLgotICogPHA+Ci0gKiBUaGUgcmVtb3ZhbCBvcmRlciBvZiBhIDxjb2RlPkJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPiBpcyBiYXNlZCBvbiB0aGUgCi0gKiBpbnNlcnRpb24gb3JkZXI7IGVsZW1lbnRzIGFyZSByZW1vdmVkIGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkKLSAqIHdlcmUgYWRkZWQuICBUaGUgaXRlcmF0aW9uIG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSByZW1vdmFsIG9yZGVyLgotICogPHA+Ci0gKiBUaGUge0BsaW5rICNhZGQoT2JqZWN0KX0sIHtAbGluayAjcmVtb3ZlKCl9IGFuZCB7QGxpbmsgI2dldCgpfSBvcGVyYXRpb25zCi0gKiBhbGwgcGVyZm9ybSBpbiBjb25zdGFudCB0aW1lLiAgQWxsIG90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybSBpbiBsaW5lYXIKLSAqIHRpbWUgb3Igd29yc2UuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuICBUaGUgZm9sbG93aW5nIGNhbiBiZQotICogdXNlZCB0byBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8geW91ciA8Y29kZT5Cb3VuZGVkRmlmb0J1ZmZlcjwvY29kZT46Ci0gKiA8cHJlPgotICogICBCdWZmZXIgZmlmbyA9IEJ1ZmZlclV0aWxzLnN5bmNocm9uaXplZEJ1ZmZlcihuZXcgQm91bmRlZEZpZm9CdWZmZXIoKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBidWZmZXIgcHJldmVudHMgbnVsbCBvYmplY3RzIGZyb20gYmVpbmcgYWRkZWQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wIChwcmV2aW91c2x5IGluIG1haW4gcGFja2FnZSB2Mi4xKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgQXZhbG9uCi0gKiBAYXV0aG9yIEJlcmluIExvcml0c2NoCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSGVydmUgUXVpcm96Ci0gKi8KLXB1YmxpYyBjbGFzcyBCb3VuZGVkRmlmb0J1ZmZlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgICAgICBpbXBsZW1lbnRzIEJ1ZmZlciwgQm91bmRlZENvbGxlY3Rpb24sIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTYwMzcyMjgxMTE4OTQ1MTAxN0w7Ci0KLSAgICAvKiogVW5kZXJseWluZyBzdG9yYWdlIGFycmF5ICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0W10gZWxlbWVudHM7Ci0gICAgCi0gICAgLyoqIEFycmF5IGluZGV4IG9mIGZpcnN0IChvbGRlc3QpIGJ1ZmZlciBlbGVtZW50ICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IHN0YXJ0ID0gMDsKLSAgICAKLSAgICAvKiogCi0gICAgICogSW5kZXggbW9kIG1heEVsZW1lbnRzIG9mIHRoZSBhcnJheSBwb3NpdGlvbiBmb2xsb3dpbmcgdGhlIGxhc3QgYnVmZmVyCi0gICAgICogZWxlbWVudC4gIEJ1ZmZlciBlbGVtZW50cyBzdGFydCBhdCBlbGVtZW50c1tzdGFydF0gYW5kICJ3cmFwIGFyb3VuZCIKLSAgICAgKiBlbGVtZW50c1ttYXhFbGVtZW50cy0xXSwgZW5kaW5nIGF0IGVsZW1lbnRzW2RlY3JlbWVudChlbmQpXS4gIAotICAgICAqIEZvciBleGFtcGxlLCBlbGVtZW50cyA9IHtjLGEsYn0sIHN0YXJ0PTEsIGVuZD0xIGNvcnJlc3BvbmRzIHRvIAotICAgICAqIHRoZSBidWZmZXIgW2EsYixjXS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgZW5kID0gMDsKLSAgICAKLSAgICAvKiogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgYnVmZmVyIGlzIGN1cnJlbnRseSBmdWxsLiAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gZnVsbCA9IGZhbHNlOwotICAgIAotICAgIC8qKiBDYXBhY2l0eSBvZiB0aGUgYnVmZmVyICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4RWxlbWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPiBiaWcgZW5vdWdoIHRvIGhvbGQKLSAgICAgKiAzMiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm91bmRlZEZpZm9CdWZmZXIoKSB7Ci0gICAgICAgIHRoaXMoMzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+Qm91bmRlZEZpZm9CdWZmZXI8L2NvZGU+IGJpZyBlbm91Z2ggdG8gaG9sZAotICAgICAqIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemUgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhpcyBmaWZvCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIGlmIHRoZSBzaXplIGlzIGxlc3MgdGhhbiAxCi0gICAgICovCi0gICAgcHVibGljIEJvdW5kZWRGaWZvQnVmZmVyKGludCBzaXplKSB7Ci0gICAgICAgIGlmIChzaXplIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50cyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gICAgICAgIG1heEVsZW1lbnRzID0gZWxlbWVudHMubGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+Qm91bmRlZEZpZm9CdWZmZXI8L2NvZGU+IGJpZyBlbm91Z2ggdG8gaG9sZCBhbGwKLSAgICAgKiBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBUaGF0IGNvbGxlY3Rpb24ncwotICAgICAqIGVsZW1lbnRzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIHRvIGFkZCwgbWF5IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEJvdW5kZWRGaWZvQnVmZmVyKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aGlzKGNvbGwuc2l6ZSgpKTsKLSAgICAgICAgYWRkQWxsKGNvbGwpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgYnVmZmVyIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZUludChzaXplKCkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGl0Lm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBidWZmZXIgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGVsZW1lbnRzID0gbmV3IE9iamVjdFttYXhFbGVtZW50c107Ci0gICAgICAgIGludCBzaXplID0gaW4ucmVhZEludCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICBmdWxsID0gKHNpemUgPT0gbWF4RWxlbWVudHMpOwotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgZW5kID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZCA9IHNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIGJ1ZmZlcidzIHNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLQotICAgICAgICBpZiAoZW5kIDwgc3RhcnQpIHsKLSAgICAgICAgICAgIHNpemUgPSBtYXhFbGVtZW50cyAtIHN0YXJ0ICsgZW5kOwotICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PSBzdGFydCkgewotICAgICAgICAgICAgc2l6ZSA9IChmdWxsID8gbWF4RWxlbWVudHMgOiAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemUgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBlbXB0eTsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbGxlY3Rpb24gaXMgZnVsbCBhbmQgbm8gbmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSBtYXhFbGVtZW50czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uICh0aGUgYm91bmQpLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhlIGNvbGxlY3Rpb24gY2FuIGhvbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtYXhFbGVtZW50czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoaXMgYnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBmdWxsID0gZmFsc2U7Ci0gICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgZW5kID0gMDsKLSAgICAgICAgQXJyYXlzLmZpbGwoZWxlbWVudHMsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAgdGhlIGVsZW1lbnQgdG8gYWRkCi0gICAgICogQHJldHVybiB0cnVlLCBhbHdheXMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBudWxsCi0gICAgICogQHRocm93cyBCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiAgaWYgdGhpcyBidWZmZXIgaXMgZnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkF0dGVtcHRlZCB0byBhZGQgbnVsbCBvYmplY3QgdG8gYnVmZmVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCJUaGUgYnVmZmVyIGNhbm5vdCBob2xkIG1vcmUgdGhhbiAiICsgbWF4RWxlbWVudHMgKyAiIG9iamVjdHMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtZW50c1tlbmQrK10gPSBlbGVtZW50OwotCi0gICAgICAgIGlmIChlbmQgPj0gbWF4RWxlbWVudHMpIHsKLSAgICAgICAgICAgIGVuZCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5kID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICBmdWxsID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxlYXN0IHJlY2VudGx5IGluc2VydGVkIGVsZW1lbnQgaW4gdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWxlbWVudHNbc3RhcnRdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGxlYXN0IHJlY2VudGx5IGluc2VydGVkIGVsZW1lbnQgZnJvbSB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxlYXN0IHJlY2VudGx5IGluc2VydGVkIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiAgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCJUaGUgYnVmZmVyIGlzIGFscmVhZHkgZW1wdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbc3RhcnRdOwotCi0gICAgICAgIGlmIChudWxsICE9IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGVsZW1lbnRzW3N0YXJ0KytdID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0ID49IG1heEVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmdWxsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBpbnRlcm5hbCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBpbmNyZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW5jcmVtZW50KGludCBpbmRleCkgewotICAgICAgICBpbmRleCsrOyAKLSAgICAgICAgaWYgKGluZGV4ID49IG1heEVsZW1lbnRzKSB7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY3JlbWVudHMgdGhlIGludGVybmFsIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGRlY3JlbWVudAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgaW5kZXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkZWNyZW1lbnQoaW50IGluZGV4KSB7Ci0gICAgICAgIGluZGV4LS07Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gbWF4RWxlbWVudHMgLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBidWZmZXIncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGJ1ZmZlcidzIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IHN0YXJ0OwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpcnN0ID0gZnVsbDsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNGaXJzdCB8fCAoaW5kZXggIT0gZW5kKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIGluZGV4ID0gaW5jcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudHNbbGFzdFJldHVybmVkSW5kZXhdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaXJzdCBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHF1aWNrbHkKLSAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPT0gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgQm91bmRlZEZpZm9CdWZmZXIudGhpcy5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBwb3MgPSBsYXN0UmV0dXJuZWRJbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbGFzdFJldHVybmVkSW5kZXggJiYgcG9zIDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IGluIG9uZSBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIHBvcywgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXgsIGVuZCAtIHBvcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgZWxlbWVudHMgcmVxdWlyZSB1cyB0byBzaGlmdCB0aGUgc3Vic2VxdWVudCBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9zICE9IGVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBtYXhFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzW3BvcyAtIDFdID0gZWxlbWVudHNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbZGVjcmVtZW50KHBvcyldID0gZWxlbWVudHNbcG9zXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBpbmNyZW1lbnQocG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgZW5kID0gZGVjcmVtZW50KGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudHNbZW5kXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGluZGV4ID0gZGVjcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9DaXJjdWxhckZpZm9CdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvQ2lyY3VsYXJGaWZvQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4NmE2NzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9DaXJjdWxhckZpZm9CdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKiAKLSAqIENpcmN1bGFyRmlmb0J1ZmZlciBpcyBhIGZpcnN0IGluIGZpcnN0IG91dCBidWZmZXIgd2l0aCBhIGZpeGVkIHNpemUgdGhhdAotICogcmVwbGFjZXMgaXRzIG9sZGVzdCBlbGVtZW50IGlmIGZ1bGwuCi0gKiA8cD4KLSAqIFRoZSByZW1vdmFsIG9yZGVyIG9mIGEgPGNvZGU+Q2lyY3VsYXJGaWZvQnVmZmVyPC9jb2RlPiBpcyBiYXNlZCBvbiB0aGUgCi0gKiBpbnNlcnRpb24gb3JkZXI7IGVsZW1lbnRzIGFyZSByZW1vdmVkIGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkKLSAqIHdlcmUgYWRkZWQuICBUaGUgaXRlcmF0aW9uIG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSByZW1vdmFsIG9yZGVyLgotICogPHA+Ci0gKiBUaGUge0BsaW5rICNhZGQoT2JqZWN0KX0sIHtAbGluayAjcmVtb3ZlKCl9IGFuZCB7QGxpbmsgI2dldCgpfSBvcGVyYXRpb25zCi0gKiBhbGwgcGVyZm9ybSBpbiBjb25zdGFudCB0aW1lLiAgQWxsIG90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybSBpbiBsaW5lYXIKLSAqIHRpbWUgb3Igd29yc2UuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuICBUaGUgZm9sbG93aW5nIGNhbiBiZQotICogdXNlZCB0byBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8geW91ciA8Y29kZT5DaXJjdWxhckZpZm9CdWZmZXI8L2NvZGU+OgotICogPHByZT4KLSAqICAgQnVmZmVyIGZpZm8gPSBCdWZmZXJVdGlscy5zeW5jaHJvbml6ZWRCdWZmZXIobmV3IENpcmN1bGFyRmlmb0J1ZmZlcigpKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGlzIGJ1ZmZlciBwcmV2ZW50cyBudWxsIG9iamVjdHMgZnJvbSBiZWluZyBhZGRlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVmYW5vIEZvcm5hcmkKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckZpZm9CdWZmZXIgZXh0ZW5kcyBCb3VuZGVkRmlmb0J1ZmZlciB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg0MjM0MTM4MzQ2NTc2MTA0MDZMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGEgYnVmZmVyIHdpdGggdGhlIGRlZmF1bHQgc2l6ZSBvZiAzMi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2lyY3VsYXJGaWZvQnVmZmVyKCkgewotICAgICAgICBzdXBlcigzMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGEgYnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBzaXplLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIChjYW5ub3QgYmUgY2hhbmdlZCkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2lyY3VsYXJGaWZvQnVmZmVyKGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLSAgICAgKiBUaGUgY29sbGVjdGlvbiBzaXplIGFsc28gc2V0cyB0aGUgYnVmZmVyIHNpemUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY29weSBpbnRvIHRoZSBidWZmZXIsIG1heSBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDaXJjdWxhckZpZm9CdWZmZXIoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHN1cGVyKGNvbGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIGxlYXN0IHJlY2VudGx5IGFkZGVkIGVsZW1lbnQgaXMgZGlzY2FyZGVkIHNvCi0gICAgICogdGhhdCBhIG5ldyBlbGVtZW50IGNhbiBiZSBpbnNlcnRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGFkZAotICAgICAqIEByZXR1cm4gdHJ1ZSwgYWx3YXlzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpc0Z1bGwoKSkgewotICAgICAgICAgICAgcmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1ByZWRpY2F0ZWRCdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJlZGljYXRlZEJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTJkODkwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJlZGljYXRlZEJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uUHJlZGljYXRlZENvbGxlY3Rpb247Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+QnVmZmVyPC9jb2RlPiB0byB2YWxpZGF0ZSB0aGF0IGFkZGl0aW9ucwotICogbWF0Y2ggYSBzcGVjaWZpZWQgcHJlZGljYXRlLgotICogPHA+Ci0gKiBUaGlzIGJ1ZmZlciBleGlzdHMgdG8gcHJvdmlkZSB2YWxpZGF0aW9uIGZvciB0aGUgZGVjb3JhdGVkIGJ1ZmZlci4KLSAqIEl0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgdG8gZGVjb3JhdGUgYW4gZW1wdHkgYnVmZmVyLgotICogSWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgYnVmZmVyLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICogPHA+Ci0gKiBPbmUgdXNhZ2Ugd291bGQgYmUgdG8gZW5zdXJlIHRoYXQgbm8gbnVsbCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgYnVmZmVyLgotICogPHByZT5CdWZmZXIgYnVmZmVyID0gUHJlZGljYXRlZEJ1ZmZlci5kZWNvcmF0ZShuZXcgVW5ib3VuZGVkRmlmb0J1ZmZlcigpLCBOb3ROdWxsUHJlZGljYXRlLklOU1RBTkNFKTs8L3ByZT4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIFByZWRpY2F0ZWRCdWZmZXIgZXh0ZW5kcyBQcmVkaWNhdGVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEJ1ZmZlciB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjMwNzYwOTAwMDUzOTk0MzU4MUw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBidWZmZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBidWZmZXIgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHZhbGlkYXRpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHByZWRpY2F0ZWQgQnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXIgZGVjb3JhdGUoQnVmZmVyIGJ1ZmZlciwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRCdWZmZXIoYnVmZmVyLCBwcmVkaWNhdGUpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlciwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcihidWZmZXIsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnVmZmVyIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYnVmZmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0gICAgICAgIHJldHVybiAoQnVmZmVyKSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5yZW1vdmUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvUHJpb3JpdHlCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWFlMjM1MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1ByaW9yaXR5QnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBCaW5hcnkgaGVhcCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5CdWZmZXI8L2NvZGU+IHRoYXQgcHJvdmlkZXMgZm9yCi0gKiByZW1vdmFsIGJhc2VkIG9uIDxjb2RlPkNvbXBhcmF0b3I8L2NvZGU+IG9yZGVyaW5nLgotICogPHA+Ci0gKiBUaGUgcmVtb3ZhbCBvcmRlciBvZiBhIGJpbmFyeSBoZWFwIGlzIGJhc2VkIG9uIGVpdGhlciB0aGUgbmF0dXJhbCBzb3J0Ci0gKiBvcmRlciBvZiBpdHMgZWxlbWVudHMgb3IgYSBzcGVjaWZpZWQge0BsaW5rIENvbXBhcmF0b3J9LiAgVGhlIAotICoge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGFzIGRldGVybWluZWQKLSAqIGJ5IHRoZSBzb3J0IG9yZGVyLiAgKFRoZSA8Y29kZT5hc2NlbmRpbmdPcmRlcjwvY29kZT4gZmxhZyBpbiB0aGUgY29uc3RydWN0b3JzCi0gKiBjYW4gYmUgdXNlZCB0byByZXZlcnNlIHRoZSBzb3J0IG9yZGVyLCBpbiB3aGljaCBjYXNlIHtAbGluayAjcmVtb3ZlKCl9Ci0gKiB3aWxsIGFsd2F5cyByZW1vdmUgdGhlIGxhc3QgZWxlbWVudC4pICBUaGUgcmVtb3ZhbCBvcmRlciBpcyAKLSAqIDxpPm5vdDwvaT4gdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIGl0ZXJhdGlvbjsgZWxlbWVudHMgYXJlCi0gKiByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLSAqIDxwPgotICogVGhlIHtAbGluayAjYWRkKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb25zIHBlcmZvcm0KLSAqIGluIGxvZ2FyaXRobWljIHRpbWUuICBUaGUge0BsaW5rICNnZXQoKX0gb3BlcmF0aW9uIHBlcmZvcm1zIGluIGNvbnN0YW50Ci0gKiB0aW1lLiAgQWxsIG90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybSBpbiBsaW5lYXIgdGltZSBvciB3b3JzZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4gIFVzZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyVXRpbHMjc3luY2hyb25pemVkQnVmZmVyKEJ1ZmZlcil9IG9yCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlci5TeW5jaHJvbml6ZWRCdWZmZXIjZGVjb3JhdGUoQnVmZmVyKX0KLSAqIHRvIHByb3ZpZGUgc3luY2hyb25pemVkIGFjY2VzcyB0byBhIDxjb2RlPlByaW9yaXR5QnVmZmVyPC9jb2RlPjoKLSAqIDxwcmU+Ci0gKiBCdWZmZXIgaGVhcCA9IFN5bmNocm9uaXplZEJ1ZmZlci5kZWNvcmF0ZShuZXcgUHJpb3JpdHlCdWZmZXIoKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAgKHByZXZpb3VzbHkgQmluYXJ5SGVhcCB2MS4wKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgRG9uYWxkCi0gKiBAYXV0aG9yIFJhbSBDaGlkYW1iYXJhbQotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgU3RldmUgUGhlbHBzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmlvcml0eUJ1ZmZlciBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbgotICAgICAgICBpbXBsZW1lbnRzIEJ1ZmZlciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIGxvY2suICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg5MTE4NjQ5MDQ3MDAyNzg5Nkw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBjYXBhY2l0eSBmb3IgdGhlIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDEzOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBlbGVtZW50cyBpbiB0aGlzIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZWxlbWVudHM7Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBjdXJyZW50bHkgaW4gdGhpcyBidWZmZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBzaXplOwotICAgIC8qKgotICAgICAqIElmIHRydWUsIHRoZSBmaXJzdCBlbGVtZW50IGFzIGRldGVybWluZWQgYnkgdGhlIHNvcnQgb3JkZXIgd2lsbCAKLSAgICAgKiBiZSByZXR1cm5lZC4gIElmIGZhbHNlLCB0aGUgbGFzdCBlbGVtZW50IGFzIGRldGVybWluZWQgYnkgdGhlCi0gICAgICogc29ydCBvcmRlciB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGFzY2VuZGluZ09yZGVyOwotICAgIC8qKgotICAgICAqIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3IgY29tcGFyYXRvcjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGJ1ZmZlciB0aGF0IHNvcnRzIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUKLSAgICAgKiBuYXR1cmFsIG9yZGVyIG9mIHRoZSBvYmplY3RzIGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBQcmlvcml0eUJ1ZmZlcigpIHsKLSAgICAgICAgdGhpcyhERUZBVUxUX0NBUEFDSVRZLCB0cnVlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGJ1ZmZlciB0aGF0IHNvcnRzIGluIGFzY2VuZGluZyBvcmRlciB1c2luZyB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgdGhlIGNvbXBhcmF0b3IgdXNlZCB0byBvcmRlciB0aGUgZWxlbWVudHMsCi0gICAgICogIG51bGwgbWVhbnMgdXNlIG5hdHVyYWwgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJpb3JpdHlCdWZmZXIoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIHRoaXMoREVGQVVMVF9DQVBBQ0lUWSwgdHJ1ZSwgY29tcGFyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBidWZmZXIgc3BlY2lmeWluZyB0aGUgc29ydCBvcmRlciBhbmQgdXNpbmcgdGhlCi0gICAgICogbmF0dXJhbCBvcmRlciBvZiB0aGUgb2JqZWN0cyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc2NlbmRpbmdPcmRlciAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIAotICAgICAqIG1pbmltdW0gaGVhcDsgb3RoZXJ3aXNlLCB0aGUgaGVhcCBpcyBjcmVhdGVkIGFzIGEgbWF4aW11bSBoZWFwCi0gICAgICovCi0gICAgcHVibGljIFByaW9yaXR5QnVmZmVyKGJvb2xlYW4gYXNjZW5kaW5nT3JkZXIpIHsKLSAgICAgICAgdGhpcyhERUZBVUxUX0NBUEFDSVRZLCBhc2NlbmRpbmdPcmRlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBidWZmZXIgc3BlY2lmeWluZyB0aGUgc29ydCBvcmRlciBhbmQgY29tcGFyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc2NlbmRpbmdPcmRlciAgdHJ1ZSB0byB1c2UgdGhlIG9yZGVyIGltcG9zZWQgYnkgdGhlIGdpdmVuIAotICAgICAqICAgY29tcGFyYXRvcjsgZmFsc2UgdG8gcmV2ZXJzZSB0aGF0IG9yZGVyCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzLAotICAgICAqICBudWxsIG1lYW5zIHVzZSBuYXR1cmFsIG9yZGVyCi0gICAgICovCi0gICAgcHVibGljIFByaW9yaXR5QnVmZmVyKGJvb2xlYW4gYXNjZW5kaW5nT3JkZXIsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFksIGFzY2VuZGluZ09yZGVyLCBjb21wYXJhdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGJ1ZmZlciB0aGF0IHNvcnRzIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUKLSAgICAgKiBuYXR1cmFsIG9yZGVyIG9mIHRoZSBvYmplY3RzIGFkZGVkLCBzcGVjaWZ5aW5nIGFuIGluaXRpYWwgY2FwYWNpdHkuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBidWZmZXIsIGdyZWF0ZXIgdGhhbiB6ZXJvCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzICZsdDs9IDxjb2RlPjA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFByaW9yaXR5QnVmZmVyKGludCBjYXBhY2l0eSkgewotICAgICAgICB0aGlzKGNhcGFjaXR5LCB0cnVlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGJ1ZmZlciB0aGF0IHNvcnRzIGluIGFzY2VuZGluZyBvcmRlciB1c2luZyB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvciBhbmQgaW5pdGlhbCBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBidWZmZXIsIGdyZWF0ZXIgdGhhbiB6ZXJvCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgIHRoZSBjb21wYXJhdG9yIHVzZWQgdG8gb3JkZXIgdGhlIGVsZW1lbnRzLAotICAgICAqICBudWxsIG1lYW5zIHVzZSBuYXR1cmFsIG9yZGVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+Y2FwYWNpdHk8L2NvZGU+IGlzICZsdDs9IDxjb2RlPjA8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFByaW9yaXR5QnVmZmVyKGludCBjYXBhY2l0eSwgQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIHRoaXMoY2FwYWNpdHksIHRydWUsIGNvbXBhcmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgYnVmZmVyIHRoYXQgc3BlY2lmeWluZyBpbml0aWFsIGNhcGFjaXR5IGFuZAotICAgICAqIHNvcnQgb3JkZXIsIHVzaW5nIHRoZSBuYXR1cmFsIG9yZGVyIG9mIHRoZSBvYmplY3RzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIGJ1ZmZlciwgZ3JlYXRlciB0aGFuIHplcm8KLSAgICAgKiBAcGFyYW0gYXNjZW5kaW5nT3JkZXIgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIAotICAgICAqICBtaW5pbXVtIGhlYXA7IG90aGVyd2lzZSwgdGhlIGhlYXAgaXMgY3JlYXRlZCBhcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5jYXBhY2l0eTwvY29kZT4gaXMgPGNvZGU+Jmx0Oz0gMDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJpb3JpdHlCdWZmZXIoaW50IGNhcGFjaXR5LCBib29sZWFuIGFzY2VuZGluZ09yZGVyKSB7Ci0gICAgICAgIHRoaXMoY2FwYWNpdHksIGFzY2VuZGluZ09yZGVyLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGJ1ZmZlciB0aGF0IHNwZWNpZnlpbmcgaW5pdGlhbCBjYXBhY2l0eSwKLSAgICAgKiBzb3J0IG9yZGVyIGFuZCBjb21wYXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIGJ1ZmZlciwgZ3JlYXRlciB0aGFuIHplcm8KLSAgICAgKiBAcGFyYW0gYXNjZW5kaW5nT3JkZXIgIHRydWUgdG8gdXNlIHRoZSBvcmRlciBpbXBvc2VkIGJ5IHRoZSBnaXZlbiAKLSAgICAgKiAgIGNvbXBhcmF0b3I7IGZhbHNlIHRvIHJldmVyc2UgdGhhdCBvcmRlcgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yICB0aGUgY29tcGFyYXRvciB1c2VkIHRvIG9yZGVyIHRoZSBlbGVtZW50cywKLSAgICAgKiAgbnVsbCBtZWFucyB1c2UgbmF0dXJhbCBvcmRlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmNhcGFjaXR5PC9jb2RlPiBpcyA8Y29kZT4mbHQ7PSAwPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBQcmlvcml0eUJ1ZmZlcihpbnQgY2FwYWNpdHksIGJvb2xlYW4gYXNjZW5kaW5nT3JkZXIsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoY2FwYWNpdHkgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjYXBhY2l0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuYXNjZW5kaW5nT3JkZXIgPSBhc2NlbmRpbmdPcmRlcjsKLQotICAgICAgICAvLysxIGFzIDAgaXMgbm9vcAotICAgICAgICB0aGlzLmVsZW1lbnRzID0gbmV3IE9iamVjdFtjYXBhY2l0eSArIDFdOwotICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgaGVhcCBpcyBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXNjZW5kaW5nIG9yZGVyIChhIG1pbiBoZWFwKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXNjZW5kaW5nT3JkZXIoKSB7Ci0gICAgICAgIHJldHVybiBhc2NlbmRpbmdPcmRlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29tcGFyYXRvciBiZWluZyB1c2VkIGZvciB0aGlzIGJ1ZmZlciwgbnVsbCBpcyBuYXR1cmFsIG9yZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbXBhcmF0b3IgaW4gdXNlLCBudWxsIGlzIG5hdHVyYWwgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gY29tcGFyYXRvcjsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJ1ZmZlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBidWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGVsZW1lbnRzID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGhdOyAvLyBmb3IgZ2MKLSAgICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBidWZmZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGVsZW1lbnQgYWRkZWQgd2lsbCBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJhdG9yIGluIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50ICB0aGUgZWxlbWVudCB0byBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGlzQXRDYXBhY2l0eSgpKSB7Ci0gICAgICAgICAgICBncm93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcGVyY29sYXRlIGVsZW1lbnQgdG8gaXQncyBwbGFjZSBpbiB0cmVlCi0gICAgICAgIGlmIChhc2NlbmRpbmdPcmRlcikgewotICAgICAgICAgICAgcGVyY29sYXRlVXBNaW5IZWFwKGVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGVyY29sYXRlVXBNYXhIZWFwKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5leHQgZWxlbWVudCB0byBiZSByZW1vdmVkIHdpdGhvdXQgYWN0dWFsbHkgcmVtb3ZpbmcgaXQgKHBlZWspLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50Ci0gICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudHNbMV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuZCByZW1vdmVzIHRoZSBuZXh0IGVsZW1lbnQgKHBvcCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoKSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQgPSBnZXQoKTsKLSAgICAgICAgZWxlbWVudHNbMV0gPSBlbGVtZW50c1tzaXplLS1dOwotCi0gICAgICAgIC8vIHNldCB0aGUgdW51c2VkIGVsZW1lbnQgdG8gJ251bGwnIHNvIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gICAgICAgIC8vIGNhbiBmcmVlIHRoZSBvYmplY3QgaWYgbm90IHVzZWQgYW55d2hlcmUgZWxzZS4ocmVtb3ZlIHJlZmVyZW5jZSkKLSAgICAgICAgZWxlbWVudHNbc2l6ZSArIDFdID0gbnVsbDsKLQotICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBwZXJjb2xhdGUgdG9wIGVsZW1lbnQgdG8gaXQncyBwbGFjZSBpbiB0cmVlCi0gICAgICAgICAgICBpZiAoYXNjZW5kaW5nT3JkZXIpIHsKLSAgICAgICAgICAgICAgICBwZXJjb2xhdGVEb3duTWluSGVhcCgxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVyY29sYXRlRG93bk1heEhlYXAoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBpZiB0aGUgYnVmZmVyIGlzIGF0IGNhcGFjaXR5LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBidWZmZXIgaXMgZnVsbDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F0Q2FwYWNpdHkoKSB7Ci0gICAgICAgIC8vKzEgYXMgZWxlbWVudCAwIGlzIG5vb3AKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA9PSBzaXplICsgMTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJjb2xhdGVzIGVsZW1lbnQgZG93biBoZWFwIGZyb20gdGhlIHBvc2l0aW9uIGdpdmVuIGJ5IHRoZSBpbmRleC4KLSAgICAgKiA8cD4KLSAgICAgKiBBc3N1bWVzIGl0IGlzIGEgbWluaW11bSBoZWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBmb3IgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJjb2xhdGVEb3duTWluSGVhcChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07Ci0gICAgICAgIGludCBob2xlID0gaW5kZXg7Ci0KLSAgICAgICAgd2hpbGUgKChob2xlICogMikgPD0gc2l6ZSkgewotICAgICAgICAgICAgaW50IGNoaWxkID0gaG9sZSAqIDI7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByaWdodCBjaGlsZCBhbmQgdGhhdCBjaGlsZCBjYW4gbm90IGJlIHBlcmNvbGF0ZWQKLSAgICAgICAgICAgIC8vIHVwIHRoZW4gbW92ZSBvbnRvIG90aGVyIGNoaWxkCi0gICAgICAgICAgICBpZiAoY2hpbGQgIT0gc2l6ZSAmJiBjb21wYXJlKGVsZW1lbnRzW2NoaWxkICsgMV0sIGVsZW1lbnRzW2NoaWxkXSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgcmVzdGluZyBwbGFjZSBvZiBidWJibGUgdGhlbiB0ZXJtaW5hdGUgc2VhcmNoCi0gICAgICAgICAgICBpZiAoY29tcGFyZShlbGVtZW50c1tjaGlsZF0sIGVsZW1lbnQpID49IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxlbWVudHNbaG9sZV0gPSBlbGVtZW50c1tjaGlsZF07Ci0gICAgICAgICAgICBob2xlID0gY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyY29sYXRlcyBlbGVtZW50IGRvd24gaGVhcCBmcm9tIHRoZSBwb3NpdGlvbiBnaXZlbiBieSB0aGUgaW5kZXguCi0gICAgICogPHA+Ci0gICAgICogQXNzdW1lcyBpdCBpcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJjb2xhdGVEb3duTWF4SGVhcChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07Ci0gICAgICAgIGludCBob2xlID0gaW5kZXg7Ci0KLSAgICAgICAgd2hpbGUgKChob2xlICogMikgPD0gc2l6ZSkgewotICAgICAgICAgICAgaW50IGNoaWxkID0gaG9sZSAqIDI7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByaWdodCBjaGlsZCBhbmQgdGhhdCBjaGlsZCBjYW4gbm90IGJlIHBlcmNvbGF0ZWQKLSAgICAgICAgICAgIC8vIHVwIHRoZW4gbW92ZSBvbnRvIG90aGVyIGNoaWxkCi0gICAgICAgICAgICBpZiAoY2hpbGQgIT0gc2l6ZSAmJiBjb21wYXJlKGVsZW1lbnRzW2NoaWxkICsgMV0sIGVsZW1lbnRzW2NoaWxkXSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgcmVzdGluZyBwbGFjZSBvZiBidWJibGUgdGhlbiB0ZXJtaW5hdGUgc2VhcmNoCi0gICAgICAgICAgICBpZiAoY29tcGFyZShlbGVtZW50c1tjaGlsZF0sIGVsZW1lbnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxlbWVudHNbaG9sZV0gPSBlbGVtZW50c1tjaGlsZF07Ci0gICAgICAgICAgICBob2xlID0gY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyY29sYXRlcyBlbGVtZW50IHVwIGhlYXAgZnJvbSB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgdGhlIGluZGV4LgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZXMgaXQgaXMgYSBtaW5pbXVtIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGJlIHBlcmNvbGF0ZWQgdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJjb2xhdGVVcE1pbkhlYXAoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIGludCBob2xlID0gaW5kZXg7Ci0gICAgICAgIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaG9sZV07Ci0gICAgICAgIHdoaWxlIChob2xlID4gMSAmJiBjb21wYXJlKGVsZW1lbnQsIGVsZW1lbnRzW2hvbGUgLyAyXSkgPCAwKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBwdXNoZWQgZG93bgotICAgICAgICAgICAgLy8gYXMgdGhlIGVsZW1lbnQgImJ1YmJsZSIgaXMgcGVyY29sYXRlZCB1cAotICAgICAgICAgICAgZmluYWwgaW50IG5leHQgPSBob2xlIC8gMjsKLSAgICAgICAgICAgIGVsZW1lbnRzW2hvbGVdID0gZWxlbWVudHNbbmV4dF07Ci0gICAgICAgICAgICBob2xlID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyY29sYXRlcyBhIG5ldyBlbGVtZW50IHVwIGhlYXAgZnJvbSB0aGUgYm90dG9tLgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZXMgaXQgaXMgYSBtaW5pbXVtIGhlYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWluSGVhcChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBlbGVtZW50c1srK3NpemVdID0gZWxlbWVudDsKLSAgICAgICAgcGVyY29sYXRlVXBNaW5IZWFwKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmNvbGF0ZXMgZWxlbWVudCB1cCBoZWFwIGZyb20gZnJvbSB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgdGhlIGluZGV4LgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZSBpdCBpcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGVyY29sYXRlZCB1cAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmNvbGF0ZVVwTWF4SGVhcChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50IGhvbGUgPSBpbmRleDsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tob2xlXTsKLQotICAgICAgICB3aGlsZSAoaG9sZSA+IDEgJiYgY29tcGFyZShlbGVtZW50LCBlbGVtZW50c1tob2xlIC8gMl0pID4gMCkgewotICAgICAgICAgICAgLy8gc2F2ZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcHVzaGVkIGRvd24KLSAgICAgICAgICAgIC8vIGFzIHRoZSBlbGVtZW50ICJidWJibGUiIGlzIHBlcmNvbGF0ZWQgdXAKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXh0ID0gaG9sZSAvIDI7Ci0gICAgICAgICAgICBlbGVtZW50c1tob2xlXSA9IGVsZW1lbnRzW25leHRdOwotICAgICAgICAgICAgaG9sZSA9IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtZW50c1tob2xlXSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyY29sYXRlcyBhIG5ldyBlbGVtZW50IHVwIGhlYXAgZnJvbSB0aGUgYm90dG9tLgotICAgICAqIDxwPgotICAgICAqIEFzc3VtZSBpdCBpcyBhIG1heGltdW0gaGVhcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyY29sYXRlVXBNYXhIZWFwKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGVsZW1lbnRzWysrc2l6ZV0gPSBlbGVtZW50OwotICAgICAgICBwZXJjb2xhdGVVcE1heEhlYXAoc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMgdXNpbmcgdGhlIGNvbXBhcmF0b3IgaWYgc3BlY2lmaWVkLCBvciB0aGUKLSAgICAgKiBuYXR1cmFsIG9yZGVyIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYSAgdGhlIGZpcnN0IG9iamVjdAotICAgICAqIEBwYXJhbSBiICB0aGUgc2Vjb25kIG9iamVjdAotICAgICAqIEByZXR1cm4gLXZlIGlmIGEgbGVzcyB0aGFuIGIsIDAgaWYgdGhleSBhcmUgZXF1YWwsICt2ZSBpZiBhIGdyZWF0ZXIgdGhhbiBiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotICAgICAgICBpZiAoY29tcGFyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGEsIGIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgYSkuY29tcGFyZVRvKGIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBoZWFwIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbGVtZW50cwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdyb3coKSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdFtdIGFycmF5ID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGggKiAyXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgYXJyYXksIDAsIGVsZW1lbnRzLmxlbmd0aCk7Ci0gICAgICAgIGVsZW1lbnRzID0gYXJyYXk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGhlYXAncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGhlYXAncyBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAxOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdFJldHVybmVkSW5kZXggPSAtMTsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPD0gc2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudHNbbGFzdFJldHVybmVkSW5kZXhdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxlbWVudHNbIGxhc3RSZXR1cm5lZEluZGV4IF0gPSBlbGVtZW50c1sgc2l6ZSBdOwotICAgICAgICAgICAgICAgIGVsZW1lbnRzWyBzaXplIF0gPSBudWxsOwotICAgICAgICAgICAgICAgIHNpemUtLTsgIAotICAgICAgICAgICAgICAgIGlmKCBzaXplICE9IDAgJiYgbGFzdFJldHVybmVkSW5kZXggPD0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyZVRvUGFyZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRvUGFyZW50ID0gY29tcGFyZShlbGVtZW50c1tsYXN0UmV0dXJuZWRJbmRleF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzW2xhc3RSZXR1cm5lZEluZGV4IC8gMl0pOyAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFzY2VuZGluZ09yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPiAxICYmIGNvbXBhcmVUb1BhcmVudCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjb2xhdGVVcE1pbkhlYXAobGFzdFJldHVybmVkSW5kZXgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY29sYXRlRG93bk1pbkhlYXAobGFzdFJldHVybmVkSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gbWF4IGhlYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA+IDEgJiYgY29tcGFyZVRvUGFyZW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNvbGF0ZVVwTWF4SGVhcChsYXN0UmV0dXJuZWRJbmRleCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjb2xhdGVEb3duTWF4SGVhcChsYXN0UmV0dXJuZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICAgICAgbGFzdFJldHVybmVkSW5kZXggPSAtMTsgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaGVhcC4gIFRoZSByZXR1cm5lZCBzdHJpbmcKLSAgICAgKiBpcyBzaW1pbGFyIHRvIHRob3NlIHByb2R1Y2VkIGJ5IHN0YW5kYXJkIEpESyBjb2xsZWN0aW9ucy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBoZWFwCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZCgiWyAiKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemUgKyAxOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpICE9IDEpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCIgXSIpOwotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9TeW5jaHJvbml6ZWRCdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvU3luY2hyb25pemVkQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1MjU1ZjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9TeW5jaHJvbml6ZWRCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJ1ZmZlcjwvY29kZT4gdG8gc3luY2hyb25pemUgaXRzIGJlaGF2aW91cgotICogZm9yIGEgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIHN5bmNocm9uaXplZCwgdGhlbiBmb3J3YXJkZWQgdG8gdGhlIGRlY29yYXRlZCBidWZmZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJ1ZmZlciBleHRlbmRzIFN5bmNocm9uaXplZENvbGxlY3Rpb24gaW1wbGVtZW50cyBCdWZmZXIgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODU5OTM2MTgzOTUzNjI2MjUzTDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHN5bmNocm9uaXplZCBidWZmZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgc3luY2hyb25pemVkIEJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJ1ZmZlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXIgZGVjb3JhdGUoQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZEJ1ZmZlcihidWZmZXIpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTeW5jaHJvbml6ZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICBzdXBlcihidWZmZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXIgIHRoZSBidWZmZXIgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gbG9jayAgdGhlIGxvY2sgb2JqZWN0IHRvIHVzZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTeW5jaHJvbml6ZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGxvY2spIHsKLSAgICAgICAgc3VwZXIoYnVmZmVyLCBsb2NrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBidWZmZXIgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBidWZmZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnVmZmVyIGdldEJ1ZmZlcigpIHsKLSAgICAgICAgcmV0dXJuIChCdWZmZXIpIGNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVHJhbnNmb3JtZWRCdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVHJhbnNmb3JtZWRCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTkwZDE4ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1RyYW5zZm9ybWVkQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlRyYW5zZm9ybWVkQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5CdWZmZXI8L2NvZGU+IHRvIHRyYW5zZm9ybSBvYmplY3RzIHRoYXQgYXJlIGFkZGVkLgotICogPHA+Ci0gKiBUaGUgYWRkIG1ldGhvZHMgYXJlIGFmZmVjdGVkIGJ5IHRoaXMgY2xhc3MuCi0gKiBUaHVzIG9iamVjdHMgbXVzdCBiZSByZW1vdmVkIG9yIHNlYXJjaGVkIGZvciB1c2luZyB0aGVpciB0cmFuc2Zvcm1lZCBmb3JtLgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb252ZXJ0cyBTdHJpbmdzIHRvIEludGVnZXJzLCB5b3UgbXVzdAotICogdXNlIHRoZSBJbnRlZ2VyIGZvcm0gdG8gcmVtb3ZlIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkQnVmZmVyIGV4dGVuZHMgVHJhbnNmb3JtZWRDb2xsZWN0aW9uIGltcGxlbWVudHMgQnVmZmVyIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzkwMTA5MTMxODk4NjEzMjAzM0w7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0cmFuc2Zvcm1pbmcgYnVmZmVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgYnVmZmVyIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZWQgQnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkQnVmZmVyKGJ1ZmZlciwgdHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBidWZmZXIgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciBjb252ZXJzaW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNmb3JtZWRCdWZmZXIoQnVmZmVyIGJ1ZmZlciwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgc3VwZXIoYnVmZmVyLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVjb3JhdGVkIGJ1ZmZlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgYnVmZmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0gICAgICAgIHJldHVybiAoQnVmZmVyKSBjb2xsZWN0aW9uOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkucmVtb3ZlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1R5cGVkQnVmZmVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1R5cGVkQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyMzI2OTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9UeXBlZEJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkJ1ZmZlcjwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBlbGVtZW50cyBhZGRlZAotICogYXJlIG9mIGEgc3BlY2lmaWMgdHlwZS4KLSAqIDxwPgotICogVGhlIHZhbGlkYXRpb24gb2YgYWRkaXRpb25zIGlzIHBlcmZvcm1lZCB2aWEgYW4gaW5zdGFuY2VvZiB0ZXN0IGFnYWluc3QgCi0gKiBhIHNwZWNpZmllZCA8Y29kZT5DbGFzczwvY29kZT4uIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlCi0gKiBjb2xsZWN0aW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZEJ1ZmZlciB7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0eXBlZCBsaXN0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgYnVmZmVyIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0eXBlICB0aGUgdHlwZSB0byBhbGxvdyBpbnRvIHRoZSBidWZmZXIsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHR5cGVkIEJ1ZmZlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJ1ZmZlciBvciB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyLCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZEJ1ZmZlcihidWZmZXIsIEluc3RhbmNlb2ZQcmVkaWNhdGUuZ2V0SW5zdGFuY2UodHlwZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGl2ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHlwZWRCdWZmZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvYnVmZmVyL1VuYm91bmRlZEZpZm9CdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5ib3VuZGVkRmlmb0J1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWJjNDhhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5ib3VuZGVkRmlmb0J1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYnVmZmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwotCi0vKioKLSAqIFVuYm91bmRlZEZpZm9CdWZmZXIgaXMgYSB2ZXJ5IGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZgotICogPGNvZGU+QnVmZmVyPC9jb2RlPiB0aGF0IGNhbiBncm93IHRvIGFueSBzaXplLgotICogQWNjb3JkaW5nIHRvIHBlcmZvcm1hbmNlIHRlc3RpbmcsIGl0IGV4aGliaXRzIGEgY29uc3RhbnQgYWNjZXNzIHRpbWUsIGJ1dCBpdAotICogYWxzbyBvdXRwZXJmb3JtcyBBcnJheUxpc3Qgd2hlbiB1c2VkIGZvciB0aGUgc2FtZSBwdXJwb3NlLgotICogPHA+Ci0gKiBUaGUgcmVtb3ZhbCBvcmRlciBvZiBhbiA8Y29kZT5VbmJvdW5kZWRGaWZvQnVmZmVyPC9jb2RlPiBpcyBiYXNlZCBvbiB0aGUgaW5zZXJ0aW9uCi0gKiBvcmRlcjsgZWxlbWVudHMgYXJlIHJlbW92ZWQgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLgotICogVGhlIGl0ZXJhdGlvbiBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgcmVtb3ZhbCBvcmRlci4KLSAqIDxwPgotICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IGFuZCB7QGxpbmsgI2dldCgpfSBvcGVyYXRpb25zIHBlcmZvcm0gaW4gY29uc3RhbnQgdGltZS4KLSAqIFRoZSB7QGxpbmsgI2FkZChPYmplY3QpfSBvcGVyYXRpb24gcGVyZm9ybXMgaW4gYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuICBBbGwKLSAqIG90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybSBpbiBsaW5lYXIgdGltZSBvciB3b3JzZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4gIFRoZSBmb2xsb3dpbmcgY2FuIGJlCi0gKiB1c2VkIHRvIHByb3ZpZGUgc3luY2hyb25pemVkIGFjY2VzcyB0byB5b3VyIDxjb2RlPlVuYm91bmRlZEZpZm9CdWZmZXI8L2NvZGU+OgotICogPHByZT4KLSAqICAgQnVmZmVyIGZpZm8gPSBCdWZmZXJVdGlscy5zeW5jaHJvbml6ZWRCdWZmZXIobmV3IFVuYm91bmRlZEZpZm9CdWZmZXIoKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBidWZmZXIgcHJldmVudHMgbnVsbCBvYmplY3RzIGZyb20gYmVpbmcgYWRkZWQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMCAocHJldmlvdXNseSBpbiBtYWluIHBhY2thZ2UgdjIuMSkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICoKLSAqIEBhdXRob3IgQXZhbG9uCi0gKiBAYXV0aG9yIEZlZGVyaWNvIEJhcmJpZXJpCi0gKiBAYXV0aG9yIEJlcmluIExvcml0c2NoCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgQW5kcmVhcyBTY2hsb3NzZXIKLSAqIEBhdXRob3IgVGhvbWFzIEtueWNoCi0gKiBAYXV0aG9yIEpvcmRhbiBLcmV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbmJvdW5kZWRGaWZvQnVmZmVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIGltcGxlbWVudHMgQnVmZmVyLCBTZXJpYWxpemFibGUgewotICAgIC8vIGludmFyaWFudDogYnVmZmVyLmxlbmd0aCA+IHNpemUoKQotICAgIC8vICAgaWUuYnVmZmVyIGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIGVtcHR5IGVudHJ5Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXNyaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM0ODI5NjAzMzY1Nzk1NDE0MTlMOwotCi0gICAgLyoqIFRoZSBhcnJheSBvZiBvYmplY3RzIGluIHRoZSBidWZmZXIuICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3RbXSBidWZmZXI7Ci0gICAgLyoqIFRoZSBjdXJyZW50IGhlYWQgaW5kZXguICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgaGVhZDsKLSAgICAvKiogVGhlIGN1cnJlbnQgdGFpbCBpbmRleC4gKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCB0YWlsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmJvdW5kZWRGaWZvQnVmZmVyIHdpdGggdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgICAqIEl0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nOgotICAgICAqCi0gICAgICogPHByZT4KLSAgICAgKiAgIG5ldyBVbmJvdW5kZWRGaWZvQnVmZmVyKDMyKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgVW5ib3VuZGVkRmlmb0J1ZmZlcigpIHsKLSAgICAgICAgdGhpcygzMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBVbmJvdW5kZWRGaWZvQnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICogVGhlIGludGVnZXIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxTaXplICB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5ib3VuZGVkRmlmb0J1ZmZlcihpbnQgaW5pdGlhbFNpemUpIHsKLSAgICAgICAgaWYgKGluaXRpYWxTaXplIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKLSAgICAgICAgfQotICAgICAgICBidWZmZXIgPSBuZXcgT2JqZWN0W2luaXRpYWxTaXplICsgMV07Ci0gICAgICAgIGhlYWQgPSAwOwotICAgICAgICB0YWlsID0gMDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGJ1ZmZlciBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVJbnQoc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChpdC5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgYnVmZmVyIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgYnVmZmVyID0gbmV3IE9iamVjdFtzaXplICsgMV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBidWZmZXJbaV0gPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVhZCA9IDA7Ci0gICAgICAgIHRhaWwgPSBzaXplOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBidWZmZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMgYnVmZmVyJ3Mgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotCi0gICAgICAgIGlmICh0YWlsIDwgaGVhZCkgewotICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci5sZW5ndGggLSBoZWFkICsgdGFpbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemUgPSB0YWlsIC0gaGVhZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1ZmZlciBpcyBlbXB0eTsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChzaXplKCkgPT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCB0byB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogIHRoZSBlbGVtZW50IHRvIGFkZAotICAgICAqIEByZXR1cm4gdHJ1ZSwgYWx3YXlzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBdHRlbXB0ZWQgdG8gYWRkIG51bGwgb2JqZWN0IHRvIGJ1ZmZlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemUoKSArIDEgPj0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgLy8gY29weSBjb250ZW50cyB0byBhIG5ldyBidWZmZXIgYXJyYXkKLSAgICAgICAgICAgIE9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbKChidWZmZXIubGVuZ3RoIC0gMSkgKiAyKSArIDFdOwotICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgLy8gbW92ZSBoZWFkIHRvIGVsZW1lbnQgemVybyBpbiB0aGUgbmV3IGFycmF5Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gaGVhZDsgaSAhPSB0YWlsOykgewotICAgICAgICAgICAgICAgIHRtcFtqXSA9IGJ1ZmZlcltpXTsKLSAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGkgPSBpbmNyZW1lbnQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIgPSB0bXA7Ci0gICAgICAgICAgICBoZWFkID0gMDsKLSAgICAgICAgICAgIHRhaWwgPSBqOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyW3RhaWxdID0gb2JqOwotICAgICAgICB0YWlsID0gaW5jcmVtZW50KHRhaWwpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uICBpZiB0aGlzIGJ1ZmZlciBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCJUaGUgYnVmZmVyIGlzIGFscmVhZHkgZW1wdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXJbaGVhZF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgYnVmZmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIG9iamVjdAotICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uICBpZiB0aGlzIGJ1ZmZlciBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uKCJUaGUgYnVmZmVyIGlzIGFscmVhZHkgZW1wdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBlbGVtZW50ID0gYnVmZmVyW2hlYWRdOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXJbaGVhZF0gPSBudWxsOwotICAgICAgICAgICAgaGVhZCA9IGluY3JlbWVudChoZWFkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBpbnRlcm5hbCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBpbmNyZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW5jcmVtZW50KGludCBpbmRleCkgewotICAgICAgICBpbmRleCsrOwotICAgICAgICBpZiAoaW5kZXggPj0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNyZW1lbnRzIHRoZSBpbnRlcm5hbCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBkZWNyZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGluZGV4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZGVjcmVtZW50KGludCBpbmRleCkgewotICAgICAgICBpbmRleC0tOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGJ1ZmZlci5sZW5ndGggLSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBidWZmZXIncyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGlzIGJ1ZmZlcidzIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCi0gICAgICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IGhlYWQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBsYXN0UmV0dXJuZWRJbmRleCA9IC0xOwotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPSB0YWlsOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIGluZGV4ID0gaW5jcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyW2xhc3RSZXR1cm5lZEluZGV4XTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCBxdWlja2x5Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEluZGV4ID09IGhlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgVW5ib3VuZGVkRmlmb0J1ZmZlci50aGlzLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0UmV0dXJuZWRJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gT3RoZXIgZWxlbWVudHMgcmVxdWlyZSB1cyB0byBzaGlmdCB0aGUgc3Vic2VxdWVudCBlbGVtZW50cwotICAgICAgICAgICAgICAgIGludCBpID0gaW5jcmVtZW50KGxhc3RSZXR1cm5lZEluZGV4KTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSAhPSB0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltkZWNyZW1lbnQoaSldID0gYnVmZmVyW2ldOwotICAgICAgICAgICAgICAgICAgICBpID0gaW5jcmVtZW50KGkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IGRlY3JlbWVudCh0YWlsKTsKLSAgICAgICAgICAgICAgICBidWZmZXJbdGFpbF0gPSBudWxsOwotICAgICAgICAgICAgICAgIGluZGV4ID0gZGVjcmVtZW50KGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Vbm1vZGlmaWFibGVCdWZmZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvVW5tb2RpZmlhYmxlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNGJjZDUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9Vbm1vZGlmaWFibGVCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5CdWZmZXI8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVCdWZmZXIKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlckRlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODMyOTQ4NjU2MjE1MzkzMzU3TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgYnVmZmVyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBidWZmZXIgcGFzc2VkIGluIGlzIGFscmVhZHkgdW5tb2RpZmlhYmxlLCBpdCBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyICB0aGUgYnVmZmVyIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgQnVmZmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYnVmZmVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlciBkZWNvcmF0ZShCdWZmZXIgYnVmZmVyKSB7Ci0gICAgICAgIGlmIChidWZmZXIgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVCdWZmZXIoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlciAgdGhlIGJ1ZmZlciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJ1ZmZlciBpcyBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBVbm1vZGlmaWFibGVCdWZmZXIoQnVmZmVyIGJ1ZmZlcikgewotICAgICAgICBzdXBlcihidWZmZXIpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgY29sbGVjdGlvbiBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QoY29sbGVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY29sbGVjdGlvbiBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbiAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUl0ZXJhdG9yLmRlY29yYXRlKGdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9idWZmZXIvcGFja2FnZS5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjZmIzMjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2J1ZmZlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzIgbXBhcmtlciBFeHAgJCAtLT4KLSA8IS0tCi0gICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxCT0RZPgotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZQote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CdWZmZXIgQnVmZmVyfSBpbnRlcmZhY2UuCi08cD4KLVRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgcGFja2FnZToKLTx1bD4KLTxsaT5Qcmlvcml0eUJ1ZmZlciAtIHByb3ZpZGVzIGZvciByZW1vdmFsIGJhc2VkIG9uIGEgY29tcGFyYXRvciBvcmRlcmluZwotPGxpPkJvdW5kZWRGaWZvQnVmZmVyIC0gaW1wbGVtZW50cyBhIGJ1ZmZlciB3aXRoIGEgZml4ZWQgc2l6ZSB0aGF0IHRocm93cyBleGNlcHRpb25zIHdoZW4gZnVsbAotPGxpPkNpcmN1bGFyRmlmb0J1ZmZlciAtIGltcGxlbWVudHMgYSBidWZmZXIgd2l0aCBhIGZpeGVkIHNpemUgdGhhdCBkaXNjYXJkcyBvbGRlc3Qgd2hlbiBmdWxsCi08bGk+VW5ib3VuZGVkRmlmb0J1ZmZlciAtIGltcGxlbWVudHMgYSBidWZmZXIgdGhhdCBncm93cyBpbiBzaXplIGlmIG5lY2Vzc2FyeQotPC91bD4KLTxwPgotVGhlIGZvbGxvd2luZyBkZWNvcmF0b3JzIGFyZSBwcm92aWRlZCBpbiB0aGUgcGFja2FnZToKLTx1bD4KLTxsaT5TeW5jaHJvbml6ZWQgLSBzeW5jaHJvbml6ZXMgbWV0aG9kIGFjY2VzcyBmb3IgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnRzCi08bGk+VW5tb2RpZmlhYmxlIC0gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBjYW5ub3QgYmUgYWx0ZXJlZAotPGxpPlByZWRpY2F0ZWQgLSBlbnN1cmVzIHRoYXQgb25seSBlbGVtZW50cyB0aGF0IGFyZSB2YWxpZCBhY2NvcmRpbmcgdG8gYSBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkCi08bGk+VHlwZWQgLSBlbnN1cmVzIHRoYXQgb25seSBlbGVtZW50cyB0aGF0IGFyZSBvZiBhIHNwZWNpZmljIHR5cGUgY2FuIGJlIGFkZGVkCi08bGk+VHJhbnNmb3JtZWQgLSB0cmFuc2Zvcm1zIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSBidWZmZXIKLTxsaT5CbG9ja2luZyAtIGJsb2NrcyBvbiBnZXQgYW5kIHJlbW92ZSB1bnRpbCBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZQotPC91bD4KLTwvcHJlPgotPC9CT0RZPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9BYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVlNjc3My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9BYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGJlaGF2aW91ci4KLSAqIDxwPgotICogRWFjaCBtZXRob2QgY2FsbCBtYWRlIG9uIHRoaXMgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gaXMgZm9yd2FyZGVkIHRvIHRoZQotICogZGVjb3JhdGVkIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+LiBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBmcmFtZXdvcmsgb24gd2hpY2gKLSAqIHRvIGJ1aWxkIHRvIGV4dGVuc2lvbnMgc3VjaCBhcyBzeW5jaHJvbml6ZWQgYW5kIHVubW9kaWZpYWJsZSBiZWhhdmlvdXIuIFRoZQotICogbWFpbiBhZHZhbnRhZ2Ugb2YgZGVjb3JhdGlvbiBpcyB0aGF0IG9uZSBkZWNvcmF0b3IgY2FuIHdyYXAgYW55IGltcGxlbWVudGF0aW9uCi0gKiBvZiA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiwgd2hlcmVhcyBzdWItY2xhc3NpbmcgcmVxdWlyZXMgYSBuZXcgY2xhc3MgdG8gYmUKLSAqIHdyaXR0ZW4gZm9yIGVhY2ggaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nIHdpdGgKLSAqIHtAbGluayAjaXRlcmF0b3IoKX0uIEluc3RlYWQgaXQgc2ltcGx5IHJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIAotICogd3JhcHBlZCBjb2xsZWN0aW9uLiBUaGlzIG1heSBiZSB1bmRlc2lyYWJsZSwgZm9yIGV4YW1wbGUgaWYgeW91IGFyZSB0cnlpbmcKLSAqIHRvIHdyaXRlIGFuIHVubW9kaWZpYWJsZSBpbXBsZW1lbnRhdGlvbiBpdCBtaWdodCBwcm92aWRlIGEgbG9vcGhvbGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50cyBDb2xsZWN0aW9uIHsKLQotICAgIC8qKiBUaGUgY29sbGVjdGlvbiBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcihDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29sbGVjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgY29sbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmFkZEFsbChjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgY29sbGVjdGlvbi5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29udGFpbnMob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZShvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29udGFpbnNBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5yZW1vdmVBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5lcXVhbHMob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9BYnN0cmFjdFNlcmlhbGl6YWJsZUNvbGxlY3Rpb25EZWNvcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0Fic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzZiMDRjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0Fic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBTZXJpYWxpemFibGUgc3ViY2xhc3Mgb2YgQWJzdHJhY3RDb2xsZWN0aW9uRGVjb3JhdG9yLgotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcmlhbGl6YWJsZUNvbGxlY3Rpb25EZWNvcmF0b3IKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNDk4ODgwNTk4MjIwODg1MDBMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvcihDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgc3VwZXIoY29sbCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBjb2xsZWN0aW9uIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjb2xsZWN0aW9uIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0NvbXBvc2l0ZUNvbGxlY3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL0NvbXBvc2l0ZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI3YWM5My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Db21wb3NpdGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkl0ZXJhdG9yQ2hhaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVW5tb2RpZmlhYmxlTGlzdDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYSBjb2xsZWN0aW9uIG9mIG90aGVyIGNvbGxlY3Rpb25zIHRvIHByb3ZpZGUgYSBzaW5nbGUgdW5pZmllZCB2aWV3LgotICogPHA+Ci0gKiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBjb2xsZWN0aW9uIHdpbGwgYWN0dWFsbHkgYmUgbWFkZSBvbiB0aGUgZGVjb3JhdGVkIGNvbGxlY3Rpb24uCi0gKiBBZGQgYW5kIHJlbW92ZSBvcGVyYXRpb25zIHJlcXVpcmUgdGhlIHVzZSBvZiBhIHBsdWdnYWJsZSBzdHJhdGVneS4gSWYgbm8gCi0gKiBzdHJhdGVneSBpcyBwcm92aWRlZCB0aGVuIGFkZCBhbmQgcmVtb3ZlIGFyZSB1bnN1cHBvcnRlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICoKLSAqIEBhdXRob3IgQnJpYW4gTWNDYWxsaXN0ZXIKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBoaWwgU3RlaXR6Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uIGltcGxlbWVudHMgQ29sbGVjdGlvbiB7Ci0gICAgCi0gICAgLyoqIENvbGxlY3Rpb25NdXRhdG9yIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBjb2xsZWN0aW9uICovCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb25NdXRhdG9yIG11dGF0b3I7Ci0gICAgCi0gICAgLyoqIENvbGxlY3Rpb25zIGluIHRoZSBjb21wb3NpdGUgKi8KLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbltdIGFsbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gZW1wdHkgQ29tcG9zaXRlQ29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5hbGwgPSBuZXcgQ29sbGVjdGlvblswXTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQ29tcG9zaXRlIENvbGxlY3Rpb24gd2l0aCBvbmx5IGNvbGwgY29tcG9zaXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgYSBjb2xsZWN0aW9uIHRvIGRlY29yYXRlCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5hZGRDb21wb3NpdGVkKGNvbGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBDb21wb3NpdGVDb2xsZWN0aW9uIHdpdGggY29sbHMgYXMgdGhlIGluaXRpYWwgbGlzdCBvZgotICAgICAqIGNvbXBvc2l0ZWQgY29sbGVjdGlvbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxzICBhbiBhcnJheSBvZiBjb2xsZWN0aW9ucyB0byBkZWNvcmF0ZQotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uKENvbGxlY3Rpb25bXSBjb2xscykgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuYWRkQ29tcG9zaXRlZChjb2xscyk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoaXMgY29tcG9zaXRlIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zaXplKCk8L2NvZGU+IG9uIGVhY2ggY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFsbCBjb250YWluZWQgY29udGFpbmVycwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5hbGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIHNpemUgKz0gdGhpcy5hbGxbaV0uc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIGlzIGVtcHR5LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+aXNFbXB0eSgpPC9jb2RlPiBvbiBlYWNoIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBjb250YWluZWQgY29sbGVjdGlvbnMgYXJlIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuYWxsLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5hbGxbaV0uaXNFbXB0eSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5jb250YWlucygpPC9jb2RlPiBvbiBlYWNoIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqIGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIGNvbnRhaW5lZCBjb2xsZWN0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmopIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuYWxsLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5hbGxbaV0uY29udGFpbnMob2JqKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgY29sbGVjdGlvbnMgaW4gdGhpcyBjb21wb3NpdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIDxjb2RlPkl0ZXJhdG9yQ2hhaW48L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5JdGVyYXRvckNoYWluPC9jb2RlPiBpbnN0YW5jZSB3aGljaCBzdXBwb3J0cwotICAgICAqICA8Y29kZT5yZW1vdmUoKTwvY29kZT4uIEl0ZXJhdGlvbiBvY2N1cnMgb3ZlciBjb250YWluZWQgY29sbGVjdGlvbnMgaW4KLSAgICAgKiAgdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCwgYnV0IHRoaXMgYmVoYXZpb3Igc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbi4KLSAgICAgKiBAc2VlIEl0ZXJhdG9yQ2hhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmICh0aGlzLmFsbC5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5SXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3JDaGFpbiBjaGFpbiA9IG5ldyBJdGVyYXRvckNoYWluKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbGwubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGNoYWluLmFkZEl0ZXJhdG9yKHRoaXMuYWxsW2ldLml0ZXJhdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFpbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbdGhpcy5zaXplKCldOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB0aGlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgYXJyYXksIHBvcHVsYXRpbmcgdGhlIHN1cHBsaWVkIGFycmF5IGlmIHBvc3NpYmxlLgotICAgICAqIFNlZSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBpbnRlcmZhY2UgZm9yIGZ1bGwgZGV0YWlscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IHRvIHVzZSwgcG9wdWxhdGluZyBpZiBwb3NzaWJsZQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIGludCBzaXplID0gdGhpcy5zaXplKCk7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChhcnJheS5sZW5ndGggPj0gc2l6ZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gYXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbGwubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB0aGlzLmFsbFtpXS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W29mZnNldCsrXSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJlc3VsdFtzaXplXSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbGxlY3Rpb24sIHRocm93aW5nIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogdW5sZXNzIGEgQ29sbGVjdGlvbk11dGF0b3Igc3RyYXRlZ3kgaXMgc3BlY2lmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gd2FzIG1vZGlmaWVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBDb2xsZWN0aW9uTXV0YXRvciBoYXNuJ3QgYmVlbiBzZXQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIGFkZCBpcyB1bnN1cHBvcnRlZAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIGR1ZSB0byBpdHMgdHlwZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBpdHMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMubXV0YXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgImFkZCgpIGlzIG5vdCBzdXBwb3J0ZWQgb24gQ29tcG9zaXRlQ29sbGVjdGlvbiB3aXRob3V0IGEgQ29sbGVjdGlvbk11dGF0b3Igc3RyYXRlZ3kiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5tdXRhdG9yLmFkZCh0aGlzLCB0aGlzLmFsbCwgb2JqKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBvYmplY3QgZnJvbSB0aGUgY29sbGVjdGlvbiwgdGhyb3dpbmcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiB1bmxlc3MgYSBDb2xsZWN0aW9uTXV0YXRvciBzdHJhdGVneSBpcyBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IGJlaW5nIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaXMgY2hhbmdlZAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgcmVtb3ZlZCBpcyB1bnN1cHBvcnRlZAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIHJlbW92ZWQgZHVlIHRvIGl0cyB0eXBlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2UgaXRzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSByZW1vdmVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMubXV0YXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAicmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZCBvbiBDb21wb3NpdGVDb2xsZWN0aW9uIHdpdGhvdXQgYSBDb2xsZWN0aW9uTXV0YXRvciBzdHJhdGVneSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLm11dGF0b3IucmVtb3ZlKHRoaXMsIHRoaXMuYWxsLCBvYmopOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbXBvc2l0ZSBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPmNvbnRhaW5zKCk8L2NvZGU+IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY2hlY2sgZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBlbGVtZW50cyBjb250YWluZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnMoaXQubmV4dCgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gdGhpcyBjb2xsZWN0aW9uLCB0aHJvd2luZwotICAgICAqIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVubGVzcyBhIENvbGxlY3Rpb25NdXRhdG9yIHN0cmF0ZWd5IGlzIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gd2FzIG1vZGlmaWVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBDb2xsZWN0aW9uTXV0YXRvciBoYXNuJ3QgYmVlbiBzZXQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIGFkZCBpcyB1bnN1cHBvcnRlZAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIGR1ZSB0byBpdHMgdHlwZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBpdHMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBpZiAodGhpcy5tdXRhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICJhZGRBbGwoKSBpcyBub3Qgc3VwcG9ydGVkIG9uIENvbXBvc2l0ZUNvbGxlY3Rpb24gd2l0aG91dCBhIENvbGxlY3Rpb25NdXRhdG9yIHN0cmF0ZWd5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMubXV0YXRvci5hZGRBbGwodGhpcywgdGhpcy5hbGwsIGNvbGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gZnJvbSB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+cmVtb3ZlQWxsPC9jb2RlPiBvbiBlYWNoIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIHdhcyBtb2RpZmllZAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgcmVtb3ZlQWxsIGlzIHVuc3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBpZiAoY29sbC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5hbGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGNoYW5nZWQgPSAodGhpcy5hbGxbaV0ucmVtb3ZlQWxsKGNvbGwpIHx8IGNoYW5nZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRhaW5zIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGluIHRoaXMgY29tcG9zaXRlIGNvbGxlY3Rpb24sCi0gICAgICogcmVtb3ZpbmcgYWxsIG90aGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnJldGFpbkFsbCgpPC9jb2RlPiBvbiBlYWNoIGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIHdhcyBtb2RpZmllZAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgcmV0YWluQWxsIGlzIHVuc3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKGZpbmFsIENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuYWxsLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBjaGFuZ2VkID0gKHRoaXMuYWxsW2ldLnJldGFpbkFsbChjb2xsKSB8fCBjaGFuZ2VkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBjb2xsZWN0aW9uIC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPmNsZWFyKCk8L2NvZGU+IG9uIGVhY2ggY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgY2xlYXIgaXMgdW5zdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFsbC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgdGhpcy5hbGxbaV0uY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSBhIENvbGxlY3Rpb25NdXRhdG9yIHN0cmF0ZWd5IGluc3RhbmNlIHRvIGhhbmRsZSBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG11dGF0b3IgIHRoZSBtdXRhdG9yIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE11dGF0b3IoQ29sbGVjdGlvbk11dGF0b3IgbXV0YXRvcikgewotICAgICAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhlc2UgQ29sbGVjdGlvbnMgdG8gdGhlIGxpc3Qgb2YgY29sbGVjdGlvbnMgaW4gdGhpcyBjb21wb3NpdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wcyBDb2xsZWN0aW9ucyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY29tcG9zaXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9zaXRlZChDb2xsZWN0aW9uW10gY29tcHMpIHsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodGhpcy5hbGwpKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wcykpOwotICAgICAgICBhbGwgPSAoQ29sbGVjdGlvbltdKSBsaXN0LnRvQXJyYXkobmV3IENvbGxlY3Rpb25bbGlzdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFkZGl0aW9uYWwgY29sbGVjdGlvbiB0byB0aGlzIGNvbXBvc2l0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyAgdGhlIGNvbGxlY3Rpb24gdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9zaXRlZChDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgdGhpcy5hZGRDb21wb3NpdGVkKG5ldyBDb2xsZWN0aW9uW117Y30pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdHdvIGFkZGl0aW9uYWwgY29sbGVjdGlvbnMgdG8gdGhpcyBjb21wb3NpdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgIHRoZSBmaXJzdCBjb2xsZWN0aW9uIHRvIGFkZAotICAgICAqIEBwYXJhbSBkICB0aGUgc2Vjb25kIGNvbGxlY3Rpb24gdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9zaXRlZChDb2xsZWN0aW9uIGMsIENvbGxlY3Rpb24gZCkgewotICAgICAgICB0aGlzLmFkZENvbXBvc2l0ZWQobmV3IENvbGxlY3Rpb25bXXtjLCBkfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBjb2xsZWN0aW9uIGZyb20gdGhlIHRob3NlIGJlaW5nIGRlY29yYXRlZCBpbiB0aGlzIGNvbXBvc2l0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsICBjb2xsZWN0aW9uIHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21wb3NpdGVkKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QodGhpcy5hbGwubGVuZ3RoKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0aGlzLmFsbCkpOwotICAgICAgICBsaXN0LnJlbW92ZShjb2xsKTsKLSAgICAgICAgdGhpcy5hbGwgPSAoQ29sbGVjdGlvbltdKSBsaXN0LnRvQXJyYXkobmV3IENvbGxlY3Rpb25bbGlzdC5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cwotICAgICAqCi0gICAgICogQHJldHVybiBBIG5ldyBBcnJheUxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgY29tcG9zaXRlLgotICAgICAqICAgICAgICAgVGhlIG5ldyBjb2xsZWN0aW9uIGlzIDxpPm5vdDwvaT4gYmFja2VkIGJ5IHRoaXMgY29tcG9zaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHRvQ29sbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QodGhpcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbGxlY3Rpb25zIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2YgYWxsIGNvbGxlY3Rpb25zIGluIHRoaXMgY29tcG9zaXRlLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdC5kZWNvcmF0ZShBcnJheXMuYXNMaXN0KHRoaXMuYWxsKSk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQbHVnZ2FibGUgc3RyYXRlZ3kgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGNvbXBvc2l0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25NdXRhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvc2l0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbXBvc2l0ZSAgdGhlIENvbXBvc2l0ZUNvbGxlY3Rpb24gYmVpbmcgY2hhbmdlZAotICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbnMgIGFsbCBvZiB0aGUgQ29sbGVjdGlvbiBpbnN0YW5jZXMgaW4gdGhpcyBDb21wb3NpdGVDb2xsZWN0aW9uCi0gICAgICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQKLSAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBhZGQgaXMgdW5zdXBwb3J0ZWQKLSAgICAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgZHVlIHRvIGl0cyB0eXBlCi0gICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBpdHMgbnVsbAotICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKENvbXBvc2l0ZUNvbGxlY3Rpb24gY29tcG9zaXRlLCBDb2xsZWN0aW9uW10gY29sbGVjdGlvbnMsIE9iamVjdCBvYmopOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgY29sbGVjdGlvbiBpcyB0byBiZSBhZGRlZCB0byB0aGUgY29tcG9zaXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29tcG9zaXRlICB0aGUgQ29tcG9zaXRlQ29sbGVjdGlvbiBiZWluZyBjaGFuZ2VkCi0gICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9ucyAgYWxsIG9mIHRoZSBDb2xsZWN0aW9uIGluc3RhbmNlcyBpbiB0aGlzIENvbXBvc2l0ZUNvbGxlY3Rpb24KLSAgICAgICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGFkZGVkCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBpcyBjaGFuZ2VkCi0gICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgYWRkIGlzIHVuc3VwcG9ydGVkCi0gICAgICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIGR1ZSB0byBpdHMgdHlwZQotICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGFkZGVkIGJlY2F1c2UgaXRzIG51bGwKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb21wb3NpdGVDb2xsZWN0aW9uIGNvbXBvc2l0ZSwgQ29sbGVjdGlvbltdIGNvbGxlY3Rpb25zLCBDb2xsZWN0aW9uIGNvbGwpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyB0byBiZSByZW1vdmVkIHRvIHRoZSBjb21wb3NpdGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb21wb3NpdGUgIHRoZSBDb21wb3NpdGVDb2xsZWN0aW9uIGJlaW5nIGNoYW5nZWQKLSAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb25zICBhbGwgb2YgdGhlIENvbGxlY3Rpb24gaW5zdGFuY2VzIGluIHRoaXMgQ29tcG9zaXRlQ29sbGVjdGlvbgotICAgICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IGJlaW5nIHJlbW92ZWQKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQKLSAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiByZW1vdmVkIGlzIHVuc3VwcG9ydGVkCi0gICAgICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIHJlbW92ZWQgZHVlIHRvIGl0cyB0eXBlCi0gICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgcmVtb3ZlZCBiZWNhdXNlIGl0cyBudWxsCi0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIHJlbW92ZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShDb21wb3NpdGVDb2xsZWN0aW9uIGNvbXBvc2l0ZSwgQ29sbGVjdGlvbltdIGNvbGxlY3Rpb25zLCBPYmplY3Qgb2JqKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9QcmVkaWNhdGVkQ29sbGVjdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vUHJlZGljYXRlZENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE3NzliZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9QcmVkaWNhdGVkQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBjb2xsZWN0aW9uIGV4aXN0cyB0byBwcm92aWRlIHZhbGlkYXRpb24gZm9yIHRoZSBkZWNvcmF0ZWQgY29sbGVjdGlvbi4KLSAqIEl0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgdG8gZGVjb3JhdGUgYW4gZW1wdHkgY29sbGVjdGlvbi4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24sIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiA8cD4KLSAqIE9uZSB1c2FnZSB3b3VsZCBiZSB0byBlbnN1cmUgdGhhdCBubyBudWxsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotICogPHByZT5Db2xsZWN0aW9uIGNvbGwgPSBQcmVkaWNhdGVkQ29sbGVjdGlvbi5kZWNvcmF0ZShuZXcgQXJyYXlMaXN0KCksIE5vdE51bGxQcmVkaWNhdGUuSU5TVEFOQ0UpOzwvcHJlPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICovCi1wdWJsaWMgY2xhc3MgUHJlZGljYXRlZENvbGxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6YWJsZUNvbGxlY3Rpb25EZWNvcmF0b3IgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MjU5MTgyMTQyMDc2NzA1MTYyTDsKLQotICAgIC8qKiBUaGUgcHJlZGljYXRlIHRvIHVzZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBQcmVkaWNhdGUgcHJlZGljYXRlOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgcHJlZGljYXRlZCBjb2xsZWN0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgY29sbGVjdGlvbiBvciBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZGVjb3JhdGUoQ29sbGVjdGlvbiBjb2xsLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZENvbGxlY3Rpb24oY29sbCwgcHJlZGljYXRlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgY29sbGVjdGlvbiBvciBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJlZGljYXRlZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHN1cGVyKGNvbGwpOwotICAgICAgICBpZiAocHJlZGljYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByZWRpY2F0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb2xsLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZShpdC5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJlZGljYXRlIGl0c2VsZiBzaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IHJldHVybiBmYWxzZSB0bwotICAgICAqIGluZGljYXRlIHRoYXQgdGhlIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCBiZWluZyBhZGRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhZGQgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKHByZWRpY2F0ZS5ldmFsdWF0ZShvYmplY3QpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIE9iamVjdCAnIiArIG9iamVjdCArICInIC0gUHJlZGljYXRlIHJlamVjdGVkIGl0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gdmFsaWRhdGUgdGhlIG9iamVjdCBiZWluZyBhZGRlZCB0byBlbnN1cmUgaXQgbWF0Y2hlcwotICAgICAqIHRoZSBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCBiZWluZyBhZGRlZAotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBhZGRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhZGQgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiBnZXRDb2xsZWN0aW9uKCkuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gdmFsaWRhdGUgdGhlIG9iamVjdHMgYmVpbmcgYWRkZWQgdG8gZW5zdXJlIHRoZXkgbWF0Y2gKLSAgICAgKiB0aGUgcHJlZGljYXRlLiBJZiBhbnkgb25lIGZhaWxzLCBubyB1cGRhdGUgaXMgbWFkZSB0byB0aGUgdW5kZXJseWluZwotICAgICAqIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGFkZGVkCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGFkZGluZyB0byB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFkZCBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgdmFsaWRhdGUoaXQubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbigpLmFkZEFsbChjb2xsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1N5bmNocm9uaXplZENvbGxlY3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1N5bmNocm9uaXplZENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGM0NzMyNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9TeW5jaHJvbml6ZWRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IHRvIHN5bmNocm9uaXplIGl0cyBiZWhhdmlvdXIKLSAqIGZvciBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LgotICogPHA+Ci0gKiBJdGVyYXRvcnMgbXVzdCBiZSBtYW51YWxseSBzeW5jaHJvbml6ZWQ6Ci0gKiA8cHJlPgotICogc3luY2hyb25pemVkIChjb2xsKSB7Ci0gKiAgIEl0ZXJhdG9yIGl0ID0gY29sbC5pdGVyYXRvcigpOwotICogICAvLyBkbyBzdHVmZiB3aXRoIGl0ZXJhdG9yCi0gKiB9Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENvbGxlY3Rpb24sIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjQxMjgwNTA5MjcxMDg3Nzk4Nkw7Ci0KLSAgICAvKiogVGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotICAgIC8qKiBUaGUgb2JqZWN0IHRvIGxvY2sgb24sIG5lZWRlZCBmb3IgTGlzdC9Tb3J0ZWRTZXQgdmlld3MgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGxvY2s7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBzeW5jaHJvbml6ZWQgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHN5bmNocm9uaXplZCBjb2xsZWN0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGRlY29yYXRlKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZENvbGxlY3Rpb24oY29sbCk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiAgdGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbGxlY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0gICAgICAgIHRoaXMubG9jayA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGxvY2sgIHRoZSBsb2NrIG9iamVjdCB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBPYmplY3QgbG9jaykgewotICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb2xsZWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotICAgICAgICB0aGlzLmxvY2sgPSBsb2NrOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmFkZChvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmFkZEFsbChjb2xsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5jb250YWlucyhvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29udGFpbnNBbGwoY29sbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdG9ycyBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZC4KLSAgICAgKiA8cHJlPgotICAgICAqIHN5bmNocm9uaXplZCAoY29sbCkgewotICAgICAqICAgSXRlcmF0b3IgaXQgPSBjb2xsLml0ZXJhdG9yKCk7Ci0gICAgICogICAvLyBkbyBzdHVmZiB3aXRoIGl0ZXJhdG9yCi0gICAgICogfQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZCBvbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBvYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZShvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZUFsbChjb2xsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoY29sbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmVxdWFscyhvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9UcmFuc2Zvcm1lZENvbGxlY3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1RyYW5zZm9ybWVkQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzUzMzQzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1RyYW5zZm9ybWVkQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IHRvIHRyYW5zZm9ybSBvYmplY3RzIHRoYXQgYXJlIGFkZGVkLgotICogPHA+Ci0gKiBUaGUgYWRkIG1ldGhvZHMgYXJlIGFmZmVjdGVkIGJ5IHRoaXMgY2xhc3MuCi0gKiBUaHVzIG9iamVjdHMgbXVzdCBiZSByZW1vdmVkIG9yIHNlYXJjaGVkIGZvciB1c2luZyB0aGVpciB0cmFuc2Zvcm1lZCBmb3JtLgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb252ZXJ0cyBTdHJpbmdzIHRvIEludGVnZXJzLCB5b3UgbXVzdAotICogdXNlIHRoZSBJbnRlZ2VyIGZvcm0gdG8gcmVtb3ZlIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkQ29sbGVjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvciB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODY5MjMwMDE4ODE2MTg3MTUxNEw7Ci0KLSAgICAvKiogVGhlIHRyYW5zZm9ybWVyIHRvIHVzZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHRyYW5zZm9ybWluZyBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZWQgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGxlY3Rpb24gb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBkZWNvcmF0ZShDb2xsZWN0aW9uIGNvbGwsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRDb2xsZWN0aW9uKGNvbGwsIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGxlY3Rpb24gb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2Zvcm1lZENvbGxlY3Rpb24oQ29sbGVjdGlvbiBjb2xsLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcihjb2xsKTsKLSAgICAgICAgaWYgKHRyYW5zZm9ybWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRyYW5zZm9ybWVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyBhbiBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHRyYW5zZm9ybWVyIGl0c2VsZiBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIHRyYW5zZm9ybQotICAgICAqIEByZXR1cm4gYSB0cmFuc2Zvcm1lZCBvYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0ob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgaXRzZWxmIG1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIGEgdHJhbnNmb3JtZWQgb2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gdHJhbnNmb3JtKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGNvbGwuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHRyYW5zZm9ybShpdC5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgb2JqZWN0ID0gdHJhbnNmb3JtKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiBnZXRDb2xsZWN0aW9uKCkuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBjb2xsID0gdHJhbnNmb3JtKGNvbGwpOwotICAgICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbigpLmFkZEFsbChjb2xsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1R5cGVkQ29sbGVjdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVHlwZWRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4ZDgxZjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vVHlwZWRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhIDxjb2RlPkNvbGxlY3Rpb248L2NvZGU+IHRvIHZhbGlkYXRlIHRoYXQgZWxlbWVudHMgYWRkZWQgYXJlIG9mIGEgc3BlY2lmaWMgdHlwZS4KLSAqIDxwPgotICogVGhlIHZhbGlkYXRpb24gb2YgYWRkaXRpb25zIGlzIHBlcmZvcm1lZCB2aWEgYW4gaW5zdGFuY2VvZiB0ZXN0IGFnYWluc3QgCi0gKiBhIHNwZWNpZmllZCA8Y29kZT5DbGFzczwvY29kZT4uIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlCi0gKiBjb2xsZWN0aW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZENvbGxlY3Rpb24gewotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHlwZWQgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgaW50byB0aGUgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZWQgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGxlY3Rpb24gb3IgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBkZWNvcmF0ZShDb2xsZWN0aW9uIGNvbGwsIENsYXNzIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkQ29sbGVjdGlvbihjb2xsLCBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKHR5cGUpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RpdmUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFR5cGVkQ29sbGVjdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1VubW9kaWZpYWJsZUJvdW5kZWRDb2xsZWN0aW9uLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVCb3VuZGVkQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmI3ZjM4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1VubW9kaWZpYWJsZUJvdW5kZWRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJvdW5kZWRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogPGNvZGU+VW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb248L2NvZGU+IGRlY29yYXRlcyBhbm90aGVyIAotICogPGNvZGU+Qm91bmRlZENvbGxlY3Rpb248L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBJZiBhIEJvdW5kZWRDb2xsZWN0aW9uIGlzIGZpcnN0IHdyYXBwZWQgaW4gc29tZSBvdGhlciBjb2xsZWN0aW9uIGRlY29yYXRvciwKLSAqIHN1Y2ggYXMgc3luY2hyb25pemVkIG9yIHByZWRpY2F0ZWQsIHRoZSBCb3VuZGVkQ29sbGVjdGlvbiBtZXRob2RzIGFyZSBubyAKLSAqIGxvbmdlciBhY2Nlc3NpYmxlLgotICogVGhlIGZhY3Rvcnkgb24gdGhpcyBjbGFzcyB3aWxsIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGJvdW5kZWQgbmF0dXJlIGJ5Ci0gKiBleGFtaW5pbmcgdGhlIHBhY2thZ2Ugc2NvcGUgdmFyaWFibGVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVCb3VuZGVkQ29sbGVjdGlvbgotICAgICAgICBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIEJvdW5kZWRDb2xsZWN0aW9uIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzExMjY3MjM4NTQ1MDM0MDMzMEw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gdW5tb2RpZmlhYmxlIGJvdW5kZWQgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIDxjb2RlPkJvdW5kZWRDb2xsZWN0aW9uPC9jb2RlPiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gYSBuZXcgdW5tb2RpZmlhYmxlIGJvdW5kZWQgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJhZyBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb3VuZGVkQ29sbGVjdGlvbiBkZWNvcmF0ZShCb3VuZGVkQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24oY29sbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgYm91bmRlZCBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhcGFibGUgb2YgZHJpbGxpbmcgZG93biB0aHJvdWdoIHVwIHRvIDEwMDAgb3RoZXIgZGVjb3JhdG9ycyAKLSAgICAgKiB0byBmaW5kIGEgc3VpdGFibGUgQm91bmRlZENvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSA8Y29kZT5Cb3VuZGVkQ29sbGVjdGlvbjwvY29kZT4gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHVubW9kaWZpYWJsZSBib3VuZGVkIGNvbGxlY3Rpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiYWcgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm91bmRlZENvbGxlY3Rpb24gZGVjb3JhdGVVc2luZyhDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNvbGxlY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBoYW5kbGUgZGVjb3JhdG9ycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeyAgLy8gY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BpbmcKLSAgICAgICAgICAgIGlmIChjb2xsIGluc3RhbmNlb2YgQm91bmRlZENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsgIC8vIG5vcm1hbCBsb29wIGV4aXQKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sbCBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcikgewotICAgICAgICAgICAgICAgIGNvbGwgPSAoKEFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcikgY29sbCkuY29sbGVjdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sbCBpbnN0YW5jZW9mIFN5bmNocm9uaXplZENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBjb2xsID0gKChTeW5jaHJvbml6ZWRDb2xsZWN0aW9uKSBjb2xsKS5jb2xsZWN0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsgIC8vIG5vcm1hbCBsb29wIGV4aXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGlmIChjb2xsIGluc3RhbmNlb2YgQm91bmRlZENvbGxlY3Rpb24gPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjb2xsZWN0aW9uIGlzIG5vdCBhIGJvdW5kZWQgY29sbGVjdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24oKEJvdW5kZWRDb2xsZWN0aW9uKSBjb2xsKTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGwgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlQm91bmRlZENvbGxlY3Rpb24oQm91bmRlZENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzdXBlcihjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlSXRlcmF0b3IuZGVjb3JhdGUoZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKLSAgICAgICAgcmV0dXJuICgoQm91bmRlZENvbGxlY3Rpb24pIGNvbGxlY3Rpb24pLmlzRnVsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbWF4U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuICgoQm91bmRlZENvbGxlY3Rpb24pIGNvbGxlY3Rpb24pLm1heFNpemUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1VubW9kaWZpYWJsZUNvbGxlY3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb2xsZWN0aW9uL1VubW9kaWZpYWJsZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VkZjE3ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9Vbm1vZGlmaWFibGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gdG8gZW5zdXJlIGl0IGNhbid0IGJlIGFsdGVyZWQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVubW9kaWZpYWJsZUNvbGxlY3Rpb24KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6YWJsZUNvbGxlY3Rpb25EZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzk4OTIwMDY4ODM4MTk5NDVMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBpbiBpcyBhbHJlYWR5IHVubW9kaWZpYWJsZSwgaXQgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBkZWNvcmF0ZShDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlQ29sbGVjdGlvbihjb2xsKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlQ29sbGVjdGlvbihDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgc3VwZXIoY29sbCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUl0ZXJhdG9yLmRlY29yYXRlKGdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29sbGVjdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZGU4NzIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbGxlY3Rpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuMSAyMDA5LzA1LzI3IDIyOjE2OjI3IG1wYXJrZXIgRXhwICQgLS0+Ci0gPCEtLQotICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08Qk9EWT4KLTxwPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiBDb2xsZWN0aW9ufSBpbnRlcmZhY2UuCi08cD4KLVRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgcGFja2FnZToKLTx1bD4KLTxsaT5Db21wb3NpdGVDb2xsZWN0aW9uIC0gYSBjb2xsZWN0aW9uIHRoYXQgY29tYmluZXMgbXVsdGlwbGUgY29sbGVjdGlvbnMgaW50byBvbmUKLTwvdWw+Ci1UaGUgZm9sbG93aW5nIGRlY29yYXRvcnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPlN5bmNocm9uaXplZCAtIHN5bmNocm9uaXplcyBtZXRob2QgYWNjZXNzIGZvciBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMKLTxsaT5Vbm1vZGlmaWFibGUgLSBlbnN1cmVzIHRoZSBjb2xsZWN0aW9uIGNhbm5vdCBiZSBhbHRlcmVkCi08bGk+UHJlZGljYXRlZCAtIGVuc3VyZXMgdGhhdCBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIHZhbGlkIGFjY29yZGluZyB0byBhIHByZWRpY2F0ZSBjYW4gYmUgYWRkZWQKLTxsaT5UeXBlZCAtIGVuc3VyZXMgdGhhdCBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIG9mIGEgc3BlY2lmaWMgdHlwZSBjYW4gYmUgYWRkZWQKLTxsaT5UcmFuc2Zvcm1lZCAtIHRyYW5zZm9ybXMgZWxlbWVudHMgYXMgdGhleSBhcmUgYWRkZWQKLTwvdWw+Ci08L3ByZT4KLTwvQk9EWT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Cb29sZWFuQ29tcGFyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0Jvb2xlYW5Db21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2MzliMWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0Jvb2xlYW5Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb21wYXJhdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEEge0BsaW5rIENvbXBhcmF0b3J9IGZvciB7QGxpbmsgQm9vbGVhbn0gb2JqZWN0cyB0aGF0IGNhbiBzb3J0IGVpdGhlcgotICogdHJ1ZSBvciBmYWxzZSBmaXJzdC4KLSAqIDxwPgotICogQHNlZSAjZ2V0VHJ1ZUZpcnN0Q29tcGFyYXRvcigpCi0gKiBAc2VlICNnZXRGYWxzZUZpcnN0Q29tcGFyYXRvcigpCi0gKiBAc2VlICNnZXRCb29sZWFuQ29tcGFyYXRvcihib29sZWFuKQotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICogCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbkNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODMwMDQyOTkxNjA2MzQwNjA5TDsKLQotICAgIC8qKiBDb25zdGFudCAidHJ1ZSBmaXJzdCIgcmVmZXJlbmNlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5Db21wYXJhdG9yIFRSVUVfRklSU1QgPSBuZXcgQm9vbGVhbkNvbXBhcmF0b3IodHJ1ZSk7Ci0KLSAgICAvKiogQ29uc3RhbnQgImZhbHNlIGZpcnN0IiByZWZlcmVuY2UuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbkNvbXBhcmF0b3IgRkFMU0VfRklSU1QgPSBuZXcgQm9vbGVhbkNvbXBhcmF0b3IoZmFsc2UpOwotCi0gICAgLyoqIDxjb2RlPnRydWU8L2NvZGU+IGlmZiA8Y29kZT50cnVlPC9jb2RlPiB2YWx1ZXMgc29ydCBiZWZvcmUgPGNvZGU+ZmFsc2U8L2NvZGU+IHZhbHVlcy4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ1ZUZpcnN0ID0gZmFsc2U7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIEJvb2xlYW5Db21wYXJhdG9yIGluc3RhbmNlIHRoYXQgc29ydHMgCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gdmFsdWVzIGJlZm9yZSA8Y29kZT5mYWxzZTwvY29kZT4gdmFsdWVzLgotICAgICAqIDxwIC8+Ci0gICAgICogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gCi0gICAgICogdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjb25zdHJ1Y3RpbmcgYSBuZXcgaW5zdGFuY2UgCi0gICAgICogdG8gcmVkdWNlIGFsbG9jYXRpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiBvdmVyaGVhZCB3aGVuCi0gICAgICogbXVsdGlwbGUgQm9vbGVhbkNvbXBhcmF0b3JzIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIAotICAgICAqIHZpcnR1YWwgbWFjaGluZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cnVlIGZpcnN0IHNpbmdsZXRvbiBCb29sZWFuQ29tcGFyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbkNvbXBhcmF0b3IgZ2V0VHJ1ZUZpcnN0Q29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFRSVUVfRklSU1Q7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBCb29sZWFuQ29tcGFyYXRvciBpbnN0YW5jZSB0aGF0IHNvcnRzIAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB2YWx1ZXMgYmVmb3JlIDxjb2RlPnRydWU8L2NvZGU+IHZhbHVlcy4KLSAgICAgKiA8cCAvPgotICAgICAqIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIAotICAgICAqIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIAotICAgICAqIHRvIHJlZHVjZSBhbGxvY2F0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24gb3ZlcmhlYWQgd2hlbgotICAgICAqIG11bHRpcGxlIEJvb2xlYW5Db21wYXJhdG9ycyBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSAKLSAgICAgKiB2aXJ0dWFsIG1hY2hpbmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmFsc2UgZmlyc3Qgc2luZ2xldG9uIEJvb2xlYW5Db21wYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuQ29tcGFyYXRvciBnZXRGYWxzZUZpcnN0Q29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFX0ZJUlNUOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIEJvb2xlYW5Db21wYXJhdG9yIGluc3RhbmNlIHRoYXQgc29ydHMgCi0gICAgICogPGNvZGU+PGk+dHJ1ZUZpcnN0PC9pPjwvY29kZT4gdmFsdWVzIGJlZm9yZSAKLSAgICAgKiA8Y29kZT4mI3gyMTs8aT50cnVlRmlyc3Q8L2k+PC9jb2RlPiB2YWx1ZXMuCi0gICAgICogPHAgLz4KLSAgICAgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSAKLSAgICAgKiB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSAKLSAgICAgKiB0byByZWR1Y2UgYWxsb2NhdGlvbiBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIHdoZW4KLSAgICAgKiBtdWx0aXBsZSBCb29sZWFuQ29tcGFyYXRvcnMgbWF5IGJlIHVzZWQgaW4gdGhlIHNhbWUgCi0gICAgICogdmlydHVhbCBtYWNoaW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cnVlRmlyc3Qgd2hlbiA8Y29kZT50cnVlPC9jb2RlPiwgc29ydCAKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiA8Y29kZT5Cb29sZWFuPC9jb2RlPnMgYmVmb3JlIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSBzaW5nbGV0b24gQm9vbGVhbkNvbXBhcmF0b3IgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW5Db21wYXJhdG9yIGdldEJvb2xlYW5Db21wYXJhdG9yKGJvb2xlYW4gdHJ1ZUZpcnN0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlRmlyc3QgPyBUUlVFX0ZJUlNUIDogRkFMU0VfRklSU1Q7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5Cb29sZWFuQ29tcGFyYXRvcjwvY29kZT4gdGhhdCBzb3J0cwotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB2YWx1ZXMgYmVmb3JlIDxjb2RlPnRydWU8L2NvZGU+IHZhbHVlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayAjQm9vbGVhbkNvbXBhcmF0b3IoYm9vbGVhbikgQm9vbGVhbkNvbXBhcmF0b3IoZmFsc2UpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBQbGVhc2UgdXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBpbnN0ZWFkIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuQ29tcGFyYXRvcigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPkJvb2xlYW5Db21wYXJhdG9yPC9jb2RlPiB0aGF0IHNvcnRzCi0gICAgICogPGNvZGU+PGk+dHJ1ZUZpcnN0PC9pPjwvY29kZT4gdmFsdWVzIGJlZm9yZSAKLSAgICAgKiA8Y29kZT4mI3gyMTs8aT50cnVlRmlyc3Q8L2k+PC9jb2RlPiB2YWx1ZXMuCi0gICAgICogPHA+Ci0gICAgICogUGxlYXNlIHVzZSB0aGUgc3RhdGljIGZhY3RvcmllcyBpbnN0ZWFkIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cnVlRmlyc3Qgd2hlbiA8Y29kZT50cnVlPC9jb2RlPiwgc29ydCAKLSAgICAgKiAgPGNvZGU+dHJ1ZTwvY29kZT4gYm9vbGVhbiB2YWx1ZXMgYmVmb3JlIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuQ29tcGFyYXRvcihib29sZWFuIHRydWVGaXJzdCkgewotICAgICAgICB0aGlzLnRydWVGaXJzdCA9IHRydWVGaXJzdDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGFyYml0cmFyeSBPYmplY3RzLgotICAgICAqIFdoZW4gYm90aCBhcmd1bWVudHMgYXJlIDxjb2RlPkJvb2xlYW48L2NvZGU+LCB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAqIHtAbGluayAjY29tcGFyZShCb29sZWFuLEJvb2xlYW4pIGNvbXBhcmUoKEJvb2xlYW4pPGk+b2JqMTwvaT4sKEJvb2xlYW4pPGk+b2JqMjwvaT4pfS4KLSAgICAgKiBXaGVuIGVpdGhlciBhcmd1bWVudCBpcyBub3QgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiwgdGhpcyBtZXRob2RzIHRocm93cwotICAgICAqIGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iajEgIHRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIEBwYXJhbSBvYmoyICB0aGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGlzIGxlc3MsIHBvc2l0aXZlIGlmIGdyZWF0ZXIsIHplcm8gaWYgZXF1YWwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGVpdGhlciBhcmd1bWVudCBpcyBub3QgPGNvZGU+Qm9vbGVhbjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKChCb29sZWFuKW9iajEsIChCb29sZWFuKW9iajIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbm9uLTxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPkJvb2xlYW48L2NvZGU+IG9iamVjdHMKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHtAbGluayAjc29ydHNUcnVlRmlyc3QoKX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGIxICB0aGUgZmlyc3QgYm9vbGVhbiB0byBjb21wYXJlCi0gICAgICogQHBhcmFtIGIyICB0aGUgc2Vjb25kIGJvb2xlYW4gdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gbmVnYXRpdmUgaWYgb2JqMSBpcyBsZXNzLCBwb3NpdGl2ZSBpZiBncmVhdGVyLCB6ZXJvIGlmIGVxdWFsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGVpdGhlciBhcmd1bWVudCA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0gICAgICAgIGJvb2xlYW4gdjEgPSBiMS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgYm9vbGVhbiB2MiA9IGIyLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgIHJldHVybiAodjEgXiB2MikgPyAoICh2MSBeIHRydWVGaXJzdCkgPyAxIDogLTEgKSA6IDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudCBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yIHRoYXQgaXMgY29uc2lzdGVudCB3aXRoCi0gICAgICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KSBlcXVhbHN9LgotICAgICAqCi0gICAgICogQHJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBoYXNoID0gIkJvb2xlYW5Db21wYXJhdG9yIi5oYXNoQ29kZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZUZpcnN0ID8gLTEgKiBoYXNoIDogaGFzaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiA8aT50aGF0PC9pPiBPYmplY3QgaXMgCi0gICAgICogaXMgYSB7QGxpbmsgQ29tcGFyYXRvcn0gd2hvc2Ugb3JkZXJpbmcgaXMga25vd24gdG8gYmUgCi0gICAgICogZXF1aXZhbGVudCB0byBtaW5lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqIGlmZiA8Y29kZT48aT50aGF0PC9pPjwvY29kZT4gaXMgYSB7QGxpbmsgQm9vbGVhbkNvbXBhcmF0b3J9IAotICAgICAqIHdob3NlIHZhbHVlIG9mIHtAbGluayAjc29ydHNUcnVlRmlyc3QoKX0gaXMgZXF1YWwgdG8gbWluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gKHRoaXMgPT0gb2JqZWN0KSB8fCAKLSAgICAgICAgICAgICAgICgob2JqZWN0IGluc3RhbmNlb2YgQm9vbGVhbkNvbXBhcmF0b3IpICYmIAotICAgICAgICAgICAgICAgICh0aGlzLnRydWVGaXJzdCA9PSAoKEJvb2xlYW5Db21wYXJhdG9yKW9iamVjdCkudHJ1ZUZpcnN0KSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmCi0gICAgICogSSBzb3J0IDxjb2RlPnRydWU8L2NvZGU+IHZhbHVlcyBiZWZvcmUgCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHZhbHVlcy4gIEluIG90aGVyIHdvcmRzLAotICAgICAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmCi0gICAgICoge0BsaW5rICNjb21wYXJlKEJvb2xlYW4sQm9vbGVhbikgY29tcGFyZShCb29sZWFuLkZBTFNFLEJvb2xlYW4uVFJVRSl9Ci0gICAgICogcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRydWVGaXJzdCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc29ydHNUcnVlRmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlRmlyc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvQ29tcGFyYWJsZUNvbXBhcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Db21wYXJhYmxlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmY2YzM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Db21wYXJhYmxlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29tcGFyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBBIHtAbGluayBDb21wYXJhdG9yIENvbXBhcmF0b3J9IHRoYXQgY29tcGFyZXMgCi0gKiB7QGxpbmsgQ29tcGFyYWJsZSBDb21wYXJhYmxlfSBvYmplY3RzLgotICogPHAgLz4KLSAqIFRoaXMgQ29tcGFyYXRvciBpcyB1c2VmdWwsIGZvciBleGFtcGxlLAotICogZm9yIGVuZm9yY2luZyB0aGUgbmF0dXJhbCBvcmRlciBpbiBjdXN0b20gaW1wbGVtZW50YXRpb25zCi0gKiBvZiBTb3J0ZWRTZXQgYW5kIFNvcnRlZE1hcC4KLSAqIDxwIC8+Ci0gKiBOb3RlOiBJbiB0aGUgMi4wIGFuZCAyLjEgcmVsZWFzZXMgb2YgQ29tbW9ucyBDb2xsZWN0aW9ucywgCi0gKiB0aGlzIGNsYXNzIHdvdWxkIHRocm93IGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYKLSAqIGVpdGhlciBvZiB0aGUgYXJndW1lbnRzIHRvIHtAbGluayAjY29tcGFyZShPYmplY3QsIE9iamVjdCkgY29tcGFyZX0KLSAqIHdlcmUgPGNvZGU+bnVsbDwvY29kZT4sIG5vdCB7QGxpbmsgQ29tcGFyYWJsZSBDb21wYXJhYmxlfSwKLSAqIG9yIGZvciB3aGljaCB7QGxpbmsgQ29tcGFyYWJsZSNjb21wYXJlVG8oT2JqZWN0KSBjb21wYXJlVG99IGdhdmUKLSAqIGluY29uc2lzdGVudCByZXN1bHRzLiAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBTZWUKLSAqIHtAbGluayAjY29tcGFyZShPYmplY3QsIE9iamVjdCkgY29tcGFyZX0gZm9yIGRldGFpbHMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqCi0gKiBAYXV0aG9yIEhlbnJpIFlhbmRlbGwKLSAqCi0gKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyZXZlcnNlT3JkZXIoKQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyYWJsZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbi4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQ9LTI5MTQzOTY4ODU4NTEzNzg2NUw7Ci0KLSAgICAvKiogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhYmxlQ29tcGFyYXRvciBpbnN0YW5jZSA9IG5ldyBDb21wYXJhYmxlQ29tcGFyYXRvcigpOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBhIENvbXBhcmFibGVDb21wYXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIERldmVsb3BlcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBjb21wYXJhdG9yIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLSAgICAgKiBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSB0byByZWR1Y2UgYWxsb2NhdGlvbiBhbmQgR0Mgb3ZlcmhlYWQKLSAgICAgKiB3aGVuIG11bHRpcGxlIGNvbXBhcmFibGUgY29tcGFyYXRvcnMgbWF5IGJlIHVzZWQgaW4gdGhlIHNhbWUgVk0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIENvbXBhcmFibGVDb21wYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb21wYXJhYmxlQ29tcGFyYXRvciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB3aG9zZSB1c2Ugc2hvdWxkIGJlIGF2b2lkZWQuCi0gICAgICogPHA+Ci0gICAgICogUGxlYXNlIHVzZSB0aGUge0BsaW5rICNnZXRJbnN0YW5jZSgpfSBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmFibGVDb21wYXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSB0d28ge0BsaW5rIENvbXBhcmFibGUgQ29tcGFyYWJsZX0gYXJndW1lbnRzLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogPHByZT4oKENvbXBhcmFibGUpb2JqMSkuY29tcGFyZVRvKG9iajIpPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iajEgIHRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIEBwYXJhbSBvYmoyICB0aGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGlzIGxlc3MsIHBvc2l0aXZlIGlmIGdyZWF0ZXIsIHplcm8gaWYgZXF1YWwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGk+b2JqMTwvaT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIAotICAgICAqICAgICAgICAgb3Igd2hlbiA8Y29kZT4oKENvbXBhcmFibGUpb2JqMSkuY29tcGFyZVRvKG9iajIpPC9jb2RlPiBkb2VzCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiA8aT5vYmoxPC9pPiBpcyBub3QgYSA8Y29kZT5Db21wYXJhYmxlPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIG9yIHdoZW4gPGNvZGU+KChDb21wYXJhYmxlKW9iajEpLmNvbXBhcmVUbyhvYmoyKTwvY29kZT4gZG9lcwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSlvYmoxKS5jb21wYXJlVG8ob2JqMik7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudCBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yIHRoYXQgaXMgY29uc2lzdGVudCB3aXRoCi0gICAgICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KSBlcXVhbHN9LgotICAgICAqCi0gICAgICogQHJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiAiQ29tcGFyYWJsZUNvbXBhcmF0b3IiLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGk+dGhhdDwvaT4gT2JqZWN0IGlzIAotICAgICAqIGlzIGEge0BsaW5rIENvbXBhcmF0b3IgQ29tcGFyYXRvcn0gd2hvc2Ugb3JkZXJpbmcgaXMgCi0gICAgICoga25vd24gdG8gYmUgZXF1aXZhbGVudCB0byBtaW5lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqIGlmZiA8Y29kZT48aT5vYmplY3Q8L2k+LntAbGluayBPYmplY3QjZ2V0Q2xhc3MoKSBnZXRDbGFzcygpfTwvY29kZT4KLSAgICAgKiBlcXVhbHMgPGNvZGU+dGhpcy5nZXRDbGFzcygpPC9jb2RlPi4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgdG8gcmVtYWluIGNvbnNpc3RlbnQKLSAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ29tcGFyYXRvciNlcXVhbHMoT2JqZWN0KX0gY29udHJhY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gKHRoaXMgPT0gb2JqZWN0KSB8fCAKLSAgICAgICAgICAgICAgICgobnVsbCAhPSBvYmplY3QpICYmIChvYmplY3QuZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy5nZXRDbGFzcygpKSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JDaGFpbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmE5ZjU3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9Db21wYXJhdG9yQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8cD5BIENvbXBhcmF0b3JDaGFpbiBpcyBhIENvbXBhcmF0b3IgdGhhdCB3cmFwcyBvbmUgb3IKLSAqIG1vcmUgQ29tcGFyYXRvcnMgaW4gc2VxdWVuY2UuICBUaGUgQ29tcGFyYXRvckNoYWluCi0gKiBjYWxscyBlYWNoIENvbXBhcmF0b3IgaW4gc2VxdWVuY2UgdW50aWwgZWl0aGVyIDEpCi0gKiBhbnkgc2luZ2xlIENvbXBhcmF0b3IgcmV0dXJucyBhIG5vbi16ZXJvIHJlc3VsdAotICogKGFuZCB0aGF0IHJlc3VsdCBpcyB0aGVuIHJldHVybmVkKSwKLSAqIG9yIDIpIHRoZSBDb21wYXJhdG9yQ2hhaW4gaXMgZXhoYXVzdGVkIChhbmQgemVybyBpcwotICogcmV0dXJuZWQpLiAgVGhpcyB0eXBlIG9mIHNvcnRpbmcgaXMgdmVyeSBzaW1pbGFyCi0gKiB0byBtdWx0aS1jb2x1bW4gc29ydGluZyBpbiBTUUwsIGFuZCB0aGlzIGNsYXNzCi0gKiBhbGxvd3MgSmF2YSBjbGFzc2VzIHRvIGVtdWxhdGUgdGhhdCBraW5kIG9mIGJlaGF2aW91cgotICogd2hlbiBzb3J0aW5nIGEgTGlzdC48L3A+Ci0gKiAKLSAqIDxwPlRvIGZ1cnRoZXIgZmFjaWxpdGF0ZSBTUUwtbGlrZSBzb3J0aW5nLCB0aGUgb3JkZXIgb2YKLSAqIGFueSBzaW5nbGUgQ29tcGFyYXRvciBpbiB0aGUgbGlzdCBjYW4gYmUgcmV2ZXJzZWQuPC9wPgotICogCi0gKiA8cD5DYWxsaW5nIGEgbWV0aG9kIHRoYXQgYWRkcyBuZXcgQ29tcGFyYXRvcnMgb3IKLSAqIGNoYW5nZXMgdGhlIGFzY2VuZC9kZXNjZW5kIHNvcnQgPGk+YWZ0ZXIgY29tcGFyZShPYmplY3QsCi0gKiBPYmplY3QpIGhhcyBiZWVuIGNhbGxlZDwvaT4gd2lsbCByZXN1bHQgaW4gYW4KLSAqIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLiAgSG93ZXZlciwgPGk+dGFrZSBjYXJlPC9pPgotICogdG8gbm90IGFsdGVyIHRoZSB1bmRlcmx5aW5nIExpc3Qgb2YgQ29tcGFyYXRvcnMKLSAqIG9yIHRoZSBCaXRTZXQgdGhhdCBkZWZpbmVzIHRoZSBzb3J0IG9yZGVyLjwvcD4KLSAqIAotICogPHA+SW5zdGFuY2VzIG9mIENvbXBhcmF0b3JDaGFpbiBhcmUgbm90IHN5bmNocm9uaXplZC4KLSAqIFRoZSBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUgYXQgY29uc3RydWN0aW9uIHRpbWUsIGJ1dAotICogaXQgPGk+aXM8L2k+IHRocmVhZC1zYWZlIHRvIHBlcmZvcm0gbXVsdGlwbGUgY29tcGFyaXNvbnMKLSAqIGFmdGVyIGFsbCB0aGUgc2V0dXAgb3BlcmF0aW9ucyBhcmUgY29tcGxldGUuPC9wPgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyYXRvckNoYWluIGltcGxlbWVudHMgQ29tcGFyYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gZnJvbSBDb2xsZWN0aW9ucyAyLjAuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcyMTY0NDk0Mjc0NjA4MTYzMEw7Ci0gICAgCi0gICAgLyoqIFRoZSBsaXN0IG9mIGNvbXBhcmF0b3JzIGluIHRoZSBjaGFpbi4gKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBjb21wYXJhdG9yQ2hhaW4gPSBudWxsOwotICAgIC8qKiBPcmRlciAtIGZhbHNlIChjbGVhcikgPSBhc2NlbmQ7IHRydWUgKHNldCkgPSBkZXNjZW5kLiAqLwotICAgIHByb3RlY3RlZCBCaXRTZXQgb3JkZXJpbmdCaXRzID0gbnVsbDsKLSAgIC8qKiBXaGV0aGVyIHRoZSBjaGFpbiBoYXMgYmVlbiAibG9ja2VkIi4gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIENvbXBhcmF0b3JDaGFpbiB3aXRoIG5vIENvbXBhcmF0b3JzLgotICAgICAqIFlvdSBtdXN0IGFkZCBhdCBsZWFzdCBvbmUgQ29tcGFyYXRvciBiZWZvcmUgY2FsbGluZwotICAgICAqIHRoZSBjb21wYXJlKE9iamVjdCxPYmplY3QpIG1ldGhvZCwgb3IgYW4gCi0gICAgICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaXMgdGhyb3duCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JDaGFpbigpIHsKLSAgICAgICAgdGhpcyhuZXcgQXJyYXlMaXN0KCksbmV3IEJpdFNldCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBDb21wYXJhdG9yQ2hhaW4gd2l0aCBhIHNpbmdsZSBDb21wYXJhdG9yLAotICAgICAqIHNvcnRpbmcgaW4gdGhlIGZvcndhcmQgb3JkZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciBGaXJzdCBjb21wYXJhdG9yIGluIHRoZSBDb21wYXJhdG9yIGNoYWluCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JDaGFpbihDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgdGhpcyhjb21wYXJhdG9yLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBDb21wYXJhdG9yIGNoYWluIHdpdGggYSBzaW5nbGUgQ29tcGFyYXRvciwKLSAgICAgKiBzb3J0aW5nIGluIHRoZSBnaXZlbiBvcmRlcgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIEZpcnN0IENvbXBhcmF0b3IgaW4gdGhlIENvbXBhcmF0b3JDaGFpbgotICAgICAqIEBwYXJhbSByZXZlcnNlICAgIGZhbHNlID0gZm9yd2FyZCBzb3J0OyB0cnVlID0gcmV2ZXJzZSBzb3J0Ci0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JDaGFpbihDb21wYXJhdG9yIGNvbXBhcmF0b3IsIGJvb2xlYW4gcmV2ZXJzZSkgewotICAgICAgICBjb21wYXJhdG9yQ2hhaW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbXBhcmF0b3JDaGFpbi5hZGQoY29tcGFyYXRvcik7Ci0gICAgICAgIG9yZGVyaW5nQml0cyA9IG5ldyBCaXRTZXQoMSk7Ci0gICAgICAgIGlmIChyZXZlcnNlID09IHRydWUpIHsKLSAgICAgICAgICAgIG9yZGVyaW5nQml0cy5zZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBDb21wYXJhdG9yQ2hhaW4gZnJvbSB0aGUgQ29tcGFyYXRvcnMgaW4gdGhlCi0gICAgICogTGlzdC4gIEFsbCBDb21wYXJhdG9ycyB3aWxsIGRlZmF1bHQgdG8gdGhlIGZvcndhcmQgCi0gICAgICogc29ydCBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgIExpc3Qgb2YgQ29tcGFyYXRvcnMKLSAgICAgKiBAc2VlICNDb21wYXJhdG9yQ2hhaW4oTGlzdCxCaXRTZXQpCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JDaGFpbihMaXN0IGxpc3QpIHsKLSAgICAgICAgdGhpcyhsaXN0LG5ldyBCaXRTZXQobGlzdC5zaXplKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBDb21wYXJhdG9yQ2hhaW4gZnJvbSB0aGUgQ29tcGFyYXRvcnMgaW4gdGhlCi0gICAgICogZ2l2ZW4gTGlzdC4gIFRoZSBzb3J0IG9yZGVyIG9mIGVhY2ggY29sdW1uIHdpbGwgYmUKLSAgICAgKiBkcmF3biBmcm9tIHRoZSBnaXZlbiBCaXRTZXQuICBXaGVuIGRldGVybWluaW5nIHRoZSBzb3J0Ci0gICAgICogb3JkZXIgZm9yIENvbXBhcmF0b3IgYXQgaW5kZXggPGk+aTwvaT4gaW4gdGhlIExpc3QsCi0gICAgICogdGhlIENvbXBhcmF0b3JDaGFpbiB3aWxsIGNhbGwgQml0U2V0LmdldCg8aT5pPC9pPikuCi0gICAgICogSWYgdGhhdCBtZXRob2QgcmV0dXJucyA8aT5mYWxzZTwvaT4sIHRoZSBmb3J3YXJkCi0gICAgICogc29ydCBvcmRlciBpcyB1c2VkOyBhIHJldHVybiB2YWx1ZSBvZiA8aT50cnVlPC9pPgotICAgICAqIGluZGljYXRlcyByZXZlcnNlIHNvcnQgb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgICBMaXN0IG9mIENvbXBhcmF0b3JzLiAgTk9URTogVGhpcyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBwZXJmb3JtIGEKLSAgICAgKiAgICAgICAgICAgICAgIGRlZmVuc2l2ZSBjb3B5IG9mIHRoZSBsaXN0Ci0gICAgICogQHBhcmFtIGJpdHMgICBTb3J0IG9yZGVyIGZvciBlYWNoIENvbXBhcmF0b3IuICBFeHRyYSBiaXRzIGFyZSBpZ25vcmVkLAotICAgICAqICAgICAgICAgICAgICAgdW5sZXNzIGV4dHJhIENvbXBhcmF0b3JzIGFyZSBhZGRlZCBieSBhbm90aGVyIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFyYXRvckNoYWluKExpc3QgbGlzdCwgQml0U2V0IGJpdHMpIHsKLSAgICAgICAgY29tcGFyYXRvckNoYWluID0gbGlzdDsKLSAgICAgICAgb3JkZXJpbmdCaXRzID0gYml0czsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQWRkIGEgQ29tcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiB1c2luZyB0aGUKLSAgICAgKiBmb3J3YXJkIHNvcnQgb3JkZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciBDb21wYXJhdG9yIHdpdGggdGhlIGZvcndhcmQgc29ydCBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBhcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIGFkZENvbXBhcmF0b3IoY29tcGFyYXRvcixmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgQ29tcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiB1c2luZyB0aGUKLSAgICAgKiBnaXZlbiBzb3J0IG9yZGVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IgQ29tcGFyYXRvciB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgY2hhaW4KLSAgICAgKiBAcGFyYW0gcmV2ZXJzZSAgICBmYWxzZSA9IGZvcndhcmQgc29ydCBvcmRlcjsgdHJ1ZSA9IHJldmVyc2Ugc29ydCBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBhcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yLCBib29sZWFuIHJldmVyc2UpIHsKLSAgICAgICAgY2hlY2tMb2NrZWQoKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBhcmF0b3JDaGFpbi5hZGQoY29tcGFyYXRvcik7Ci0gICAgICAgIGlmIChyZXZlcnNlID09IHRydWUpIHsKLSAgICAgICAgICAgIG9yZGVyaW5nQml0cy5zZXQoY29tcGFyYXRvckNoYWluLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgQ29tcGFyYXRvciBhdCB0aGUgZ2l2ZW4gaW5kZXgsIG1haW50YWluaW5nCi0gICAgICogdGhlIGV4aXN0aW5nIHNvcnQgb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgaW5kZXggb2YgdGhlIENvbXBhcmF0b3IgdG8gcmVwbGFjZQotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIENvbXBhcmF0b3IgdG8gcGxhY2UgYXQgdGhlIGdpdmVuIGluZGV4Ci0gICAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgaWYgaW5kZXggJmx0OyAwIG9yIGluZGV4ICZndDs9IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXBhcmF0b3IoaW50IGluZGV4LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIAotICAgIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0Q29tcGFyYXRvcihpbmRleCxjb21wYXJhdG9yLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIHRoZSBDb21wYXJhdG9yIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUKLSAgICAgKiBDb21wYXJhdG9yQ2hhaW4sIHVzaW5nIHRoZSBnaXZlbiBzb3J0IG9yZGVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgaW5kZXggb2YgdGhlIENvbXBhcmF0b3IgdG8gcmVwbGFjZQotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIENvbXBhcmF0b3IgdG8gc2V0Ci0gICAgICogQHBhcmFtIHJldmVyc2UgICAgZmFsc2UgPSBmb3J3YXJkIHNvcnQgb3JkZXI7IHRydWUgPSByZXZlcnNlIHNvcnQgb3JkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKGludCBpbmRleCwgQ29tcGFyYXRvciBjb21wYXJhdG9yLCBib29sZWFuIHJldmVyc2UpIHsKLSAgICAgICAgY2hlY2tMb2NrZWQoKTsKLQotICAgICAgICBjb21wYXJhdG9yQ2hhaW4uc2V0KGluZGV4LGNvbXBhcmF0b3IpOwotICAgICAgICBpZiAocmV2ZXJzZSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBvcmRlcmluZ0JpdHMuc2V0KGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9yZGVyaW5nQml0cy5jbGVhcihpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgc29ydCBvcmRlciBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlCi0gICAgICogQ29tcGFyYXRvckNoYWluIHRvIGEgZm9yd2FyZCBzb3J0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIENvbXBhcmF0b3JDaGFpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcndhcmRTb3J0KGludCBpbmRleCkgewotICAgICAgICBjaGVja0xvY2tlZCgpOwotICAgICAgICBvcmRlcmluZ0JpdHMuY2xlYXIoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgc29ydCBvcmRlciBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlCi0gICAgICogQ29tcGFyYXRvckNoYWluIHRvIGEgcmV2ZXJzZSBzb3J0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIENvbXBhcmF0b3JDaGFpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2VTb3J0KGludCBpbmRleCkgewotICAgICAgICBjaGVja0xvY2tlZCgpOwotICAgICAgICBvcmRlcmluZ0JpdHMuc2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOdW1iZXIgb2YgQ29tcGFyYXRvcnMgaW4gdGhlIGN1cnJlbnQgQ29tcGFyYXRvckNoYWluLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQ29tcGFyYXRvciBjb3VudAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3JDaGFpbi5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIG1vZGlmaWNhdGlvbnMgY2FuIHN0aWxsIGJlIG1hZGUgdG8gdGhlCi0gICAgICogQ29tcGFyYXRvckNoYWluLiAgQ29tcGFyYXRvckNoYWlucyBjYW5ub3QgYmUgbW9kaWZpZWQKLSAgICAgKiBvbmNlIHRoZXkgaGF2ZSBwZXJmb3JtZWQgYSBjb21wYXJpc29uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSA9IENvbXBhcmF0b3JDaGFpbiBjYW5ub3QgYmUgbW9kaWZpZWQ7IGZhbHNlID0gCi0gICAgICogICAgICAgICBDb21wYXJhdG9yQ2hhaW4gY2FuIHN0aWxsIGJlIG1vZGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgewotICAgICAgICByZXR1cm4gaXNMb2NrZWQ7Ci0gICAgfQotCi0gICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBDb21wYXJhdG9yQ2hhaW4gaXMgbG9ja2VkCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTG9ja2VkKCkgewotICAgICAgICBpZiAoaXNMb2NrZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb21wYXJhdG9yIG9yZGVyaW5nIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBmaXJzdCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2hhaW5JbnRlZ3JpdHkoKSB7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yQ2hhaW4uc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ29tcGFyYXRvckNoYWlucyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIENvbXBhcmF0b3IiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGNvbXBhcmlzb25zIG9uIHRoZSBPYmplY3RzIGFzIHBlcgotICAgICAqIENvbXBhcmF0b3IuY29tcGFyZShvMSxvMikuCi0gICAgICogCi0gICAgICogQHBhcmFtIG8xICB0aGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcGFyYW0gbzIgIHRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIC0xLCAwLCBvciAxCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIHRoZSBDb21wYXJhdG9yQ2hhaW4gZG9lcyBub3QgY29udGFpbiBhdCBsZWFzdCBvbmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNMb2NrZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGNoZWNrQ2hhaW5JbnRlZ3JpdHkoKTsKLSAgICAgICAgICAgIGlzTG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgY29tcGFyYXRvcnMgaW4gdGhlIGNoYWluCi0gICAgICAgIEl0ZXJhdG9yIGNvbXBhcmF0b3JzID0gY29tcGFyYXRvckNoYWluLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGNvbXBhcmF0b3JJbmRleCA9IDA7IGNvbXBhcmF0b3JzLmhhc05leHQoKTsgKytjb21wYXJhdG9ySW5kZXgpIHsKLQotICAgICAgICAgICAgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gKENvbXBhcmF0b3IpIGNvbXBhcmF0b3JzLm5leHQoKTsKLSAgICAgICAgICAgIGludCByZXR2YWwgPSBjb21wYXJhdG9yLmNvbXBhcmUobzEsbzIpOwotICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52ZXJ0IHRoZSBvcmRlciBpZiBpdCBpcyBhIHJldmVyc2Ugc29ydAotICAgICAgICAgICAgICAgIGlmIChvcmRlcmluZ0JpdHMuZ2V0KGNvbXBhcmF0b3JJbmRleCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZihJbnRlZ2VyLk1JTl9WQUxVRSA9PSByZXR2YWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsICo9IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgY29tcGFyYXRvcnMgYXJlIGV4aGF1c3RlZCwgcmV0dXJuIDAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudCBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yIHRoYXQgaXMgY29uc2lzdGVudCB3aXRoCi0gICAgICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KSBlcXVhbHN9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdWl0YWJsZSBoYXNoIGNvZGUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgIGlmKG51bGwgIT0gY29tcGFyYXRvckNoYWluKSB7Ci0gICAgICAgICAgICBoYXNoIF49IGNvbXBhcmF0b3JDaGFpbi5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmKG51bGwgIT0gb3JkZXJpbmdCaXRzKSB7Ci0gICAgICAgICAgICBoYXNoIF49IG9yZGVyaW5nQml0cy5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIDxpPnRoYXQ8L2k+IE9iamVjdCBpcyAKLSAgICAgKiBpcyBhIHtAbGluayBDb21wYXJhdG9yfSB3aG9zZSBvcmRlcmluZyBpcyBrbm93biB0byBiZSAKLSAgICAgKiBlcXVpdmFsZW50IHRvIG1pbmUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogaWZmIDxjb2RlPjxpPm9iamVjdDwvaT4ue0BsaW5rIE9iamVjdCNnZXRDbGFzcygpIGdldENsYXNzKCl9PC9jb2RlPgotICAgICAqIGVxdWFscyA8Y29kZT50aGlzLmdldENsYXNzKCk8L2NvZGU+LCBhbmQgdGhlIHVuZGVybHlpbmcgCi0gICAgICogY29tcGFyYXRvcnMgYW5kIG9yZGVyIGJpdHMgYXJlIGVxdWFsLgotICAgICAqIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB0byByZW1haW4gY29uc2lzdGVudAotICAgICAqIHdpdGggdGhlIHtAbGluayBDb21wYXJhdG9yI2VxdWFscyhPYmplY3QpfSBjb250cmFjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmKHRoaXMgPT0gb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmKG51bGwgPT0gb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZihvYmplY3QuZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgQ29tcGFyYXRvckNoYWluIGNoYWluID0gKENvbXBhcmF0b3JDaGFpbilvYmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gKCAobnVsbCA9PSBvcmRlcmluZ0JpdHMgPyBudWxsID09IGNoYWluLm9yZGVyaW5nQml0cyA6IG9yZGVyaW5nQml0cy5lcXVhbHMoY2hhaW4ub3JkZXJpbmdCaXRzKSkKLSAgICAgICAgICAgICAgICAgICAmJiAobnVsbCA9PSBjb21wYXJhdG9yQ2hhaW4gPyBudWxsID09IGNoYWluLmNvbXBhcmF0b3JDaGFpbiA6IGNvbXBhcmF0b3JDaGFpbi5lcXVhbHMoY2hhaW4uY29tcGFyYXRvckNoYWluKSkgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL0ZpeGVkT3JkZXJDb21wYXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvRml4ZWRPcmRlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y4MzJkZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvRml4ZWRPcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiAKLSAqIEEgQ29tcGFyYXRvciB3aGljaCBpbXBvc2VzIGEgc3BlY2lmaWMgb3JkZXIgb24gYSBzcGVjaWZpYyBzZXQgb2YgT2JqZWN0cy4KLSAqIE9iamVjdHMgYXJlIHByZXNlbnRlZCB0byB0aGUgRml4ZWRPcmRlckNvbXBhcmF0b3IgaW4gYSBzcGVjaWZpZWQgb3JkZXIgYW5kCi0gKiBzdWJzZXF1ZW50IGNhbGxzIHRvIHtAbGluayAjY29tcGFyZShPYmplY3QsIE9iamVjdCkgY29tcGFyZX0geWllbGQgdGhhdCBvcmRlci4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIFN0cmluZ1tdIHBsYW5ldHMgPSB7Ik1lcmN1cnkiLCAiVmVudXMiLCAiRWFydGgiLCAiTWFycyJ9OwotICogRml4ZWRPcmRlckNvbXBhcmF0b3IgZGlzdGFuY2VGcm9tU3VuID0gbmV3IEZpeGVkT3JkZXJDb21wYXJhdG9yKHBsYW5ldHMpOwotICogQXJyYXlzLnNvcnQocGxhbmV0cyk7ICAgICAgICAgICAgICAgICAgICAgLy8gU29ydCB0byBhbHBoYWJldGljYWwgb3JkZXIKLSAqIEFycmF5cy5zb3J0KHBsYW5ldHMsIGRpc3RhbmNlRnJvbVN1bik7ICAgIC8vIEJhY2sgdG8gb3JpZ2luYWwgb3JkZXIKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBPbmNlIDxjb2RlPmNvbXBhcmU8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCwgdGhlIEZpeGVkT3JkZXJDb21wYXJhdG9yIGlzIGxvY2tlZAotICogYW5kIGF0dGVtcHRzIHRvIG1vZGlmeSBpdCB5aWVsZCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLSAqIDxwPgotICogSW5zdGFuY2VzIG9mIEZpeGVkT3JkZXJDb21wYXJhdG9yIGFyZSBub3Qgc3luY2hyb25pemVkLiAgVGhlIGNsYXNzIGlzIG5vdAotICogdGhyZWFkLXNhZmUgYXQgY29uc3RydWN0aW9uIHRpbWUsIGJ1dCBpdCBpcyB0aHJlYWQtc2FmZSB0byBwZXJmb3JtCi0gKiBtdWx0aXBsZSBjb21wYXJpc29ucyAgYWZ0ZXIgYWxsIHRoZSBzZXR1cCBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjM0ICQKLSAqCi0gKiBAYXV0aG9yIERhdmlkIExlcHBpawotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSmFuZWsgQm9ndWNraQotICovCi1wdWJsaWMgY2xhc3MgRml4ZWRPcmRlckNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotICAgIC8qKiAKLSAgICAgKiBCZWhhdmlvciB3aGVuIGNvbXBhcmluZyB1bmtub3duIE9iamVjdHM6Ci0gICAgICogdW5rbm93biBvYmplY3RzIGNvbXBhcmUgYXMgYmVmb3JlIGtub3duIE9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9CRUZPUkUgPSAwOwotCi0gICAgLyoqIAotICAgICAqIEJlaGF2aW9yIHdoZW4gY29tcGFyaW5nIHVua25vd24gT2JqZWN0czoKLSAgICAgKiB1bmtub3duIG9iamVjdHMgY29tcGFyZSBhcyBhZnRlciBrbm93biBPYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fQUZURVIgPSAxOwotCi0gICAgLyoqIAotICAgICAqIEJlaGF2aW9yIHdoZW4gY29tcGFyaW5nIHVua25vd24gT2JqZWN0czoKLSAgICAgKiB1bmtub3duIG9iamVjdHMgY2F1c2UgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdG8gYmUgdGhyb3duLgotICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9USFJPV19FWENFUFRJT04gPSAyOwotCi0gICAgLyoqIEludGVybmFsIG1hcCBvZiBvYmplY3QgdG8gcG9zaXRpb24gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIC8qKiBDb3VudGVyIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIHBvc2l0aW9uIGluIHRoZSBtYXAgKi8KLSAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKLSAgICAvKiogSXMgdGhlIGNvbXBhcmF0b3IgbG9ja2VkIGFnYWluc3QgZnVydGhlciBjaGFuZ2UgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKLSAgICAvKiogVGhlIGJlaGF2aW91ciBpbiB0aGUgY2FzZSBvZiBhbiB1bmtub3duIG9iamVjdCAqLwotICAgIHByaXZhdGUgaW50IHVua25vd25PYmplY3RCZWhhdmlvciA9IFVOS05PV05fVEhST1dfRVhDRVBUSU9OOwotCi0gICAgLy8gQ29uc3RydWN0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IEZpeGVkT3JkZXJDb21wYXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBGaXhlZE9yZGVyQ29tcGFyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIEZpeGVkT3JkZXJDb21wYXJhdG9yIHdoaWNoIHVzZXMgdGhlIG9yZGVyIG9mIHRoZSBnaXZlbiBhcnJheQotICAgICAqIHRvIGNvbXBhcmUgdGhlIG9iamVjdHMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFycmF5IGlzIGNvcGllZCwgc28gbGF0ZXIgY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGNvbXBhcmF0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW1zICB0aGUgaXRlbXMgdGhhdCB0aGUgY29tcGFyYXRvciBjYW4gY29tcGFyZSBpbiBvcmRlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEZpeGVkT3JkZXJDb21wYXJhdG9yKE9iamVjdFtdIGl0ZW1zKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpdGVtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbGlzdCBvZiBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkKGl0ZW1zW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBDb25zdHJ1Y3RzIGEgRml4ZWRPcmRlckNvbXBhcmF0b3Igd2hpY2ggdXNlcyB0aGUgb3JkZXIgb2YgdGhlIGdpdmVuIGxpc3QKLSAgICAgKiB0byBjb21wYXJlIHRoZSBvYmplY3RzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBsaXN0IGlzIGNvcGllZCwgc28gbGF0ZXIgY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGNvbXBhcmF0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZW1zICB0aGUgaXRlbXMgdGhhdCB0aGUgY29tcGFyYXRvciBjYW4gY29tcGFyZSBpbiBvcmRlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgRml4ZWRPcmRlckNvbXBhcmF0b3IoTGlzdCBpdGVtcykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxpc3Qgb2YgaXRlbXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBhZGQoaXQubmV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEJlYW4gbWV0aG9kcyAvIHN0YXRlIHF1ZXJ5aW5nIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIG1vZGlmaWNhdGlvbnMgY2Fubm90IGJlIG1hZGUgdG8gdGhlIEZpeGVkT3JkZXJDb21wYXJhdG9yLgotICAgICAqIEZpeGVkT3JkZXJDb21wYXJhdG9ycyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGV5IGhhdmUgcGVyZm9ybWVkIGEgY29tcGFyaXNvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZSBGaXhlZE9yZGVyQ29tcGFyYXRvciB5aWVsZCBhbgotICAgICAqICBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgZmFsc2UgaWYgaXQgY2FuIGJlIGNoYW5nZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0xvY2tlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIGNvbXBhcmF0b3IgaXMgbm93IGxvY2tlZCBhZ2FpbnN0IGZ1cnRoZXIgY2hhbmdlcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb21wYXJhdG9yIGlzIGxvY2tlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTG9ja2VkKCkgewotICAgICAgICBpZiAoaXNMb2NrZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgbW9kaWZ5IGEgRml4ZWRPcmRlckNvbXBhcmF0b3IgYWZ0ZXIgYSBjb21wYXJpc29uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogR2V0cyB0aGUgYmVoYXZpb3IgZm9yIGNvbXBhcmluZyB1bmtub3duIG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxhZyBmb3IgdW5rbm93biBiZWhhdmlvdXIgLSBVTktOT1dOX0FGVEVSLAotICAgICAqIFVOS05PV05fQkVGT1JFIG9yIFVOS05PV05fVEhST1dfRVhDRVBUSU9OCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRVbmtub3duT2JqZWN0QmVoYXZpb3IoKSB7Ci0gICAgICAgIHJldHVybiB1bmtub3duT2JqZWN0QmVoYXZpb3I7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGJlaGF2aW9yIGZvciBjb21wYXJpbmcgdW5rbm93biBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1bmtub3duT2JqZWN0QmVoYXZpb3IgIHRoZSBmbGFnIGZvciB1bmtub3duIGJlaGF2aW91ciAtCi0gICAgICogVU5LTk9XTl9BRlRFUiwgVU5LTk9XTl9CRUZPUkUgb3IgVU5LTk9XTl9USFJPV19FWENFUFRJT04KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIGEgY29tcGFyaXNvbiBoYXMgYmVlbiBwZXJmb3JtZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdW5rbm93biBmbGFnIGlzIG5vdCB2YWxpZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVua25vd25PYmplY3RCZWhhdmlvcihpbnQgdW5rbm93bk9iamVjdEJlaGF2aW9yKSB7Ci0gICAgICAgIGNoZWNrTG9ja2VkKCk7Ci0gICAgICAgIGlmICh1bmtub3duT2JqZWN0QmVoYXZpb3IgIT0gVU5LTk9XTl9BRlRFUiAKLSAgICAgICAgICAgICYmIHVua25vd25PYmplY3RCZWhhdmlvciAhPSBVTktOT1dOX0JFRk9SRSAKLSAgICAgICAgICAgICYmIHVua25vd25PYmplY3RCZWhhdmlvciAhPSBVTktOT1dOX1RIUk9XX0VYQ0VQVElPTikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5yZWNvZ25pc2VkIHZhbHVlIGZvciB1bmtub3duIGJlaGF2aW91ciBmbGFnIik7ICAgIAotICAgICAgICB9Ci0gICAgICAgIHRoaXMudW5rbm93bk9iamVjdEJlaGF2aW9yID0gdW5rbm93bk9iamVjdEJlaGF2aW9yOwotICAgIH0KLQotICAgIC8vIE1ldGhvZHMgZm9yIGFkZGluZyBpdGVtcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogCi0gICAgICogQWRkcyBhbiBpdGVtLCB3aGljaCBjb21wYXJlcyBhcyBhZnRlciBhbGwgaXRlbXMga25vd24gdG8gdGhlIENvbXBhcmF0b3IuCi0gICAgICogSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBrbm93biB0byB0aGUgQ29tcGFyYXRvciwgaXRzIG9sZCBwb3NpdGlvbiBpcwotICAgICAqIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgaXRlbSB0byBiZSBhZGRlZCB0byB0aGUgQ29tcGFyYXRvci4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqIGhhcyBiZWVuIGFkZGVkIGZvciB0aGUgZmlyc3QgdGltZSwgZmFsc2UgaWYKLSAgICAgKiAgaXQgd2FzIGFscmVhZHkga25vd24gdG8gdGhlIENvbXBhcmF0b3IuCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBhIGNvbXBhcmlzb24gaGFzIGFscmVhZHkgYmVlbiBtYWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKLSAgICAgICAgY2hlY2tMb2NrZWQoKTsKLSAgICAgICAgT2JqZWN0IHBvc2l0aW9uID0gbWFwLnB1dChvYmosIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKykpOwotICAgICAgICByZXR1cm4gKHBvc2l0aW9uID09IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgaXRlbSwgd2hpY2ggY29tcGFyZXMgYXMgZXF1YWwgdG8gdGhlIGdpdmVuIGV4aXN0aW5nIGl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4aXN0aW5nT2JqICBhbiBpdGVtIGFscmVhZHkgaW4gdGhlIENvbXBhcmF0b3IncyBzZXQgb2YgCi0gICAgICogIGtub3duIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gbmV3T2JqICBhbiBpdGVtIHRvIGJlIGFkZGVkIHRvIHRoZSBDb21wYXJhdG9yJ3Mgc2V0IG9mCi0gICAgICogIGtub3duIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3T2JqIGhhcyBiZWVuIGFkZGVkIGZvciB0aGUgZmlyc3QgdGltZSwgZmFsc2UgaWYKLSAgICAgKiAgaXQgd2FzIGFscmVhZHkga25vd24gdG8gdGhlIENvbXBhcmF0b3IuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZXhpc3RpbmdPYmplY3QgaXMgbm90IGluIHRoZSAKLSAgICAgKiAgQ29tcGFyYXRvcidzIHNldCBvZiBrbm93biBvYmplY3RzLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgYSBjb21wYXJpc29uIGhhcyBhbHJlYWR5IGJlZW4gbWFkZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFzRXF1YWwoT2JqZWN0IGV4aXN0aW5nT2JqLCBPYmplY3QgbmV3T2JqKSB7Ci0gICAgICAgIGNoZWNrTG9ja2VkKCk7Ci0gICAgICAgIEludGVnZXIgcG9zaXRpb24gPSAoSW50ZWdlcikgbWFwLmdldChleGlzdGluZ09iaik7Ci0gICAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4aXN0aW5nT2JqICsgIiBub3Qga25vd24gdG8gIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBtYXAucHV0KG5ld09iaiwgcG9zaXRpb24pOwotICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyBDb21wYXJhdG9yIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIAotICAgICAqIENvbXBhcmVzIHR3byBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgdGhpcyBDb21wYXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqIGluIHRoZSBjYXNlIG9mIGFuIHVucmVjb2duaXNlZCBvYmplY3QuIFRoaXMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICogQ29tcGFyYXRvciBpbnRlcmZhY2UsIGJ1dCBpcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBleGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iajEgIHRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIEBwYXJhbSBvYmoyICB0aGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGlzIGxlc3MsIHBvc2l0aXZlIGlmIGdyZWF0ZXIsIHplcm8gaWYgZXF1YWwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBvYmoxIG9yIG9iajIgYXJlIG5vdCBrbm93biAKLSAgICAgKiAgdG8gdGhpcyBDb21wYXJhdG9yIGFuZCBhbiBhbHRlcm5hdGl2ZSBiZWhhdmlvciBoYXMgbm90IGJlZW4gc2V0Ci0gICAgICogIHZpYSB7QGxpbmsgI3NldFVua25vd25PYmplY3RCZWhhdmlvcihpbnQpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0gICAgICAgIGlzTG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgSW50ZWdlciBwb3NpdGlvbjEgPSAoSW50ZWdlcikgbWFwLmdldChvYmoxKTsKLSAgICAgICAgSW50ZWdlciBwb3NpdGlvbjIgPSAoSW50ZWdlcikgbWFwLmdldChvYmoyKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uMSA9PSBudWxsIHx8IHBvc2l0aW9uMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHVua25vd25PYmplY3RCZWhhdmlvcikgewotICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTl9CRUZPUkUgOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24xID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocG9zaXRpb24yID09IG51bGwpID8gMCA6IC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFVOS05PV05fQUZURVIgOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24xID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocG9zaXRpb24yID09IG51bGwpID8gMCA6IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFVOS05PV05fVEhST1dfRVhDRVBUSU9OIDoKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHVua25vd25PYmogPSAocG9zaXRpb24xID09IG51bGwpID8gb2JqMSA6IG9iajI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gY29tcGFyZSB1bmtub3duIG9iamVjdCAiICsgdW5rbm93bk9iaik7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5rbm93biB1bmtub3duT2JqZWN0QmVoYXZpb3I6ICIgKyB1bmtub3duT2JqZWN0QmVoYXZpb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uMS5jb21wYXJlVG8ocG9zaXRpb24yKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL051bGxDb21wYXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvTnVsbENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjVlYjQ5YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvTnVsbENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQSBDb21wYXJhdG9yIHRoYXQgd2lsbCBjb21wYXJlIG51bGxzIHRvIGJlIGVpdGhlciBsb3dlciBvciBoaWdoZXIgdGhhbgotICogb3RoZXIgb2JqZWN0cy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJCAKLSAqCi0gKiBAYXV0aG9yIE1pY2hhZWwgQS4gU21pdGgKLSAqLwotcHVibGljIGNsYXNzIE51bGxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4MjA3NzI1NzU0ODM1MDQzMzlMOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBjb21wYXJhdG9yIHRvIHVzZSB3aGVuIGNvbXBhcmluZyB0d28gbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdHMuCi0gICAgICoqLwotICAgIHByaXZhdGUgQ29tcGFyYXRvciBub25OdWxsQ29tcGFyYXRvcjsKLQotICAgIC8qKgotICAgICAqICBTcGVjaWZpZXMgd2hldGhlciBhIDxjb2RlPm51bGw8L2NvZGU+IGFyZSBjb21wYXJlZCBhcyBoaWdoZXIgdGhhbgotICAgICAqICBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0cy4KLSAgICAgKiovCi0gICAgcHJpdmF0ZSBib29sZWFuIG51bGxzQXJlSGlnaDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0IGFuIGluc3RhbmNlIHRoYXQgc29ydHMgPGNvZGU+bnVsbDwvY29kZT4gaGlnaGVyIHRoYW4gYW55Ci0gICAgICogIG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3QgaXQgaXMgY29tcGFyZWQgd2l0aC4gV2hlbiBjb21wYXJpbmcgdHdvCi0gICAgICogIG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3RzLCB0aGUge0BsaW5rIENvbXBhcmFibGVDb21wYXJhdG9yfSBpcwotICAgICAqICB1c2VkLgotICAgICAqKi8KLSAgICBwdWJsaWMgTnVsbENvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHRoaXMoQ29tcGFyYWJsZUNvbXBhcmF0b3IuZ2V0SW5zdGFuY2UoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENvbnN0cnVjdCBhbiBpbnN0YW5jZSB0aGF0IHNvcnRzIDxjb2RlPm51bGw8L2NvZGU+IGhpZ2hlciB0aGFuIGFueQotICAgICAqICBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0IGl0IGlzIGNvbXBhcmVkIHdpdGguICBXaGVuIGNvbXBhcmluZyB0d28KLSAgICAgKiAgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdHMsIHRoZSBzcGVjaWZpZWQge0BsaW5rIENvbXBhcmF0b3J9IGlzCi0gICAgICogIHVzZWQuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG5vbk51bGxDb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIHRvIHVzZSB3aGVuIGNvbXBhcmluZyB0d28KLSAgICAgKiAgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdHMuICBUaGlzIGFyZ3VtZW50IGNhbm5vdCBiZQotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqCi0gICAgICogIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+bm9uTnVsbENvbXBhcmF0b3I8L2NvZGU+IGlzCi0gICAgICogIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICoqLwotICAgIHB1YmxpYyBOdWxsQ29tcGFyYXRvcihDb21wYXJhdG9yIG5vbk51bGxDb21wYXJhdG9yKSB7Ci0gICAgICAgIHRoaXMobm9uTnVsbENvbXBhcmF0b3IsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UgdGhhdCBzb3J0cyA8Y29kZT5udWxsPC9jb2RlPiBoaWdoZXIgb3IgbG93ZXIgdGhhbgotICAgICAqICBhbnkgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdCBpdCBpcyBjb21wYXJlZCB3aXRoLiAgV2hlbiBjb21wYXJpbmcKLSAgICAgKiAgdHdvIG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3RzLCB0aGUge0BsaW5rIENvbXBhcmFibGVDb21wYXJhdG9yfSBpcwotICAgICAqICB1c2VkLgotICAgICAqCi0gICAgICogIEBwYXJhbSBudWxsc0FyZUhpZ2ggYSA8Y29kZT50cnVlPC9jb2RlPiB2YWx1ZSBpbmRpY2F0ZXMgdGhhdAotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgY29tcGFyZWQgYXMgaGlnaGVyIHRoYW4gYQotICAgICAqICBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0LiAgQSA8Y29kZT5mYWxzZTwvY29kZT4gdmFsdWUgaW5kaWNhdGVzCi0gICAgICogIHRoYXQgPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIGNvbXBhcmVkIGFzIGxvd2VyIHRoYW4gYQotICAgICAqICBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0LgotICAgICAqKi8KLSAgICBwdWJsaWMgTnVsbENvbXBhcmF0b3IoYm9vbGVhbiBudWxsc0FyZUhpZ2gpIHsKLSAgICAgICAgdGhpcyhDb21wYXJhYmxlQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpLCBudWxsc0FyZUhpZ2gpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0IGFuIGluc3RhbmNlIHRoYXQgc29ydHMgPGNvZGU+bnVsbDwvY29kZT4gaGlnaGVyIG9yIGxvd2VyIHRoYW4KLSAgICAgKiAgYW55IG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3QgaXQgaXMgY29tcGFyZWQgd2l0aC4gIFdoZW4gY29tcGFyaW5nCi0gICAgICogIHR3byBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0cywgdGhlIHNwZWNpZmllZCB7QGxpbmsgQ29tcGFyYXRvcn0gaXMKLSAgICAgKiAgdXNlZC4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbm9uTnVsbENvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgdG8gdXNlIHdoZW4gY29tcGFyaW5nIHR3bwotICAgICAqICBub24tPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0cy4gVGhpcyBhcmd1bWVudCBjYW5ub3QgYmUKLSAgICAgKiAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKgotICAgICAqICBAcGFyYW0gbnVsbHNBcmVIaWdoIGEgPGNvZGU+dHJ1ZTwvY29kZT4gdmFsdWUgaW5kaWNhdGVzIHRoYXQKLSAgICAgKiAgPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIGNvbXBhcmVkIGFzIGhpZ2hlciB0aGFuIGEKLSAgICAgKiAgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdC4gIEEgPGNvZGU+ZmFsc2U8L2NvZGU+IHZhbHVlIGluZGljYXRlcwotICAgICAqICB0aGF0IDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBjb21wYXJlZCBhcyBsb3dlciB0aGFuIGEKLSAgICAgKiAgbm9uLTxjb2RlPm51bGw8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqICBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPm5vbk51bGxDb21wYXJhdG9yPC9jb2RlPiBpcwotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqKi8KLSAgICBwdWJsaWMgTnVsbENvbXBhcmF0b3IoQ29tcGFyYXRvciBub25OdWxsQ29tcGFyYXRvciwgYm9vbGVhbiBudWxsc0FyZUhpZ2gpIHsKLSAgICAgICAgdGhpcy5ub25OdWxsQ29tcGFyYXRvciA9IG5vbk51bGxDb21wYXJhdG9yOwotICAgICAgICB0aGlzLm51bGxzQXJlSGlnaCA9IG51bGxzQXJlSGlnaDsKLSAgICAgICAgCi0gICAgICAgIGlmKG5vbk51bGxDb21wYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBub25OdWxsQ29tcGFyYXRvciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqICBQZXJmb3JtIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBvYmplY3RzLiAgSWYgYm90aCBvYmplY3RzIGFyZQotICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiwgYSA8Y29kZT4wPC9jb2RlPiB2YWx1ZSBpcyByZXR1cm5lZC4gIElmIG9uZSBvYmplY3QKLSAgICAgKiAgaXMgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSBvdGhlciBpcyBub3QsIHRoZSByZXN1bHQgaXMgZGV0ZXJtaW5lZCBvbgotICAgICAqICB3aGV0aGVyIHRoZSBDb21wYXJhdG9yIHdhcyBjb25zdHJ1Y3RlZCB0byBoYXZlIG51bGxzIGFzIGhpZ2hlciBvciBsb3dlcgotICAgICAqICB0aGFuIG90aGVyIG9iamVjdHMuICBJZiBuZWl0aGVyIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgYW4KLSAgICAgKiAgdW5kZXJseWluZyBjb21wYXJhdG9yIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgKG9yIHRoZSBkZWZhdWx0KSBpcwotICAgICAqICB1c2VkIHRvIGNvbXBhcmUgdGhlIG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3RzLgotICAgICAqCi0gICAgICogIEBwYXJhbSBvMSAgdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgICogIEBwYXJhbSBvMiAgdGhlIG9iamVjdCB0byBjb21wYXJlIGl0IHRvLgotICAgICAqICBAcmV0dXJuIDxjb2RlPi0xPC9jb2RlPiBpZiA8Y29kZT5vMTwvY29kZT4gaXMgImxvd2VyIiB0aGFuIChsZXNzIHRoYW4sCi0gICAgICogIGJlZm9yZSwgZXRjLikgPGNvZGU+bzI8L2NvZGU+OyA8Y29kZT4xPC9jb2RlPiBpZiA8Y29kZT5vMTwvY29kZT4gaXMKLSAgICAgKiAgImhpZ2hlciIgdGhhbiAoZ3JlYXRlciB0aGFuLCBhZnRlciwgZXRjLikgPGNvZGU+bzI8L2NvZGU+OyBvcgotICAgICAqICA8Y29kZT4wPC9jb2RlPiBpZiA8Y29kZT5vMTwvY29kZT4gYW5kIDxjb2RlPm8yPC9jb2RlPiBhcmUgZXF1YWwuCi0gICAgICoqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICBpZihvMSA9PSBvMikgeyByZXR1cm4gMDsgfQotICAgICAgICBpZihvMSA9PSBudWxsKSB7IHJldHVybiAodGhpcy5udWxsc0FyZUhpZ2ggPyAxIDogLTEpOyB9Ci0gICAgICAgIGlmKG8yID09IG51bGwpIHsgcmV0dXJuICh0aGlzLm51bGxzQXJlSGlnaCA/IC0xIDogMSk7IH0KLSAgICAgICAgcmV0dXJuIHRoaXMubm9uTnVsbENvbXBhcmF0b3IuY29tcGFyZShvMSwgbzIpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiAgSW1wbGVtZW50IGEgaGFzaCBjb2RlIGZvciB0aGlzIGNvbXBhcmF0b3IgdGhhdCBpcyBjb25zaXN0ZW50IHdpdGgKLSAgICAgKiAge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0uCi0gICAgICoKLSAgICAgKiAgQHJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBjb21wYXJhdG9yLgotICAgICAqKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gKG51bGxzQXJlSGlnaCA/IC0xIDogMSkgKiBub25OdWxsQ29tcGFyYXRvci5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgcmVwcmVzZW50cyBhIGNvbXBhcmF0b3IgdGhhdCBpcwotICAgICAqICBlcXVhbCB0byB0aGlzIGNvbXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgY29tcGFyYXRvciB3aXRoLgotICAgICAqCi0gICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBOdWxsQ29tcGFyYXRvcgotICAgICAqICB3aXRoIGVxdWl2YWxlbnQgPGNvZGU+bnVsbDwvY29kZT4gY29tcGFyaXNvbiBiZWhhdmlvcgotICAgICAqICAoaS5lLiA8Y29kZT5udWxsPC9jb2RlPiBoaWdoIG9yIGxvdykgYW5kIHdpdGggZXF1aXZhbGVudCB1bmRlcmx5aW5nCi0gICAgICogIG5vbi08Y29kZT5udWxsPC9jb2RlPiBvYmplY3QgY29tcGFyYXRvcnMuCi0gICAgICoqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmKG9iaiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICBpZihvYmogPT0gdGhpcykgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICBpZighb2JqLmdldENsYXNzKCkuZXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKSkpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgTnVsbENvbXBhcmF0b3Igb3RoZXIgPSAoTnVsbENvbXBhcmF0b3Ipb2JqOwotCQotICAgICAgICByZXR1cm4gKCh0aGlzLm51bGxzQXJlSGlnaCA9PSBvdGhlci5udWxsc0FyZUhpZ2gpICYmCi0gICAgICAgICAgICAgICAgKHRoaXMubm9uTnVsbENvbXBhcmF0b3IuZXF1YWxzKG90aGVyLm5vbk51bGxDb21wYXJhdG9yKSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL1JldmVyc2VDb21wYXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBiMjM5Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGFub3RoZXIgY29tcGFyYXRvciBieSByZXZlcnNpbmcgdGhlIGFyZ3VtZW50cwotICogdG8gaXRzIHtAbGluayAjY29tcGFyZShPYmplY3QsIE9iamVjdCkgY29tcGFyZX0gbWV0aG9kLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzQgJAotICoKLSAqIEBhdXRob3IgSGVucmkgWWFuZGVsbAotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiAKLSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JldmVyc2VPcmRlcigpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uIGZyb20gQ29sbGVjdGlvbnMgMi4wLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI4NTg4ODcyNDIwMjg1MzkyNjVMOwotCi0gICAgLyoqIFRoZSBjb21wYXJhdG9yIGJlaW5nIGRlY29yYXRlZC4gKi8KLSAgICBwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvcjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tcGFyYXRvciB0aGF0IGNvbXBhcmVzIG9iamVjdHMgYmFzZWQgb24gdGhlIGludmVyc2Ugb2YgdGhlaXIKLSAgICAgKiBuYXR1cmFsIG9yZGVyaW5nLiAgVXNpbmcgdGhpcyBDb25zdHJ1Y3RvciB3aWxsIGNyZWF0ZSBhIFJldmVyc2VDb21wYXJhdG9yCi0gICAgICogdGhhdCBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIHRoZSBDb21wYXJhdG9yIHJldHVybmVkIGJ5Ci0gICAgICogamF2YS51dGlsLkNvbGxlY3Rpb25zLjxiPnJldmVyc2VPcmRlcigpPC9iPi4KLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyZXZlcnNlT3JkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcigpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tcGFyYXRvciB0aGF0IGludmVydHMgdGhlIGNvbXBhcmlzb24KLSAgICAgKiBvZiB0aGUgZ2l2ZW4gY29tcGFyYXRvci4gIElmIHlvdSBwYXNzIGluIDxjb2RlPm51bGw8L2NvZGU+LAotICAgICAqIHRoZSBSZXZlcnNlQ29tcGFyYXRvciBkZWZhdWx0cyB0byByZXZlcnNpbmcgdGhlCi0gICAgICogbmF0dXJhbCBvcmRlciwgYXMgcGVyIAotICAgICAqIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjcmV2ZXJzZU9yZGVyKCl9PC9iPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciBDb21wYXJhdG9yIHRvIHJldmVyc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0gICAgICAgIGlmKGNvbXBhcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IENvbXBhcmFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMgaW4gcmV2ZXJzZSBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqMSAgdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHBhcmFtIG9iajIgIHRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIG5lZ2F0aXZlIGlmIG9iajEgaXMgbGVzcywgcG9zaXRpdmUgaWYgZ3JlYXRlciwgemVybyBpZiBlcXVhbAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShvYmoyLCBvYmoxKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IGEgaGFzaCBjb2RlIGZvciB0aGlzIGNvbXBhcmF0b3IgdGhhdCBpcyBjb25zaXN0ZW50IHdpdGgKLSAgICAgKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpIGVxdWFsc30uCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN1aXRhYmxlIGhhc2ggY29kZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiAiUmV2ZXJzZUNvbXBhcmF0b3IiLmhhc2hDb2RlKCkgXiBjb21wYXJhdG9yLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGk+dGhhdDwvaT4gT2JqZWN0IGlzIAotICAgICAqIGlzIGEge0BsaW5rIENvbXBhcmF0b3J9IHdob3NlIG9yZGVyaW5nIGlzIGtub3duIHRvIGJlIAotICAgICAqIGVxdWl2YWxlbnQgdG8gbWluZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKiBpZmYgPGNvZGU+PGk+b2JqZWN0PC9pPi57QGxpbmsgT2JqZWN0I2dldENsYXNzKCkgZ2V0Q2xhc3MoKX08L2NvZGU+Ci0gICAgICogZXF1YWxzIDxjb2RlPnRoaXMuZ2V0Q2xhc3MoKTwvY29kZT4sIGFuZCB0aGUgdW5kZXJseWluZyAKLSAgICAgKiBjb21wYXJhdG9ycyBhcmUgZXF1YWwuCi0gICAgICogU3ViY2xhc3NlcyBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHRvIHJlbWFpbiBjb25zaXN0ZW50Ci0gICAgICogd2l0aCB0aGUge0BsaW5rIENvbXBhcmF0b3IjZXF1YWxzKE9iamVjdCkgZXF1YWxzfSBjb250cmFjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZih0aGlzID09IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZihudWxsID09IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYob2JqZWN0LmdldENsYXNzKCkuZXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIFJldmVyc2VDb21wYXJhdG9yIHRoYXRyYyA9IChSZXZlcnNlQ29tcGFyYXRvcilvYmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGFyYXRvci5lcXVhbHModGhhdHJjLmNvbXBhcmF0b3IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvVHJhbnNmb3JtaW5nQ29tcGFyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2NvbXBhcmF0b3JzL1RyYW5zZm9ybWluZ0NvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY3MzQ4OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvVHJhbnNmb3JtaW5nQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb21wYXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIENvbXBhcmF0b3Igd2l0aCB0cmFuc2Zvcm1hdGlvbiBiZWhhdmlvci4gVGhhdCBpcywgdGhlCi0gKiByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdHJhbnNmb3JtIG9wZXJhdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZGVjb3JhdGVkCi0gKiB7QGxpbmsgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCxPYmplY3QpIGNvbXBhcmV9IG1ldGhvZC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wICg/KQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozNCAkCi0gKiAKLSAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyCi0gKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb21wYXJhdG9ycy5Db21wYXJhYmxlQ29tcGFyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgIAotICAgIC8qKiBUaGUgZGVjb3JhdGVkIGNvbXBhcmF0b3IuICovCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3IgZGVjb3JhdGVkOwotICAgIC8qKiBUaGUgdHJhbnNmb3JtZXIgYmVpbmcgdXNlZC4gKi8gICAgCi0gICAgcHJvdGVjdGVkIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gVHJhbnNmb3JtZXIgYW5kIGEgCi0gICAgICoge0BsaW5rIENvbXBhcmFibGVDb21wYXJhdG9yIENvbXBhcmFibGVDb21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgd2hhdCB3aWxsIHRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHRvIDxjb2RlPmNvbXBhcmU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWluZ0NvbXBhcmF0b3IoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgdGhpcyh0cmFuc2Zvcm1lciwgbmV3IENvbXBhcmFibGVDb21wYXJhdG9yKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gVHJhbnNmb3JtZXIgYW5kIENvbXBhcmF0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB3aGF0IHdpbGwgdHJhbnNmb3JtIHRoZSBhcmd1bWVudHMgdG8gPGNvZGU+Y29tcGFyZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gZGVjb3JhdGVkICB0aGUgZGVjb3JhdGVkIENvbXBhcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtaW5nQ29tcGFyYXRvcihUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgQ29tcGFyYXRvciBkZWNvcmF0ZWQpIHsKLSAgICAgICAgdGhpcy5kZWNvcmF0ZWQgPSBkZWNvcmF0ZWQ7Ci0gICAgICAgIHRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgdmFsdWVzIGZyb20gdGhlIHRyYW5zZm9ybSBvcGVyYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iajEgIHRoZSBmaXJzdCBvYmplY3QgdG8gdHJhbnNmb3JtIHRoZW4gY29tcGFyZQotICAgICAqIEBwYXJhbSBvYmoyICB0aGUgc2Vjb25kIG9iamVjdCB0byB0cmFuc2Zvcm0gdGhlbiBjb21wYXJlCi0gICAgICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGlzIGxlc3MsIHBvc2l0aXZlIGlmIGdyZWF0ZXIsIHplcm8gaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZTEgPSB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShvYmoxKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlMiA9IHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG9iajIpOwotICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZWQuY29tcGFyZSh2YWx1ZTEsIHZhbHVlMik7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvY29tcGFyYXRvcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDVhY2YyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9jb21wYXJhdG9ycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzQgbXBhcmtlciBFeHAgJCAtLT4KLSA8IS0tCi0gICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxCT0RZPgotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZQote0BsaW5rIGphdmEudXRpbC5Db21wYXJhdG9yIENvbXBhcmF0b3J9IGludGVyZmFjZS4KLTxwPgotWW91IG1heSBhbHNvIGNvbnNpZGVyIHVzaW5nIAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Db21wYXJhdG9yVXRpbHMgQ29tcGFyYXRvclV0aWxzfSwKLXdoaWNoIGlzIGEgc2luZ2xlIGNsYXNzIHRoYXQgdXNlcyBzdGF0aWMgbWV0aG9kcyB0byBjb25zdHJ1Y3QgaW5zdGFuY2VzCi1vZiB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UuCi08L0JPRFk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQWxsUHJlZGljYXRlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQWxsUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmZGU0ZDguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0FsbFByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYWxsIHRoZQotICogcHJlZGljYXRlcyByZXR1cm4gdHJ1ZS4KLSAqIElmIHRoZSBhcnJheSBvZiBwcmVkaWNhdGVzIGlzIGVtcHR5LCB0aGVuIHRoaXMgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS4KLSAqIDxwPgotICogTk9URTogSW4gdmVyc2lvbnMgcHJpb3IgdG8gMy4yIGFuIGFycmF5IHNpemUgb2YgemVybyBvciBvbmUKLSAqIHRocmV3IGFuIGV4Y2VwdGlvbi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHQgQmVuc29uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbGxQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzA5NDY5Njc2NTAzODMwODc5OUw7Ci0gICAgCi0gICAgLyoqIFRoZSBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZVtdIGlQcmVkaWNhdGVzOwotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGFycmF5IGlzIHNpemUgemVybywgdGhlIHByZWRpY2F0ZSBhbHdheXMgcmV0dXJucyB0cnVlLgotICAgICAqIElmIHRoZSBhcnJheSBpcyBzaXplIG9uZSwgdGhlbiB0aGF0IHByZWRpY2F0ZSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjaGVjaywgY2xvbmVkLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmFsbDwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwcmVkaWNhdGUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBUcnVlUHJlZGljYXRlLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlc1swXTsKLSAgICAgICAgfQotICAgICAgICBwcmVkaWNhdGVzID0gRnVuY3RvclV0aWxzLmNvcHkocHJlZGljYXRlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsUHJlZGljYXRlKHByZWRpY2F0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgc2l6ZSB6ZXJvLCB0aGUgcHJlZGljYXRlIGFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgc2l6ZSBvbmUsIHRoZW4gdGhhdCBwcmVkaWNhdGUgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyAgdGhlIHByZWRpY2F0ZXMgdG8gY2hlY2ssIGNsb25lZCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5hbGw8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoQ29sbGVjdGlvbiBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIFByZWRpY2F0ZVtdIHByZWRzID0gRnVuY3RvclV0aWxzLnZhbGlkYXRlKHByZWRpY2F0ZXMpOwotICAgICAgICBpZiAocHJlZHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBUcnVlUHJlZGljYXRlLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHByZWRzWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQWxsUHJlZGljYXRlKHByZWRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjaGVjaywgbm90IGNsb25lZCwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQWxsUHJlZGljYXRlKFByZWRpY2F0ZVtdIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZXMgPSBwcmVkaWNhdGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIGFsbCBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGRlY29yYXRlZCBwcmVkaWNhdGVzIHJldHVybiB0cnVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlQcmVkaWNhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaVByZWRpY2F0ZXNbaV0uZXZhbHVhdGUob2JqZWN0KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmVkaWNhdGVzLCBkbyBub3QgbW9kaWZ5IHRoZSBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGVzCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFByZWRpY2F0ZVtdIGdldFByZWRpY2F0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBpUHJlZGljYXRlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbmRQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbmRQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhmYjkzZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQW5kUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBib3RoIHRoZSBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbmRQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MTg5MDE0MjEzNzYzMTg2OTEyTDsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlIGlQcmVkaWNhdGUxOwotICAgIC8qKiBUaGUgYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjYWxsICovCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgaVByZWRpY2F0ZTI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMSAgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMiAgdGhlIHNlY29uZCBwcmVkaWNhdGUgdG8gY2hlY2ssIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YW5kPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlMSwgUHJlZGljYXRlIHByZWRpY2F0ZTIpIHsKLSAgICAgICAgaWYgKHByZWRpY2F0ZTEgPT0gbnVsbCB8fCBwcmVkaWNhdGUyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByZWRpY2F0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBbmRQcmVkaWNhdGUocHJlZGljYXRlMSwgcHJlZGljYXRlMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMSAgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMiAgdGhlIHNlY29uZCBwcmVkaWNhdGUgdG8gY2hlY2ssIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIEFuZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZGljYXRlMSwgUHJlZGljYXRlIHByZWRpY2F0ZTIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZTEgPSBwcmVkaWNhdGUxOwotICAgICAgICBpUHJlZGljYXRlMiA9IHByZWRpY2F0ZTI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgcmV0dXJuaW5nIHRydWUgaWYgYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYm90aCBkZWNvcmF0ZWQgcHJlZGljYXRlcyByZXR1cm4gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICByZXR1cm4gKGlQcmVkaWNhdGUxLmV2YWx1YXRlKG9iamVjdCkgJiYgaVByZWRpY2F0ZTIuZXZhbHVhdGUob2JqZWN0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHdvIHByZWRpY2F0ZXMgYmVpbmcgZGVjb3JhdGVkIGFzIGFuIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZXMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlW10gZ2V0UHJlZGljYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVbXSB7aVByZWRpY2F0ZTEsIGlQcmVkaWNhdGUyfTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbnlQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9BbnlQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjI5Yjc0MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQW55UHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0LDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlCi0gKiBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICogSWYgdGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBwcmVkaWNhdGUgcmV0dXJucyBmYWxzZS4KLSAqIDxwPgotICogTk9URTogSW4gdmVyc2lvbnMgcHJpb3IgdG8gMy4yIGFuIGFycmF5IHNpemUgb2YgemVybyBvciBvbmUKLSAqIHRocmV3IGFuIGV4Y2VwdGlvbi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHQgQmVuc29uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbnlQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NDI5OTk5NTMwOTM0NjQ3NTQyTDsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlW10gaVByZWRpY2F0ZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc2l6ZSB6ZXJvLCB0aGUgcHJlZGljYXRlIGFsd2F5cyByZXR1cm5zIGZhbHNlLgotICAgICAqIElmIHRoZSBhcnJheSBpcyBzaXplIG9uZSwgdGhlbiB0aGF0IHByZWRpY2F0ZSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjaGVjaywgY2xvbmVkLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmFueTwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwcmVkaWNhdGUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGYWxzZVByZWRpY2F0ZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZGljYXRlcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZXNbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBbnlQcmVkaWNhdGUoRnVuY3RvclV0aWxzLmNvcHkocHJlZGljYXRlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgc2l6ZSB6ZXJvLCB0aGUgcHJlZGljYXRlIGFsd2F5cyByZXR1cm5zIGZhbHNlLgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIGlzIHNpemUgb25lLCB0aGVuIHRoYXQgcHJlZGljYXRlIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLCBjbG9uZWQsIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YWxsPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlcyBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHByZWRpY2F0ZSBpbiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGdldEluc3RhbmNlKENvbGxlY3Rpb24gcHJlZGljYXRlcykgewotICAgICAgICBQcmVkaWNhdGVbXSBwcmVkcyA9IEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgaWYgKHByZWRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2VQcmVkaWNhdGUuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWRzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZHNbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBbnlQcmVkaWNhdGUocHJlZHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLCBub3QgY2xvbmVkLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBBbnlQcmVkaWNhdGUoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpUHJlZGljYXRlcyA9IHByZWRpY2F0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgcmV0dXJuaW5nIHRydWUgaWYgYW55IHByZWRpY2F0ZSByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgZGVjb3JhdGVkIHByZWRpY2F0ZSByZXR1cm4gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpUHJlZGljYXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGlQcmVkaWNhdGVzW2ldLmV2YWx1YXRlKG9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlcywgZG8gbm90IG1vZGlmeSB0aGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZENsb3N1cmUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DaGFpbmVkQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWU5YjRlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DaGFpbmVkQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ2xvc3VyZTsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIHRoYXQgY2hhaW5zIHRoZSBzcGVjaWZpZWQgY2xvc3VyZXMgdG9nZXRoZXIuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIENoYWluZWRDbG9zdXJlIGltcGxlbWVudHMgQ2xvc3VyZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzUyMDY3NzIyNTc2NjkwMTI0MEw7Ci0KLSAgICAvKiogVGhlIGNsb3N1cmVzIHRvIGNhbGwgaW4gdHVybiAqLwotICAgIHByaXZhdGUgZmluYWwgQ2xvc3VyZVtdIGlDbG9zdXJlczsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbiBhbmQgY29waWVzIHRoZSBwYXJhbWV0ZXIgYXJyYXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsb3N1cmVzICB0aGUgY2xvc3VyZXMgdG8gY2hhaW4sIGNvcGllZCwgbm8gbnVsbHMKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5jaGFpbmVkPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNsb3N1cmVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY2xvc3VyZSBpbiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBnZXRJbnN0YW5jZShDbG9zdXJlW10gY2xvc3VyZXMpIHsKLSAgICAgICAgRnVuY3RvclV0aWxzLnZhbGlkYXRlKGNsb3N1cmVzKTsKLSAgICAgICAgaWYgKGNsb3N1cmVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9QQ2xvc3VyZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICBjbG9zdXJlcyA9IEZ1bmN0b3JVdGlscy5jb3B5KGNsb3N1cmVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmVkQ2xvc3VyZShjbG9zdXJlcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbG9zdXJlIHRoYXQgY2FsbHMgZWFjaCBjbG9zdXJlIGluIHR1cm4sIHBhc3NpbmcgdGhlIAotICAgICAqIHJlc3VsdCBpbnRvIHRoZSBuZXh0IGNsb3N1cmUuIFRoZSBvcmRlcmluZyBpcyB0aGF0IG9mIHRoZSBpdGVyYXRvcigpCi0gICAgICogbWV0aG9kIG9uIHRoZSBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbG9zdXJlcyAgYSBjb2xsZWN0aW9uIG9mIGNsb3N1cmVzIHRvIGNoYWluCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y2hhaW5lZDwvY29kZT4gY2xvc3VyZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjbG9zdXJlcyBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY2xvc3VyZSBpbiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGdldEluc3RhbmNlKENvbGxlY3Rpb24gY2xvc3VyZXMpIHsKLSAgICAgICAgaWYgKGNsb3N1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsb3N1cmUgY29sbGVjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsb3N1cmVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9QQ2xvc3VyZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGxpa2UgdGhpcyB0byBndWFyYW50ZWUgaXRlcmF0b3IoKSBvcmRlcmluZwotICAgICAgICBDbG9zdXJlW10gY21kcyA9IG5ldyBDbG9zdXJlW2Nsb3N1cmVzLnNpemUoKV07Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNsb3N1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGNtZHNbaSsrXSA9IChDbG9zdXJlKSBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgRnVuY3RvclV0aWxzLnZhbGlkYXRlKGNtZHMpOwotICAgICAgICByZXR1cm4gbmV3IENoYWluZWRDbG9zdXJlKGNtZHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZTEgIHRoZSBmaXJzdCBjbG9zdXJlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjbG9zdXJlMiAgdGhlIHNlY29uZCBjbG9zdXJlLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNoYWluZWQ8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgY2xvc3VyZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGdldEluc3RhbmNlKENsb3N1cmUgY2xvc3VyZTEsIENsb3N1cmUgY2xvc3VyZTIpIHsKLSAgICAgICAgaWYgKGNsb3N1cmUxID09IG51bGwgfHwgY2xvc3VyZTIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xvc3VyZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENsb3N1cmVbXSBjbG9zdXJlcyA9IG5ldyBDbG9zdXJlW10geyBjbG9zdXJlMSwgY2xvc3VyZTIgfTsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmVkQ2xvc3VyZShjbG9zdXJlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIHRoZSBjbG9zdXJlcyB0byBjaGFpbiwgbm90IGNvcGllZCwgbm8gbnVsbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hhaW5lZENsb3N1cmUoQ2xvc3VyZVtdIGNsb3N1cmVzKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlDbG9zdXJlcyA9IGNsb3N1cmVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBsaXN0IG9mIGNsb3N1cmVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCBwYXNzZWQgdG8gZWFjaCBjbG9zdXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ2xvc3VyZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlDbG9zdXJlc1tpXS5leGVjdXRlKGlucHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsb3N1cmVzLCBkbyBub3QgbW9kaWZ5IHRoZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlW10gZ2V0Q2xvc3VyZXMoKSB7Ci0gICAgICAgIHJldHVybiBpQ2xvc3VyZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZFRyYW5zZm9ybWVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2hhaW5lZFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhODA5MDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NoYWluZWRUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gdGhhdCBjaGFpbnMgdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1lcnMgdG9nZXRoZXIuCi0gKiA8cD4KLSAqIFRoZSBpbnB1dCBvYmplY3QgaXMgcGFzc2VkIHRvIHRoZSBmaXJzdCB0cmFuc2Zvcm1lci4gVGhlIHRyYW5zZm9ybWVkIHJlc3VsdAotICogaXMgcGFzc2VkIHRvIHRoZSBzZWNvbmQgdHJhbnNmb3JtZXIgYW5kIHNvIG9uLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbmVkVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNTE0OTQ1MDc0NzMzMTYwMTk2TDsKLQotICAgIC8qKiBUaGUgdHJhbnNmb3JtZXJzIHRvIGNhbGwgaW4gdHVybiAqLwotICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXJbXSBpVHJhbnNmb3JtZXJzOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdGhhdCBwZXJmb3JtcyB2YWxpZGF0aW9uIGFuZCBjb3BpZXMgdGhlIHBhcmFtZXRlciBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXJzICB0aGUgdHJhbnNmb3JtZXJzIHRvIGNoYWluLCBjb3BpZWQsIG5vIG51bGxzCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y2hhaW5lZDwvY29kZT4gdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNmb3JtZXJzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgdHJhbnNmb3JtZXIgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKFRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzKSB7Ci0gICAgICAgIEZ1bmN0b3JVdGlscy52YWxpZGF0ZSh0cmFuc2Zvcm1lcnMpOwotICAgICAgICBpZiAodHJhbnNmb3JtZXJzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9QVHJhbnNmb3JtZXIuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhbnNmb3JtZXJzID0gRnVuY3RvclV0aWxzLmNvcHkodHJhbnNmb3JtZXJzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmVkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgZWFjaCB0cmFuc2Zvcm1lciBpbiB0dXJuLCBwYXNzaW5nIHRoZSAKLSAgICAgKiByZXN1bHQgaW50byB0aGUgbmV4dCB0cmFuc2Zvcm1lci4gVGhlIG9yZGVyaW5nIGlzIHRoYXQgb2YgdGhlIGl0ZXJhdG9yKCkKLSAgICAgKiBtZXRob2Qgb24gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVycyAgYSBjb2xsZWN0aW9uIG9mIHRyYW5zZm9ybWVycyB0byBjaGFpbgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNoYWluZWQ8L2NvZGU+IHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zZm9ybWVycyBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0SW5zdGFuY2UoQ29sbGVjdGlvbiB0cmFuc2Zvcm1lcnMpIHsKLSAgICAgICAgaWYgKHRyYW5zZm9ybWVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUcmFuc2Zvcm1lciBjb2xsZWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHJhbnNmb3JtZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9QVHJhbnNmb3JtZXIuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY29udmVydCB0byBhcnJheSBsaWtlIHRoaXMgdG8gZ3VhcmFudGVlIGl0ZXJhdG9yKCkgb3JkZXJpbmcKLSAgICAgICAgVHJhbnNmb3JtZXJbXSBjbWRzID0gbmV3IFRyYW5zZm9ybWVyW3RyYW5zZm9ybWVycy5zaXplKCldOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB0cmFuc2Zvcm1lcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgY21kc1tpKytdID0gKFRyYW5zZm9ybWVyKSBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgRnVuY3RvclV0aWxzLnZhbGlkYXRlKGNtZHMpOwotICAgICAgICByZXR1cm4gbmV3IENoYWluZWRUcmFuc2Zvcm1lcihjbWRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyMSAgdGhlIGZpcnN0IHRyYW5zZm9ybWVyLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcjIgIHRoZSBzZWNvbmQgdHJhbnNmb3JtZXIsIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y2hhaW5lZDwvY29kZT4gdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0SW5zdGFuY2UoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIxLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjIpIHsKLSAgICAgICAgaWYgKHRyYW5zZm9ybWVyMSA9PSBudWxsIHx8IHRyYW5zZm9ybWVyMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUcmFuc2Zvcm1lcnMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIFRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IFRyYW5zZm9ybWVyW10geyB0cmFuc2Zvcm1lcjEsIHRyYW5zZm9ybWVyMiB9OwotICAgICAgICByZXR1cm4gbmV3IENoYWluZWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVycyAgdGhlIHRyYW5zZm9ybWVycyB0byBjaGFpbiwgbm90IGNvcGllZCwgbm8gbnVsbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hhaW5lZFRyYW5zZm9ybWVyKFRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlUcmFuc2Zvcm1lcnMgPSB0cmFuc2Zvcm1lcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdG8gcmVzdWx0IHZpYSBlYWNoIGRlY29yYXRlZCB0cmFuc2Zvcm1lcgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QgcGFzc2VkIHRvIHRoZSBmaXJzdCB0cmFuc2Zvcm1lcgotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpVHJhbnNmb3JtZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBvYmplY3QgPSBpVHJhbnNmb3JtZXJzW2ldLnRyYW5zZm9ybShvYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXJzLCBkbyBub3QgbW9kaWZ5IHRoZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcnMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKSB7Ci0gICAgICAgIHJldHVybiBpVHJhbnNmb3JtZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0Nsb25lVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9uZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZmYxODYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0Nsb25lVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgYSBjbG9uZSBvZiB0aGUgaW5wdXQgb2JqZWN0LgotICogPHA+Ci0gKiBDbG9uZSBpcyBwZXJmb3JtZWQgdXNpbmcgPGNvZGU+UHJvdG90eXBlRmFjdG9yeS5nZXRJbnN0YW5jZShpbnB1dCkuY3JlYXRlKCk8L2NvZGU+LgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9uZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgxODg3NDI3MDk0OTk2NTI1NjdMOwotCi0gICAgLyoqIFNpbmdsZXRvbiBwcmVkaWNhdGUgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IENsb25lVHJhbnNmb3JtZXIoKTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgcmV0dXJuaW5nIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbG9uZVRyYW5zZm9ybWVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IHRvIHJlc3VsdCBieSBjbG9uaW5nIGl0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQcm90b3R5cGVGYWN0b3J5LmdldEluc3RhbmNlKGlucHV0KS5jcmVhdGUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9zdXJlVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9DbG9zdXJlVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YwYjFhNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ2xvc3VyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ2xvc3VyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gdGhhdCBjYWxscyBhIENsb3N1cmUgdXNpbmcgdGhlIGlucHV0IG9iamVjdAotICogYW5kIHRoZW4gcmV0dXJucyB0aGUgaW5wdXQuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIENsb3N1cmVUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3ODQ2NjkwMTQ0ODYxNzI4Nkw7Ci0KLSAgICAvKiogVGhlIGNsb3N1cmUgdG8gd3JhcCAqLwotICAgIHByaXZhdGUgZmluYWwgQ2xvc3VyZSBpQ2xvc3VyZTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZSAgdGhlIGNsb3N1cmUgdG8gY2FsbCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5jbG9zdXJlPC9jb2RlPiB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjbG9zdXJlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbG9zdXJlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVUcmFuc2Zvcm1lcihjbG9zdXJlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbG9zdXJlICB0aGUgY2xvc3VyZSB0byBjYWxsLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlVHJhbnNmb3JtZXIoQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlDbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCB0byByZXN1bHQgYnkgZXhlY3V0aW5nIGEgY2xvc3VyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QgdG8gdHJhbnNmb3JtCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIGlDbG9zdXJlLmV4ZWN1dGUoaW5wdXQpOwotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2xvc3VyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIGlDbG9zdXJlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NvbnN0YW50RmFjdG9yeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NvbnN0YW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Y2I3YWRjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Db25zdGFudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRoZSBzYW1lIGNvbnN0YW50IGVhY2ggdGltZS4KLSAqIDxwPgotICogTm8gY2hlY2sgaXMgbWFkZSB0aGF0IHRoZSBvYmplY3QgaXMgaW1tdXRhYmxlLiBJbiBnZW5lcmFsLCBvbmx5IGltbXV0YWJsZQotICogb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBjb25zdGFudCBmYWN0b3J5LiBNdXRhYmxlIG9iamVjdHMgc2hvdWxkCi0gKiB1c2UgdGhlIHByb3RvdHlwZSBmYWN0b3J5LgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudEZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5LCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNTIwNjc3MjI1NzY2OTAxMjQwTDsKLSAgICAKLSAgICAvKiogUmV0dXJucyBudWxsIGVhY2ggdGltZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmFjdG9yeSBOVUxMX0lOU1RBTkNFID0gbmV3IENvbnN0YW50RmFjdG9yeShudWxsKTsKLQotICAgIC8qKiBUaGUgY2xvc3VyZXMgdG8gY2FsbCBpbiB0dXJuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgaUNvbnN0YW50OwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdGhhdCBwZXJmb3JtcyB2YWxpZGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN0YW50VG9SZXR1cm4gIHRoZSBjb25zdGFudCBvYmplY3QgdG8gcmV0dXJuIGVhY2ggdGltZSBpbiB0aGUgZmFjdG9yeQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNvbnN0YW50PC9jb2RlPiBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBnZXRJbnN0YW5jZShPYmplY3QgY29uc3RhbnRUb1JldHVybikgewotICAgICAgICBpZiAoY29uc3RhbnRUb1JldHVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTF9JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50RmFjdG9yeShjb25zdGFudFRvUmV0dXJuKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRUb1JldHVybiAgdGhlIGNvbnN0YW50IHRvIHJldHVybiBlYWNoIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RhbnRGYWN0b3J5KE9iamVjdCBjb25zdGFudFRvUmV0dXJuKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlDb25zdGFudCA9IGNvbnN0YW50VG9SZXR1cm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIHJldHVybiBjb25zdGFudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgY29uc3RhbnQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlDb25zdGFudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25zdGFudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29uc3RhbnQoKSB7Ci0gICAgICAgIHJldHVybiBpQ29uc3RhbnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ29uc3RhbnRUcmFuc2Zvcm1lci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0NvbnN0YW50VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE4YmQ5MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvQ29uc3RhbnRUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2FtZSBjb25zdGFudCBlYWNoIHRpbWUuCi0gKiA8cD4KLSAqIE5vIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgb2JqZWN0IGlzIGltbXV0YWJsZS4gSW4gZ2VuZXJhbCwgb25seSBpbW11dGFibGUKLSAqIG9iamVjdHMgc2hvdWxkIHVzZSB0aGUgY29uc3RhbnQgZmFjdG9yeS4gTXV0YWJsZSBvYmplY3RzIHNob3VsZAotICogdXNlIHRoZSBwcm90b3R5cGUgZmFjdG9yeS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNzQ0NDA3MjYzNjkwNTUxMjRMOwotICAgIAotICAgIC8qKiBSZXR1cm5zIG51bGwgZWFjaCB0aW1lICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBOVUxMX0lOU1RBTkNFID0gbmV3IENvbnN0YW50VHJhbnNmb3JtZXIobnVsbCk7Ci0KLSAgICAvKiogVGhlIGNsb3N1cmVzIHRvIGNhbGwgaW4gdHVybiAqLwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGlDb25zdGFudDsKLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybWVyIG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3RhbnRUb1JldHVybiAgdGhlIGNvbnN0YW50IG9iamVjdCB0byByZXR1cm4gZWFjaCB0aW1lIGluIHRoZSBmYWN0b3J5Ci0gICAgICogQHJldHVybiB0aGUgPGNvZGU+Y29uc3RhbnQ8L2NvZGU+IGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBnZXRJbnN0YW5jZShPYmplY3QgY29uc3RhbnRUb1JldHVybikgewotICAgICAgICBpZiAoY29uc3RhbnRUb1JldHVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTF9JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50VHJhbnNmb3JtZXIoY29uc3RhbnRUb1JldHVybik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnN0YW50VG9SZXR1cm4gIHRoZSBjb25zdGFudCB0byByZXR1cm4gZWFjaCB0aW1lCi0gICAgICovCi0gICAgcHVibGljIENvbnN0YW50VHJhbnNmb3JtZXIoT2JqZWN0IGNvbnN0YW50VG9SZXR1cm4pIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaUNvbnN0YW50ID0gY29uc3RhbnRUb1JldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBieSBpZ25vcmluZyBpdCBhbmQgcmV0dXJuaW5nIHRoZSBzdG9yZWQgY29uc3RhbnQgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3Qgd2hpY2ggaXMgaWdub3JlZAotICAgICAqIEByZXR1cm4gdGhlIHN0b3JlZCBjb25zdGFudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBpbnB1dCkgewotICAgICAgICByZXR1cm4gaUNvbnN0YW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnN0YW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0YW50Ci0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRDb25zdGFudCgpIHsKLSAgICAgICAgcmV0dXJuIGlDb25zdGFudDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FcXVhbFByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0VxdWFsUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiOGNmYWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0VxdWFsUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgdGhlIHNhbWUgb2JqZWN0Ci0gKiBhcyB0aGUgb25lIHN0b3JlZCBpbiB0aGlzIHByZWRpY2F0ZSBieSBlcXVhbHMuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVxdWFsUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU2MzM3NjY5NzgwMjk5MDcwODlMOwotCi0gICAgLyoqIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRvICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgaVZhbHVlOwotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBpZGVudGl0eSBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOdWxsUHJlZGljYXRlLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRXF1YWxQcmVkaWNhdGUob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0bwotICAgICAqLwotICAgIHB1YmxpYyBFcXVhbFByZWRpY2F0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlWYWx1ZSA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHByZWRpY2F0ZSByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgaW5wdXQgZXF1YWxzIHRoZSBzdG9yZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnB1dCBvYmplY3QgZXF1YWxzIHN0b3JlZCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIChpVmFsdWUuZXF1YWxzKG9iamVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlWYWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25DbG9zdXJlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXhjZXB0aW9uQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjRhODMzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25DbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ2xvc3VyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRnVuY3RvckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24uCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4Y2VwdGlvbkNsb3N1cmUgaW1wbGVtZW50cyBDbG9zdXJlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcxNzkxMDYwMzIxMjE5ODU1NDVMOwotICAgIAotCi0gICAgLyoqIFNpbmdsZXRvbiBwcmVkaWNhdGUgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsb3N1cmUgSU5TVEFOQ0UgPSBuZXcgRXhjZXB0aW9uQ2xvc3VyZSgpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRXhjZXB0aW9uQ2xvc3VyZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbHdheXMgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEB0aHJvd3MgRnVuY3RvckV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCkgewotICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiRXhjZXB0aW9uQ2xvc3VyZSBpbnZva2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXhjZXB0aW9uRmFjdG9yeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWViZGY5Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRXhjZXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkZ1bmN0b3JFeGNlcHRpb247Ci0KLS8qKgotICogRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeGNlcHRpb25GYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTc5MTA2MDMyMTIxOTg1NTQ1TDsKLSAgICAKLQotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGYWN0b3J5IElOU1RBTkNFID0gbmV3IEV4Y2VwdGlvbkZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgcmV0dXJuaW5nIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBuZXZlcgotICAgICAqIEB0aHJvd3MgRnVuY3RvckV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIkV4Y2VwdGlvbkZhY3RvcnkgaW52b2tlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzQzY2JhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25QcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24uCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4Y2VwdGlvblByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTc5MTA2MDMyMTIxOTg1NTQ1TDsKLSAgICAKLSAgICAvKiogU2luZ2xldG9uIHByZWRpY2F0ZSBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlIElOU1RBTkNFID0gbmV3IEV4Y2VwdGlvblByZWRpY2F0ZSgpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RyaWN0ZWQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFeGNlcHRpb25QcmVkaWNhdGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgYWx3YXlzIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICogQHJldHVybiBuZXZlcgotICAgICAqIEB0aHJvd3MgRnVuY3RvckV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKCJFeGNlcHRpb25QcmVkaWNhdGUgaW52b2tlZCIpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9FeGNlcHRpb25UcmFuc2Zvcm1lci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4OTVkNzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0V4Y2VwdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRnVuY3RvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhbHdheXMgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhjZXB0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTc5MTA2MDMyMTIxOTg1NTQ1TDsKLSAgICAKLQotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBFeGNlcHRpb25UcmFuc2Zvcm1lcigpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvblRyYW5zZm9ybWVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IHRvIHJlc3VsdCBieSBjbG9uaW5nIGl0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIG5ldmVyCi0gICAgICogQHRocm93cyBGdW5jdG9yRXhjZXB0aW9uIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBpbnB1dCkgewotICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiRXhjZXB0aW9uVHJhbnNmb3JtZXIgaW52b2tlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhY3RvcnlUcmFuc2Zvcm1lci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhY3RvcnlUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTkyZjZlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9GYWN0b3J5VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIGEgRmFjdG9yeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWN0b3J5VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjgxNzY3NDUwMjQ3NTM1MzE2MEw7Ci0KLSAgICAvKiogVGhlIGZhY3RvcnkgdG8gd3JhcCAqLwotICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBpRmFjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgdGhlIGZhY3RvcnkgdG8gY2FsbCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5mYWN0b3J5PC9jb2RlPiB0cmFuc2Zvcm1lcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnlUcmFuc2Zvcm1lcihmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byBjYWxsLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBGYWN0b3J5VHJhbnNmb3JtZXIoRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBieSBpZ25vcmluZyB0aGUgaW5wdXQgYW5kIHJldHVybmluZyB0aGUgcmVzdWx0IG9mCi0gICAgICogY2FsbGluZyB0aGUgZGVjb3JhdGVkIGZhY3RvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlucHV0ICB0aGUgaW5wdXQgb2JqZWN0IHRvIHRyYW5zZm9ybQotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBpbnB1dCkgewotICAgICAgICByZXR1cm4gaUZhY3RvcnkuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmFjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5Ci0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGlGYWN0b3J5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ZhbHNlUHJlZGljYXRlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRmFsc2VQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlYzM2NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRmFsc2VQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgZmFsc2UuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZhbHNlUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc1MzM3ODQ0NTQ4MzI3NjQzODhMOwotICAgIAotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgSU5TVEFOQ0UgPSBuZXcgRmFsc2VQcmVkaWNhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgcmV0dXJuaW5nIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRmFsc2VQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgcmV0dXJuaW5nIGZhbHNlIGFsd2F5cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICogQHJldHVybiBmYWxzZSBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Gb3JDbG9zdXJlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRm9yQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTNjNWRmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Gb3JDbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNsb3N1cmU7Ci0KLS8qKgotICogQ2xvc3VyZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIGFub3RoZXIgY2xvc3VyZSBuIHRpbWVzLCBsaWtlIGEgZm9yIGxvb3AuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEZvckNsb3N1cmUgaW1wbGVtZW50cyBDbG9zdXJlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTkwMTIwNTMzMzkzNjIxNjc0TDsKLQotICAgIC8qKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGxvb3AgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBpQ291bnQ7Ci0gICAgLyoqIFRoZSBjbG9zdXJlIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgaUNsb3N1cmU7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQSBudWxsIGNsb3N1cmUgb3IgemVybyBjb3VudCByZXR1cm5zIHRoZSA8Y29kZT5OT1BDbG9zdXJlPC9jb2RlPi4KLSAgICAgKiBBIGNvdW50IG9mIG9uZSByZXR1cm5zIHRoZSBzcGVjaWZpZWQgY2xvc3VyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY291bnQgIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSB0aGUgY2xvc3VyZQotICAgICAqIEBwYXJhbSBjbG9zdXJlICB0aGUgY2xvc3VyZSB0byBleGVjdXRlLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmZvcjwvY29kZT4gY2xvc3VyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBnZXRJbnN0YW5jZShpbnQgY291bnQsIENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICBpZiAoY291bnQgPD0gMCB8fCBjbG9zdXJlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT1BDbG9zdXJlLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZvckNsb3N1cmUoY291bnQsIGNsb3N1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvdW50ICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgdGhlIGNsb3N1cmUKLSAgICAgKiBAcGFyYW0gY2xvc3VyZSAgdGhlIGNsb3N1cmUgdG8gZXhlY3V0ZSwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9yQ2xvc3VyZShpbnQgY291bnQsIENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpQ291bnQgPSBjb3VudDsKLSAgICAgICAgaUNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBjbG9zdXJlIDxjb2RlPmNvdW50PC9jb2RlPiB0aW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpQ2xvc3VyZS5leGVjdXRlKGlucHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsb3N1cmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xvc3VyZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBpQ2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb3VudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3VudAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBpQ291bnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRnVuY3RvclV0aWxzLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvRnVuY3RvclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmY2RmYTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0Z1bmN0b3JVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5DbG9zdXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIEludGVybmFsIHV0aWxpdGllcyBmb3IgZnVuY3RvcnMuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgTWF0dCBCZW5zb24KLSAqLwotY2xhc3MgRnVuY3RvclV0aWxzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgRnVuY3RvclV0aWxzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbG9uZSB0aGUgcHJlZGljYXRlcyB0byBlbnN1cmUgdGhhdCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlIGNhbid0IGJlIG1lc3NlZCB3aXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjb3B5Ci0gICAgICogQHJldHVybiB0aGUgY2xvbmVkIHByZWRpY2F0ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgUHJlZGljYXRlW10gY29weShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoUHJlZGljYXRlW10pIHByZWRpY2F0ZXMuY2xvbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIHByZWRpY2F0ZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGlzIHdlbGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIHZhbGlkYXRlCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgdmFsaWRhdGUoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICBpZiAocHJlZGljYXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJlZGljYXRlIGFycmF5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZWRpY2F0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmVkaWNhdGVzW2ldID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJlZGljYXRlIGFycmF5IG11c3Qgbm90IGNvbnRhaW4gYSBudWxsIHByZWRpY2F0ZSwgaW5kZXggIiArIGkgKyAiIHdhcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIHByZWRpY2F0ZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGlzIHdlbGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIHZhbGlkYXRlCi0gICAgICogQHJldHVybiBwcmVkaWNhdGUgYXJyYXkKLSAgICAgKi8KLSAgICBzdGF0aWMgUHJlZGljYXRlW10gdmFsaWRhdGUoQ29sbGVjdGlvbiBwcmVkaWNhdGVzKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwcmVkaWNhdGUgY29sbGVjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY29udmVydCB0byBhcnJheSBsaWtlIHRoaXMgdG8gZ3VhcmFudGVlIGl0ZXJhdG9yKCkgb3JkZXJpbmcKLSAgICAgICAgUHJlZGljYXRlW10gcHJlZHMgPSBuZXcgUHJlZGljYXRlW3ByZWRpY2F0ZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJlZGljYXRlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwcmVkc1tpXSA9IChQcmVkaWNhdGUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwcmVkc1tpXSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHByZWRpY2F0ZSBjb2xsZWN0aW9uIG11c3Qgbm90IGNvbnRhaW4gYSBudWxsIHByZWRpY2F0ZSwgaW5kZXggIiArIGkgKyAiIHdhcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWRzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbG9uZSB0aGUgY2xvc3VyZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGludGVybmFsIHJlZmVyZW5jZSBjYW4ndCBiZSBtZXNzZWQgd2l0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIHRoZSBjbG9zdXJlcyB0byBjb3B5Ci0gICAgICogQHJldHVybiB0aGUgY2xvbmVkIGNsb3N1cmVzCi0gICAgICovCi0gICAgc3RhdGljIENsb3N1cmVbXSBjb3B5KENsb3N1cmVbXSBjbG9zdXJlcykgewotICAgICAgICBpZiAoY2xvc3VyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChDbG9zdXJlW10pIGNsb3N1cmVzLmNsb25lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBjbG9zdXJlcyB0byBlbnN1cmUgdGhhdCBhbGwgaXMgd2VsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc3VyZXMgIHRoZSBjbG9zdXJlcyB0byB2YWxpZGF0ZQotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlKENsb3N1cmVbXSBjbG9zdXJlcykgewotICAgICAgICBpZiAoY2xvc3VyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsb3N1cmUgYXJyYXkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xvc3VyZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjbG9zdXJlc1tpXSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsb3N1cmUgYXJyYXkgbXVzdCBub3QgY29udGFpbiBhIG51bGwgY2xvc3VyZSwgaW5kZXggIiArIGkgKyAiIHdhcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IG1ldGhvZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcnMgIHRoZSB0cmFuc2Zvcm1lcnMgdG8gY29weQotICAgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGUgdHJhbnNmb3JtZXJzCi0gICAgICovCi0gICAgc3RhdGljIFRyYW5zZm9ybWVyW10gY29weShUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycykgewotICAgICAgICBpZiAodHJhbnNmb3JtZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoVHJhbnNmb3JtZXJbXSkgdHJhbnNmb3JtZXJzLmNsb25lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIG1ldGhvZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcnMgIHRoZSB0cmFuc2Zvcm1lcnMgdG8gdmFsaWRhdGUKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZShUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycykgewotICAgICAgICBpZiAodHJhbnNmb3JtZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB0cmFuc2Zvcm1lciBhcnJheSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcnNbaV0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdHJhbnNmb3JtZXIgYXJyYXkgbXVzdCBub3QgY29udGFpbiBhIG51bGwgdHJhbnNmb3JtZXIsIGluZGV4ICIgKyBpICsgIiB3YXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWRlbnRpdHlQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JZGVudGl0eVByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTQ4NWIzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JZGVudGl0eVByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGlzIHRoZSBzYW1lIG9iamVjdAotICogYXMgdGhlIG9uZSBzdG9yZWQgaW4gdGhpcyBwcmVkaWNhdGUuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElkZW50aXR5UHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTkwMTY1ODQ5NDUyMzI5M0w7Ci0KLSAgICAKLSAgICAvKiogVGhlIHZhbHVlIHRvIGNvbXBhcmUgdG8gKi8KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBpVmFsdWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIGlkZW50aXR5IHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE51bGxQcmVkaWNhdGUuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eVByZWRpY2F0ZShvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICovCi0gICAgcHVibGljIElkZW50aXR5UHJlZGljYXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVZhbHVlID0gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIHRoZSBpbnB1dCBvYmplY3QgaXMgaWRlbnRpY2FsIHRvCi0gICAgICogdGhlIHN0b3JlZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnB1dCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgdGhlIHN0b3JlZCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIChpVmFsdWUgPT0gb2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBpVmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWZDbG9zdXJlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSWZDbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhZTg5NjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0lmQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIGFjdHMgYXMgYW4gaWYgc3RhdGVtZW50IGNhbGxpbmcgb25lIG9yIG90aGVyIGNsb3N1cmUKLSAqIGJhc2VkIG9uIGEgcHJlZGljYXRlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHQgQmVuc29uCi0gKi8KLXB1YmxpYyBjbGFzcyBJZkNsb3N1cmUgaW1wbGVtZW50cyBDbG9zdXJlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM1MTg0NzczMDg0NjY0ODYxMzBMOwotCi0gICAgLyoqIFRoZSB0ZXN0ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgaVByZWRpY2F0ZTsKLSAgICAvKiogVGhlIGNsb3N1cmUgdG8gdXNlIGlmIHRydWUgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgaVRydWVDbG9zdXJlOwotICAgIC8qKiBUaGUgY2xvc3VyZSB0byB1c2UgaWYgZmFsc2UgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgaUZhbHNlQ2xvc3VyZTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIGNsb3N1cmUgdGhhdCBwZXJmb3JtcyBubyBhY3Rpb24gd2hlbgotICAgICAqIHRoZSBwcmVkaWNhdGUgaXMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgcHJlZGljYXRlIHRvIHN3aXRjaCBvbgotICAgICAqIEBwYXJhbSB0cnVlQ2xvc3VyZSAgY2xvc3VyZSB1c2VkIGlmIHRydWUKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5pZjwvY29kZT4gY2xvc3VyZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVpdGhlciBhcmd1bWVudCBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGdldEluc3RhbmNlKFByZWRpY2F0ZSBwcmVkaWNhdGUsIENsb3N1cmUgdHJ1ZUNsb3N1cmUpIHsKLSAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKHByZWRpY2F0ZSwgdHJ1ZUNsb3N1cmUsIE5PUENsb3N1cmUuSU5TVEFOQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICBwcmVkaWNhdGUgdG8gc3dpdGNoIG9uCi0gICAgICogQHBhcmFtIHRydWVDbG9zdXJlICBjbG9zdXJlIHVzZWQgaWYgdHJ1ZQotICAgICAqIEBwYXJhbSBmYWxzZUNsb3N1cmUgIGNsb3N1cmUgdXNlZCBpZiBmYWxzZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmlmPC9jb2RlPiBjbG9zdXJlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGFyZ3VtZW50IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0SW5zdGFuY2UoUHJlZGljYXRlIHByZWRpY2F0ZSwgQ2xvc3VyZSB0cnVlQ2xvc3VyZSwgQ2xvc3VyZSBmYWxzZUNsb3N1cmUpIHsKLSAgICAgICAgaWYgKHByZWRpY2F0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcmVkaWNhdGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cnVlQ2xvc3VyZSA9PSBudWxsIHx8IGZhbHNlQ2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbG9zdXJlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJZkNsb3N1cmUocHJlZGljYXRlLCB0cnVlQ2xvc3VyZSwgZmFsc2VDbG9zdXJlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGNsb3N1cmUgdGhhdCBwZXJmb3JtcyBubyBhY3Rpb24gd2hlbgotICAgICAqIHRoZSBwcmVkaWNhdGUgaXMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgcHJlZGljYXRlIHRvIHN3aXRjaCBvbiwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gdHJ1ZUNsb3N1cmUgIGNsb3N1cmUgdXNlZCBpZiB0cnVlLCBub3QgbnVsbAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBJZkNsb3N1cmUoUHJlZGljYXRlIHByZWRpY2F0ZSwgQ2xvc3VyZSB0cnVlQ2xvc3VyZSkgewotICAgICAgICB0aGlzKHByZWRpY2F0ZSwgdHJ1ZUNsb3N1cmUsIE5PUENsb3N1cmUuSU5TVEFOQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgcHJlZGljYXRlIHRvIHN3aXRjaCBvbiwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gdHJ1ZUNsb3N1cmUgIGNsb3N1cmUgdXNlZCBpZiB0cnVlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBmYWxzZUNsb3N1cmUgIGNsb3N1cmUgdXNlZCBpZiBmYWxzZSwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgSWZDbG9zdXJlKFByZWRpY2F0ZSBwcmVkaWNhdGUsIENsb3N1cmUgdHJ1ZUNsb3N1cmUsIENsb3N1cmUgZmFsc2VDbG9zdXJlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlQcmVkaWNhdGUgPSBwcmVkaWNhdGU7Ci0gICAgICAgIGlUcnVlQ2xvc3VyZSA9IHRydWVDbG9zdXJlOwotICAgICAgICBpRmFsc2VDbG9zdXJlID0gZmFsc2VDbG9zdXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0cnVlIG9yIGZhbHNlIGNsb3N1cmUgYWNjb3JpbmcgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIGlmIChpUHJlZGljYXRlLmV2YWx1YXRlKGlucHV0KSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBpVHJ1ZUNsb3N1cmUuZXhlY3V0ZShpbnB1dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpRmFsc2VDbG9zdXJlLmV4ZWN1dGUoaW5wdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCkgewotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbG9zdXJlIGNhbGxlZCB3aGVuIHRydWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xvc3VyZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldFRydWVDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gaVRydWVDbG9zdXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsb3N1cmUgY2FsbGVkIHdoZW4gZmFsc2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xvc3VyZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldEZhbHNlQ2xvc3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIGlGYWxzZUNsb3N1cmU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSW5zdGFuY2VvZlByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbmNlb2ZQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI3Y2RiNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvSW5zdGFuY2VvZlByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGlzIGFuIGluc3RhbmNlb2YKLSAqIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGlzIHByZWRpY2F0ZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFuY2VvZlByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjY4MjY1NjkxMTAyNTE2NTU4NEw7Ci0KLSAgICAvKiogVGhlIHR5cGUgdG8gY29tcGFyZSB0byAqLwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgaVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIGlkZW50aXR5IHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdG8gY2hlY2sgZm9yLCBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGdldEluc3RhbmNlKENsYXNzIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHR5cGUgdG8gY2hlY2sgaW5zdGFuY2VvZiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZW9mUHJlZGljYXRlKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIHRvIGNoZWNrIGZvcgotICAgICAqLwotICAgIHB1YmxpYyBJbnN0YW5jZW9mUHJlZGljYXRlKENsYXNzIHR5cGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIHRoZSBpbnB1dCBvYmplY3QgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIGlucHV0IGlzIG9mIHN0b3JlZCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gKGlUeXBlLmlzSW5zdGFuY2Uob2JqZWN0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSB0byBjb21wYXJlIHRvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGlUeXBlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlRmFjdG9yeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzdkMjc3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW50aWF0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotCi0vKioKLSAqIEZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIGEgbmV3IG9iamVjdCBpbnN0YW5jZSBieSByZWZsZWN0aW9uLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50aWF0ZUZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5LCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFRoZSBzZXJpYWwgdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NzMyMjI2ODgxMDY5NDQ3OTU3TDsKLQotICAgIC8qKiBUaGUgY2xhc3MgdG8gY3JlYXRlICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBpQ2xhc3NUb0luc3RhbnRpYXRlOwotICAgIC8qKiBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1tdIGlQYXJhbVR5cGVzOwotICAgIC8qKiBUaGUgY29uc3RydWN0b3IgYXJndW1lbnRzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpQXJnczsKLSAgICAvKiogVGhlIGNvbnN0cnVjdG9yICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29uc3RydWN0b3IgaUNvbnN0cnVjdG9yID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xhc3NUb0luc3RhbnRpYXRlICB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHBhcmFtVHlwZXMgIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMKLSAgICAgKiBAcGFyYW0gYXJncyAgdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFudGlhdGUgZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBnZXRJbnN0YW5jZShDbGFzcyBjbGFzc1RvSW5zdGFudGlhdGUsIENsYXNzW10gcGFyYW1UeXBlcywgT2JqZWN0W10gYXJncykgewotICAgICAgICBpZiAoY2xhc3NUb0luc3RhbnRpYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIHRvIGluc3RhbnRpYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKChwYXJhbVR5cGVzID09IG51bGwpICYmIChhcmdzICE9IG51bGwpKQotICAgICAgICAgICAgfHwgKChwYXJhbVR5cGVzICE9IG51bGwpICYmIChhcmdzID09IG51bGwpKQotICAgICAgICAgICAgfHwgKChwYXJhbVR5cGVzICE9IG51bGwpICYmIChhcmdzICE9IG51bGwpICYmIChwYXJhbVR5cGVzLmxlbmd0aCAhPSBhcmdzLmxlbmd0aCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIgdHlwZXMgbXVzdCBtYXRjaCB0aGUgYXJndW1lbnRzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1UeXBlcyA9PSBudWxsIHx8IHBhcmFtVHlwZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGVGYWN0b3J5KGNsYXNzVG9JbnN0YW50aWF0ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbVR5cGVzID0gKENsYXNzW10pIHBhcmFtVHlwZXMuY2xvbmUoKTsKLSAgICAgICAgICAgIGFyZ3MgPSAoT2JqZWN0W10pIGFyZ3MuY2xvbmUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGVGYWN0b3J5KGNsYXNzVG9JbnN0YW50aWF0ZSwgcGFyYW1UeXBlcywgYXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc1RvSW5zdGFudGlhdGUgIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZQotICAgICAqLwotICAgIHB1YmxpYyBJbnN0YW50aWF0ZUZhY3RvcnkoQ2xhc3MgY2xhc3NUb0luc3RhbnRpYXRlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlDbGFzc1RvSW5zdGFudGlhdGUgPSBjbGFzc1RvSW5zdGFudGlhdGU7Ci0gICAgICAgIGlQYXJhbVR5cGVzID0gbnVsbDsKLSAgICAgICAgaUFyZ3MgPSBudWxsOwotICAgICAgICBmaW5kQ29uc3RydWN0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc1RvSW5zdGFudGlhdGUgIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZQotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLCBub3QgY2xvbmVkCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMsIG5vdCBjbG9uZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5zdGFudGlhdGVGYWN0b3J5KENsYXNzIGNsYXNzVG9JbnN0YW50aWF0ZSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlDbGFzc1RvSW5zdGFudGlhdGUgPSBjbGFzc1RvSW5zdGFudGlhdGU7Ci0gICAgICAgIGlQYXJhbVR5cGVzID0gcGFyYW1UeXBlczsKLSAgICAgICAgaUFyZ3MgPSBhcmdzOwotICAgICAgICBmaW5kQ29uc3RydWN0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmluZENvbnN0cnVjdG9yKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaUNvbnN0cnVjdG9yID0gaUNsYXNzVG9JbnN0YW50aWF0ZS5nZXRDb25zdHJ1Y3RvcihpUGFyYW1UeXBlcyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnN0YW50aWF0ZUZhY3Rvcnk6IFRoZSBjb25zdHJ1Y3RvciBtdXN0IGV4aXN0IGFuZCBiZSBwdWJsaWMgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB1c2luZyB0aGUgc3RvcmVkIGNvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIHsKLSAgICAgICAgLy8gbmVlZGVkIGZvciBwb3N0LXNlcmlhbGl6YXRpb24KLSAgICAgICAgaWYgKGlDb25zdHJ1Y3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5kQ29uc3RydWN0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaUNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGlBcmdzKTsKLQotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiSW5zdGFudGlhdGVGYWN0b3J5OiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwgZXgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiSW5zdGFudGlhdGVGYWN0b3J5OiBDb25zdHJ1Y3RvciBtdXN0IGJlIHB1YmxpYyIsIGV4KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIkluc3RhbnRpYXRlRmFjdG9yeTogQ29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIiwgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnN0YW50aWF0ZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYTAyYjkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0luc3RhbnRpYXRlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgb2JqZWN0IGluc3RhbmNlIGJ5IHJlZmxlY3Rpb24uCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbnRpYXRlVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBUaGUgc2VyaWFsIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzg2Mzg4NzQwNzkzMzU2MzQ3TDsKLSAgICAKLSAgICAvKiogU2luZ2xldG9uIGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgbm8gYXJnIGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBOT19BUkdfSU5TVEFOQ0UgPSBuZXcgSW5zdGFudGlhdGVUcmFuc2Zvcm1lcigpOwotCi0gICAgLyoqIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gaVBhcmFtVHlwZXM7Ci0gICAgLyoqIFRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi8KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIGlBcmdzOwotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtZXIgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyAgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcwotICAgICAqIEBwYXJhbSBhcmdzICB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzCi0gICAgICogQHJldHVybiBhbiBpbnN0YW50aWF0ZSB0cmFuc2Zvcm1lcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0SW5zdGFuY2UoQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIGlmICgoKHBhcmFtVHlwZXMgPT0gbnVsbCkgJiYgKGFyZ3MgIT0gbnVsbCkpCi0gICAgICAgICAgICB8fCAoKHBhcmFtVHlwZXMgIT0gbnVsbCkgJiYgKGFyZ3MgPT0gbnVsbCkpCi0gICAgICAgICAgICB8fCAoKHBhcmFtVHlwZXMgIT0gbnVsbCkgJiYgKGFyZ3MgIT0gbnVsbCkgJiYgKHBhcmFtVHlwZXMubGVuZ3RoICE9IGFyZ3MubGVuZ3RoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciB0eXBlcyBtdXN0IG1hdGNoIHRoZSBhcmd1bWVudHMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbVR5cGVzID09IG51bGwgfHwgcGFyYW1UeXBlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0FSR19JTlNUQU5DRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZXMgPSAoQ2xhc3NbXSkgcGFyYW1UeXBlcy5jbG9uZSgpOwotICAgICAgICAgICAgYXJncyA9IChPYmplY3RbXSkgYXJncy5jbG9uZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGVUcmFuc2Zvcm1lcihwYXJhbVR5cGVzLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3Igbm8gYXJnIGluc3RhbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgSW5zdGFudGlhdGVUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVBhcmFtVHlwZXMgPSBudWxsOwotICAgICAgICBpQXJncyA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyAgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcywgbm90IGNsb25lZAotICAgICAqIEBwYXJhbSBhcmdzICB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzLCBub3QgY2xvbmVkCi0gICAgICovCi0gICAgcHVibGljIEluc3RhbnRpYXRlVHJhbnNmb3JtZXIoQ2xhc3NbXSBwYXJhbVR5cGVzLCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlQYXJhbVR5cGVzID0gcGFyYW1UeXBlczsKLSAgICAgICAgaUFyZ3MgPSBhcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IENsYXNzIG9iamVjdCB0byBhIHJlc3VsdCBieSBpbnN0YW50aWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENsYXNzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnN0YW50aWF0ZVRyYW5zZm9ybWVyOiBJbnB1dCBvYmplY3Qgd2FzIG5vdCBhbiBpbnN0YW5jZW9mIENsYXNzLCBpdCB3YXMgYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIChpbnB1dCA9PSBudWxsID8gIm51bGwgb2JqZWN0IiA6IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb24gPSAoKENsYXNzKSBpbnB1dCkuZ2V0Q29uc3RydWN0b3IoaVBhcmFtVHlwZXMpOwotICAgICAgICAgICAgcmV0dXJuIGNvbi5uZXdJbnN0YW5jZShpQXJncyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiSW5zdGFudGlhdGVUcmFuc2Zvcm1lcjogVGhlIGNvbnN0cnVjdG9yIG11c3QgZXhpc3QgYW5kIGJlIHB1YmxpYyAiKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIkluc3RhbnRpYXRlVHJhbnNmb3JtZXI6IEluc3RhbnRpYXRpb25FeGNlcHRpb24iLCBleCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKCJJbnN0YW50aWF0ZVRyYW5zZm9ybWVyOiBDb25zdHJ1Y3RvciBtdXN0IGJlIHB1YmxpYyIsIGV4KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIkluc3RhbnRpYXRlVHJhbnNmb3JtZXI6IENvbnN0cnVjdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiIsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ludm9rZXJUcmFuc2Zvcm1lci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL0ludm9rZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmE1OTYzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9JbnZva2VyVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRnVuY3RvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIGEgbmV3IG9iamVjdCBpbnN0YW5jZSBieSByZWZsZWN0aW9uLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZva2VyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBUaGUgc2VyaWFsIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODY1MzM4NTg0Njg5NDA0NzY4OEw7Ci0gICAgCi0gICAgLyoqIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaU1ldGhvZE5hbWU7Ci0gICAgLyoqIFRoZSBhcnJheSBvZiByZWZsZWN0aW9uIHBhcmFtZXRlciB0eXBlcyAqLwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3NbXSBpUGFyYW1UeXBlczsKLSAgICAvKiogVGhlIGFycmF5IG9mIHJlZmxlY3Rpb24gYXJndW1lbnRzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpQXJnczsKLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0cmFuc2Zvcm1lciBjYWxsaW5nIGEgc3BlY2lmaWMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lICB0aGUgbWV0aG9kIG5hbWUgdG8gY2FsbAotICAgICAqIEByZXR1cm4gYW4gaW52b2tlciB0cmFuc2Zvcm1lcgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0SW5zdGFuY2UoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1ldGhvZCB0byBpbnZva2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW52b2tlclRyYW5zZm9ybWVyKG1ldGhvZE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0cmFuc2Zvcm1lciBjYWxsaW5nIGEgc3BlY2lmaWMgbWV0aG9kIHdpdGggc3BlY2lmaWMgdmFsdWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lICB0aGUgbWV0aG9kIG5hbWUgdG8gY2FsbAotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBtZXRob2QKLSAgICAgKiBAcGFyYW0gYXJncyAgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIGFuIGludm9rZXIgdHJhbnNmb3JtZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtVHlwZXMsIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1ldGhvZCB0byBpbnZva2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoKHBhcmFtVHlwZXMgPT0gbnVsbCkgJiYgKGFyZ3MgIT0gbnVsbCkpCi0gICAgICAgICAgICB8fCAoKHBhcmFtVHlwZXMgIT0gbnVsbCkgJiYgKGFyZ3MgPT0gbnVsbCkpCi0gICAgICAgICAgICB8fCAoKHBhcmFtVHlwZXMgIT0gbnVsbCkgJiYgKGFyZ3MgIT0gbnVsbCkgJiYgKHBhcmFtVHlwZXMubGVuZ3RoICE9IGFyZ3MubGVuZ3RoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgdHlwZXMgbXVzdCBtYXRjaCB0aGUgYXJndW1lbnRzIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtVHlwZXMgPT0gbnVsbCB8fCBwYXJhbVR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludm9rZXJUcmFuc2Zvcm1lcihtZXRob2ROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZXMgPSAoQ2xhc3NbXSkgcGFyYW1UeXBlcy5jbG9uZSgpOwotICAgICAgICAgICAgYXJncyA9IChPYmplY3RbXSkgYXJncy5jbG9uZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VyVHJhbnNmb3JtZXIobWV0aG9kTmFtZSwgcGFyYW1UeXBlcywgYXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3Igbm8gYXJnIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lICB0aGUgbWV0aG9kIHRvIGNhbGwKLSAgICAgKi8KLSAgICBwcml2YXRlIEludm9rZXJUcmFuc2Zvcm1lcihTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgICAgIGlQYXJhbVR5cGVzID0gbnVsbDsKLSAgICAgICAgaUFyZ3MgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgIHRoZSBtZXRob2QgdG8gY2FsbAotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzICB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLCBub3QgY2xvbmVkCi0gICAgICogQHBhcmFtIGFyZ3MgIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMsIG5vdCBjbG9uZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2tlclRyYW5zZm9ybWVyKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtVHlwZXMsIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaU1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotICAgICAgICBpUGFyYW1UeXBlcyA9IHBhcmFtVHlwZXM7Ci0gICAgICAgIGlBcmdzID0gYXJnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCB0byByZXN1bHQgYnkgaW52b2tpbmcgYSBtZXRob2Qgb24gdGhlIGlucHV0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQsIG51bGwgaWYgbnVsbCBpbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBpbnB1dCkgewotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGlucHV0LmdldENsYXNzKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xzLmdldE1ldGhvZChpTWV0aG9kTmFtZSwgaVBhcmFtVHlwZXMpOwotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoaW5wdXQsIGlBcmdzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiSW52b2tlclRyYW5zZm9ybWVyOiBUaGUgbWV0aG9kICciICsgaU1ldGhvZE5hbWUgKyAiJyBvbiAnIiArIGlucHV0LmdldENsYXNzKCkgKyAiJyBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbigiSW52b2tlclRyYW5zZm9ybWVyOiBUaGUgbWV0aG9kICciICsgaU1ldGhvZE5hbWUgKyAiJyBvbiAnIiArIGlucHV0LmdldENsYXNzKCkgKyAiJyBjYW5ub3QgYmUgYWNjZXNzZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIkludm9rZXJUcmFuc2Zvcm1lcjogVGhlIG1ldGhvZCAnIiArIGlNZXRob2ROYW1lICsgIicgb24gJyIgKyBpbnB1dC5nZXRDbGFzcygpICsgIicgdGhyZXcgYW4gZXhjZXB0aW9uIiwgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTWFwVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9NYXBUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmE4ZDkzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9NYXBUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBoZWxkIGluIGEgc3BlY2lmaWVkIG1hcAotICogdXNpbmcgdGhlIGlucHV0IHBhcmFtZXRlciBhcyBhIGtleS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NjIzOTE4MDcwNDU0Njg5MzlMOwotICAgIAotICAgIC8qKiBUaGUgbWFwIG9mIGRhdGEgdG8gbG9va3VwIGluICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXAgaU1hcDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSB0cmFuc2Zvcm1lci4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWFwIGlzIG51bGwsIGEgdHJhbnNmb3JtZXIgdGhhdCBhbHdheXMgcmV0dXJucyBudWxsIGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgdGhlIG1hcCwgbm90IGNsb25lZAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBnZXRJbnN0YW5jZShNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50VHJhbnNmb3JtZXIuTlVMTF9JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1hcFRyYW5zZm9ybWVyKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIHVzZSBmb3IgbG9va3VwLCBub3QgY2xvbmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXBUcmFuc2Zvcm1lcihNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdG8gcmVzdWx0IGJ5IGxvb2tpbmcgaXQgdXAgaW4gYSA8Y29kZT5NYXA8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIGlNYXAuZ2V0KGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgdG8gbG9va3VwIGluLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0TWFwKCkgewotICAgICAgICByZXR1cm4gaU1hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BDbG9zdXJlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTk9QQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTIwY2YxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BDbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ2xvc3VyZTsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3RoaW5nLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBOT1BDbG9zdXJlIGltcGxlbWVudHMgQ2xvc3VyZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNTE4NDc3MzA4NDY2NDg2MTMwTDsKLQotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbG9zdXJlIElOU1RBTkNFID0gbmV3IE5PUENsb3N1cmUoKTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgcmV0dXJuaW5nIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIE5PUENsb3N1cmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gbm90aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTk9QVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmM2YTVmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OT1BUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3RoaW5nLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBOT1BUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxMzM4OTE3NDgzMTg1NzQ0OTBMOwotCi0gICAgLyoqIFNpbmdsZXRvbiBwcmVkaWNhdGUgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IE5PUFRyYW5zZm9ybWVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IHJldHVybmluZyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHByaXZhdGUgTk9QVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdG8gcmVzdWx0IGJ5IGRvaW5nIG5vdGhpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlucHV0ICB0aGUgaW5wdXQgb2JqZWN0IHRvIHRyYW5zZm9ybQotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIHJlc3VsdCB3aGljaCBpcyB0aGUgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vbmVQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Ob25lUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzYTkzMmQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vbmVQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQsMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIG5vbmUgb2YgdGhlCi0gKiBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICogSWYgdGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLgotICogPHA+Ci0gKiBOT1RFOiBJbiB2ZXJzaW9ucyBwcmlvciB0byAzLjIgYW4gYXJyYXkgc2l6ZSBvZiB6ZXJvIG9yIG9uZQotICogdGhyZXcgYW4gZXhjZXB0aW9uLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgTWF0dCBCZW5zb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vbmVQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDA3NjEzMDY2NTY1ODkyOTYxTDsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlW10gaVByZWRpY2F0ZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc2l6ZSB6ZXJvLCB0aGUgcHJlZGljYXRlIGFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyAgdGhlIHByZWRpY2F0ZXMgdG8gY2hlY2ssIGNsb25lZCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5hbnk8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICBGdW5jdG9yVXRpbHMudmFsaWRhdGUocHJlZGljYXRlcyk7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZVByZWRpY2F0ZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICBwcmVkaWNhdGVzID0gRnVuY3RvclV0aWxzLmNvcHkocHJlZGljYXRlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9uZVByZWRpY2F0ZShwcmVkaWNhdGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjb2xsZWN0aW9uIGlzIHNpemUgemVybywgdGhlIHByZWRpY2F0ZSBhbHdheXMgcmV0dXJucyB0cnVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLCBjbG9uZWQsIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+b25lPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlcyBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHByZWRpY2F0ZSBpbiB0aGUgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGdldEluc3RhbmNlKENvbGxlY3Rpb24gcHJlZGljYXRlcykgewotICAgICAgICBQcmVkaWNhdGVbXSBwcmVkcyA9IEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgaWYgKHByZWRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZVByZWRpY2F0ZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5vbmVQcmVkaWNhdGUocHJlZHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZXMgIHRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLCBub3QgY2xvbmVkLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBOb25lUHJlZGljYXRlKFByZWRpY2F0ZVtdIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZXMgPSBwcmVkaWNhdGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyBmYWxzZSBpZiBhbnkgc3RvcmVkIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm9uZSBvZiBkZWNvcmF0ZWQgcHJlZGljYXRlcyByZXR1cm4gdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpUHJlZGljYXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGlQcmVkaWNhdGVzW2ldLmV2YWx1YXRlKG9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlcywgZG8gbm90IG1vZGlmeSB0aGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTm90TnVsbFByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL05vdE51bGxQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJkNjQ4NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTm90TnVsbFByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGlzIG5vdCBudWxsLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb3ROdWxsUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc1MzM3ODQ0NTQ4MzI3NjQzODhMOwotICAgIAotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgSU5TVEFOQ0UgPSBuZXcgTm90TnVsbFByZWRpY2F0ZSgpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RyaWN0ZWQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3ROdWxsUHJlZGljYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIHRoZSBvYmplY3QgZG9lcyBub3QgZXF1YWwgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGV2YWx1YXRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gKG9iamVjdCAhPSBudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Ob3RQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Ob3RQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTYwYjdmOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTm90UHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdGhlIG9wcG9zaXRlIG9mIHRoZSBkZWNvcmF0ZWQgcHJlZGljYXRlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb3RQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjY1NDYwMzMyMjMzODA0OTY3NEw7Ci0gICAgCi0gICAgLyoqIFRoZSBwcmVkaWNhdGUgdG8gZGVjb3JhdGUgKi8KLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZSBpUHJlZGljYXRlOwotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBub3QgcHJlZGljYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gZGVjb3JhdGUsIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBpZiAocHJlZGljYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByZWRpY2F0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOb3RQcmVkaWNhdGUocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gY2FsbCBhZnRlciB0aGUgbnVsbCBjaGVjawotICAgICAqLwotICAgIHB1YmxpYyBOb3RQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpUHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0aGUgb3Bwb3NpdGUgdG8gdGhlIHN0b3JlZCBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwcmVkaWNhdGUgcmV0dXJucyBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuICEoaVByZWRpY2F0ZS5ldmFsdWF0ZShvYmplY3QpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmVkaWNhdGUgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZSBhcyB0aGUgb25seSBlbGVtZW50IGluIGFuIGFycmF5Ci0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFByZWRpY2F0ZVtdIGdldFByZWRpY2F0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlW10ge2lQcmVkaWNhdGV9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0V4Y2VwdGlvblByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0V4Y2VwdGlvblByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWYyODFmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNFeGNlcHRpb25QcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgaXMgbnVsbC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbElzRXhjZXB0aW9uUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBQcmVkaWNhdGVEZWNvcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI0MzQ0OTg1MDUwNDU3NjA3MUw7Ci0gICAgCi0gICAgLyoqIFRoZSBwcmVkaWNhdGUgdG8gZGVjb3JhdGUgKi8KLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZSBpUHJlZGljYXRlOwotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBudWxsIGV4Y2VwdGlvbiBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBkZWNvcmF0ZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJlZGljYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE51bGxJc0V4Y2VwdGlvblByZWRpY2F0ZShwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKiBVc2UgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+IGlmIHlvdSB3YW50IHRoYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBjYWxsIGFmdGVyIHRoZSBudWxsIGNoZWNrCi0gICAgICovCi0gICAgcHVibGljIE51bGxJc0V4Y2VwdGlvblByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlQcmVkaWNhdGUgPSBwcmVkaWNhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgdGhlIGRlY29yYXRlZCBwcmVkaWNhdGUKLSAgICAgKiBvbmNlIGEgbnVsbCBjaGVjayBpcyBwZXJmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWNvcmF0ZWQgcHJlZGljYXRlIHJldHVybnMgdHJ1ZQotICAgICAqIEB0aHJvd3MgRnVuY3RvckV4Y2VwdGlvbiBpZiBpbnB1dCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKCJJbnB1dCBPYmplY3QgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpUHJlZGljYXRlLmV2YWx1YXRlKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUgYXMgdGhlIG9ubHkgZWxlbWVudCBpbiBhbiBhcnJheQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZVtdIHtpUHJlZGljYXRlfTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNGYWxzZVByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0ZhbHNlUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNGY0NTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxJc0ZhbHNlUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgZmFsc2UgaWYgdGhlIGlucHV0IGlzIG51bGwuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxJc0ZhbHNlUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBQcmVkaWNhdGVEZWNvcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI5OTc1MDE1MzQ1NjQ3MzU1MjVMOwotICAgIAotICAgIC8qKiBUaGUgcHJlZGljYXRlIHRvIGRlY29yYXRlICovCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgaVByZWRpY2F0ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgbnVsbCBmYWxzZSBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBkZWNvcmF0ZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJlZGljYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE51bGxJc0ZhbHNlUHJlZGljYXRlKHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIGNhbGwgYWZ0ZXIgdGhlIG51bGwgY2hlY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgTnVsbElzRmFsc2VQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpUHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBkZWNvcmF0ZWQgcHJlZGljYXRlCi0gICAgICogb25jZSBhIG51bGwgY2hlY2sgaXMgcGVyZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZGVjb3JhdGVkIHByZWRpY2F0ZSByZXR1cm5zIHRydWUsIGZhbHNlIGlmIGlucHV0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpUHJlZGljYXRlLmV2YWx1YXRlKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUgYXMgdGhlIG9ubHkgZWxlbWVudCBpbiBhbiBhcnJheQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZVtdIHtpUHJlZGljYXRlfTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNUcnVlUHJlZGljYXRlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvTnVsbElzVHJ1ZVByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMTE0ZGU0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsSXNUcnVlUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgbnVsbC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbElzVHJ1ZVByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgUHJlZGljYXRlRGVjb3JhdG9yLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NjI1MTMzNzY4OTg3MTI2MjczTDsKLSAgICAKLSAgICAvKiogVGhlIHByZWRpY2F0ZSB0byBkZWNvcmF0ZSAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlIGlQcmVkaWNhdGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIG51bGwgdHJ1ZSBwcmVkaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBkZWNvcmF0ZSwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJlZGljYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE51bGxJc1RydWVQcmVkaWNhdGUocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gY2FsbCBhZnRlciB0aGUgbnVsbCBjaGVjawotICAgICAqLwotICAgIHB1YmxpYyBOdWxsSXNUcnVlUHJlZGljYXRlKFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHByZWRpY2F0ZSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgZGVjb3JhdGVkIHByZWRpY2F0ZQotICAgICAqIG9uY2UgYSBudWxsIGNoZWNrIGlzIHBlcmZvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIGRlY29yYXRlZCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIG9yIGlucHV0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlQcmVkaWNhdGUuZXZhbHVhdGUob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmVkaWNhdGUgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZSBhcyB0aGUgb25seSBlbGVtZW50IGluIGFuIGFycmF5Ci0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFByZWRpY2F0ZVtdIGdldFByZWRpY2F0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlW10ge2lQcmVkaWNhdGV9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9OdWxsUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwNjRiYzYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL051bGxQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBudWxsLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc1MzM3ODQ0NTQ4MzI3NjQzODhMOwotICAgIAotICAgIC8qKiBTaW5nbGV0b24gcHJlZGljYXRlIGluc3RhbmNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgSU5TVEFOQ0UgPSBuZXcgTnVsbFByZWRpY2F0ZSgpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RyaWN0ZWQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOdWxsUHJlZGljYXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBudWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5wdXQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIChvYmplY3QgPT0gbnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT25lUHJlZGljYXRlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT25lUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExMWVjYTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL09uZVByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCwyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgb25seSBvbmUgb2YgdGhlCi0gKiBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICogSWYgdGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBwcmVkaWNhdGUgcmV0dXJucyBmYWxzZS4KLSAqIDxwPgotICogTk9URTogSW4gdmVyc2lvbnMgcHJpb3IgdG8gMy4yIGFuIGFycmF5IHNpemUgb2YgemVybyBvciBvbmUKLSAqIHRocmV3IGFuIGV4Y2VwdGlvbi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHQgQmVuc29uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPbmVQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFByZWRpY2F0ZURlY29yYXRvciwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODEyNTM4OTA4OTkyNDc0NTc4NUw7Ci0gICAgCi0gICAgLyoqIFRoZSBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZVtdIGlQcmVkaWNhdGVzOwotICAgIAotICAgIC8qKgotICAgICAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGFycmF5IGlzIHNpemUgemVybywgdGhlIHByZWRpY2F0ZSBhbHdheXMgcmV0dXJucyBmYWxzZS4KLSAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc2l6ZSBvbmUsIHRoZW4gdGhhdCBwcmVkaWNhdGUgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyAgdGhlIHByZWRpY2F0ZXMgdG8gY2hlY2ssIGNsb25lZCwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5hbnk8L2NvZGU+IHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcmVkaWNhdGVzIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgcHJlZGljYXRlIGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoUHJlZGljYXRlW10gcHJlZGljYXRlcykgewotICAgICAgICBGdW5jdG9yVXRpbHMudmFsaWRhdGUocHJlZGljYXRlcyk7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2VQcmVkaWNhdGUuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGVzWzBdOwotICAgICAgICB9Ci0gICAgICAgIHByZWRpY2F0ZXMgPSBGdW5jdG9yVXRpbHMuY29weShwcmVkaWNhdGVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBPbmVQcmVkaWNhdGUocHJlZGljYXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjaGVjaywgY2xvbmVkLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm9uZTwvY29kZT4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZWRpY2F0ZXMgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwcmVkaWNhdGUgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShDb2xsZWN0aW9uIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgUHJlZGljYXRlW10gcHJlZHMgPSBGdW5jdG9yVXRpbHMudmFsaWRhdGUocHJlZGljYXRlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgT25lUHJlZGljYXRlKHByZWRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICB0aGUgcHJlZGljYXRlcyB0byBjaGVjaywgbm90IGNsb25lZCwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT25lUHJlZGljYXRlKFByZWRpY2F0ZVtdIHByZWRpY2F0ZXMpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZXMgPSBwcmVkaWNhdGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIG9ubHkgb25lIGRlY29yYXRlZCBwcmVkaWNhdGUKLSAgICAgKiByZXR1cm5zIHRydWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvbmx5IG9uZSBkZWNvcmF0ZWQgcHJlZGljYXRlIHJldHVybnMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlQcmVkaWNhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaVByZWRpY2F0ZXNbaV0uZXZhbHVhdGUob2JqZWN0KSkgewotICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlcywgZG8gbm90IG1vZGlmeSB0aGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvT3JQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9PclByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGY4NDdhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9PclByZWRpY2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgZWl0aGVyIG9mIHRoZSBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPclByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgUHJlZGljYXRlRGVjb3JhdG9yLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbCB2ZXJzaW9uIFVJRCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NzkxNTE4MzI1NzM1MTgyODU1TDsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlIGlQcmVkaWNhdGUxOwotICAgIC8qKiBUaGUgYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjYWxsICovCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgaVByZWRpY2F0ZTI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMSAgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlMiAgdGhlIHNlY29uZCBwcmVkaWNhdGUgdG8gY2hlY2ssIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+YW5kPC9jb2RlPiBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlMSwgUHJlZGljYXRlIHByZWRpY2F0ZTIpIHsKLSAgICAgICAgaWYgKHByZWRpY2F0ZTEgPT0gbnVsbCB8fCBwcmVkaWNhdGUyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByZWRpY2F0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBPclByZWRpY2F0ZShwcmVkaWNhdGUxLCBwcmVkaWNhdGUyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUxICB0aGUgZmlyc3QgcHJlZGljYXRlIHRvIGNoZWNrLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUyICB0aGUgc2Vjb25kIHByZWRpY2F0ZSB0byBjaGVjaywgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT3JQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZTEsIFByZWRpY2F0ZSBwcmVkaWNhdGUyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlQcmVkaWNhdGUxID0gcHJlZGljYXRlMTsKLSAgICAgICAgaVByZWRpY2F0ZTIgPSBwcmVkaWNhdGUyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0cnVlIGlmIGVpdGhlciBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZWl0aGVyIGRlY29yYXRlZCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgIHJldHVybiAoaVByZWRpY2F0ZTEuZXZhbHVhdGUob2JqZWN0KSB8fCBpUHJlZGljYXRlMi5ldmFsdWF0ZShvYmplY3QpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0d28gcHJlZGljYXRlcyBiZWluZyBkZWNvcmF0ZWQgYXMgYW4gYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZVtdIHtpUHJlZGljYXRlMSwgaVByZWRpY2F0ZTJ9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1ByZWRpY2F0ZURlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1ByZWRpY2F0ZURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGEwZjY3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9QcmVkaWNhdGVEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBEZWZpbmVzIGEgcHJlZGljYXRlIHRoYXQgZGVjb3JhdGVzIG9uZSBvciBtb3JlIG90aGVyIHByZWRpY2F0ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgdG9vbHMgdG8gYWNjZXNzIHRoZSBkZWNvcmF0ZWQgcHJlZGljYXRlcy4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGVEZWNvcmF0b3IgZXh0ZW5kcyBQcmVkaWNhdGUgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlcyBiZWluZyBkZWNvcmF0ZWQgYXMgYW4gYXJyYXkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFycmF5IG1heSBiZSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHByZWRpY2F0ZSBhbmQgdGh1cwotICAgICAqIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGVzIGJlaW5nIGRlY29yYXRlZAotICAgICAqLwotICAgIFByZWRpY2F0ZVtdIGdldFByZWRpY2F0ZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1ByZWRpY2F0ZVRyYW5zZm9ybWVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJlZGljYXRlVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFmYjg4OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJlZGljYXRlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgYSBQcmVkaWNhdGUgdXNpbmcgdGhlIGlucHV0IG9iamVjdAotICogYW5kIHRoZW4gcmV0dXJucyB0aGUgaW5wdXQuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFByZWRpY2F0ZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI3ODgxODQwODA0NDM0OTM0Nkw7Ci0KLSAgICAvKiogVGhlIGNsb3N1cmUgdG8gd3JhcCAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlIGlQcmVkaWNhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBjYWxsLCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnByZWRpY2F0ZTwvY29kZT4gdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgaWYgKHByZWRpY2F0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcmVkaWNhdGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlVHJhbnNmb3JtZXIocHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gY2FsbCwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlVHJhbnNmb3JtZXIoUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpUHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IHRvIHJlc3VsdCBieSBjYWxsaW5nIGEgcHJlZGljYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIChpUHJlZGljYXRlLmV2YWx1YXRlKGlucHV0KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlQcmVkaWNhdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJvdG90eXBlRmFjdG9yeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1Byb3RvdHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJjZmY4OS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvUHJvdG90eXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotCi0vKioKLSAqIEZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGVhY2ggdGltZSBiYXNlZCBvbiBhIHByb3RvdHlwZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgUHJvdG90eXBlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQ3JlYXRlcyBhIEZhY3RvcnkgdGhhdCB3aWxsIHJldHVybiBhIGNsb25lIG9mIHRoZSBzYW1lIHByb3RvdHlwZSBvYmplY3QKLSAgICAgKiBlYWNoIHRpbWUgdGhlIGZhY3RvcnkgaXMgdXNlZC4gVGhlIHByb3RvdHlwZSB3aWxsIGJlIGNsb25lZCB1c2luZyBvbmUgb2YgdGhlc2UKLSAgICAgKiB0ZWNobmlxdWVzIChpbiBvcmRlcik6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5wdWJsaWMgY2xvbmUgbWV0aG9kCi0gICAgICogPGxpPnB1YmxpYyBjb3B5IGNvbnN0cnVjdG9yCi0gICAgICogPGxpPnNlcmlhbGl6YXRpb24gY2xvbmUKLSAgICAgKiA8dWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG90eXBlICB0aGUgb2JqZWN0IHRvIGNsb25lIGVhY2ggdGltZSBpbiB0aGUgZmFjdG9yeQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnByb3RvdHlwZTwvY29kZT4gZmFjdG9yeQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm90b3R5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm90b3R5cGUgY2Fubm90IGJlIGNsb25lZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBnZXRJbnN0YW5jZShPYmplY3QgcHJvdG90eXBlKSB7Ci0gICAgICAgIGlmIChwcm90b3R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50RmFjdG9yeS5OVUxMX0lOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gcHJvdG90eXBlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJjbG9uZSIsIChDbGFzc1tdKSBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvdG90eXBlQ2xvbmVGYWN0b3J5KHByb3RvdHlwZSwgbWV0aG9kKTsKLQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvdG90eXBlLmdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBwcm90b3R5cGUuZ2V0Q2xhc3MoKX0pOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGVGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGUuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBwcm90b3R5cGUuZ2V0Q2xhc3MoKX0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHByb3RvdHlwZSB9KTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGlmIChwcm90b3R5cGUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm90b3R5cGVTZXJpYWxpemF0aW9uRmFjdG9yeSgoU2VyaWFsaXphYmxlKSBwcm90b3R5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJvdG90eXBlIG11c3QgYmUgY2xvbmVhYmxlIHZpYSBhIHB1YmxpYyBjbG9uZSBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqLwotICAgIHByaXZhdGUgUHJvdG90eXBlRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvLyBQcm90b3R5cGVDbG9uZUZhY3RvcnkKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUHJvdG90eXBlQ2xvbmVGYWN0b3J5IGNyZWF0ZXMgb2JqZWN0cyBieSBjb3B5aW5nIGEgcHJvdG90eXBlIHVzaW5nIHRoZSBjbG9uZSBtZXRob2QuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFByb3RvdHlwZUNsb25lRmFjdG9yeSBpbXBsZW1lbnRzIEZhY3RvcnksIFNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNlcmlhbCB2ZXJzaW9uICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU2MDQyNzE0MjI1NjUxNzU1NTVMOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBvYmplY3QgdG8gY2xvbmUgZWFjaCB0aW1lICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGlQcm90b3R5cGU7Ci0gICAgICAgIC8qKiBUaGUgbWV0aG9kIHVzZWQgdG8gY2xvbmUgKi8KLSAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0aG9kIGlDbG9uZU1ldGhvZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgdG8gc3RvcmUgcHJvdG90eXBlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBQcm90b3R5cGVDbG9uZUZhY3RvcnkoT2JqZWN0IHByb3RvdHlwZSwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIGlQcm90b3R5cGUgPSBwcm90b3R5cGU7Ci0gICAgICAgICAgICBpQ2xvbmVNZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmluZCB0aGUgQ2xvbmUgbWV0aG9kIGZvciB0aGUgY2xhc3Mgc3BlY2lmaWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRDbG9uZU1ldGhvZCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaUNsb25lTWV0aG9kID0gaVByb3RvdHlwZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiY2xvbmUiLCAoQ2xhc3NbXSkgbnVsbCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3RvdHlwZUNsb25lRmFjdG9yeTogVGhlIGNsb25lIG1ldGhvZCBtdXN0IGV4aXN0IGFuZCBiZSBwdWJsaWMgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgYnkgY2FsbGluZyB0aGUgY2xvbmUgbWV0aG9kLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbmV3IG9iamVjdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAvLyBuZWVkZWQgZm9yIHBvc3Qtc2VyaWFsaXphdGlvbgotICAgICAgICAgICAgaWYgKGlDbG9uZU1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluZENsb25lTWV0aG9kKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlDbG9uZU1ldGhvZC5pbnZva2UoaVByb3RvdHlwZSwgKE9iamVjdFtdKW51bGwpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oIlByb3RvdHlwZUNsb25lRmFjdG9yeTogQ2xvbmUgbWV0aG9kIG11c3QgYmUgcHVibGljIiwgZXgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKCJQcm90b3R5cGVDbG9uZUZhY3Rvcnk6IENsb25lIG1ldGhvZCB0aHJldyBhbiBleGNlcHRpb24iLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcm90b3R5cGVTZXJpYWxpemF0aW9uRmFjdG9yeQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQcm90b3R5cGVTZXJpYWxpemF0aW9uRmFjdG9yeSBjcmVhdGVzIG9iamVjdHMgYnkgY2xvbmluZyBhIHByb3RvdHlwZSB1c2luZyBzZXJpYWxpemF0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBQcm90b3R5cGVTZXJpYWxpemF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIEZhY3RvcnksIFNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNlcmlhbCB2ZXJzaW9uICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NzA0OTY2OTY2MTM5MTc4ODMzTDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgb2JqZWN0IHRvIGNsb25lIHZpYSBzZXJpYWxpemF0aW9uIGVhY2ggdGltZSAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YWJsZSBpUHJvdG90eXBlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciB0byBzdG9yZSBwcm90b3R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgUHJvdG90eXBlU2VyaWFsaXphdGlvbkZhY3RvcnkoU2VyaWFsaXphYmxlIHByb3RvdHlwZSkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIGlQcm90b3R5cGUgPSBwcm90b3R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdXNpbmcgc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5ldyBvYmplY3QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDUxMik7Ci0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGlQcm90b3R5cGUpOwotCi0gICAgICAgICAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3RvckV4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmFpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYW9zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N0cmluZ1ZhbHVlVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9TdHJpbmdWYWx1ZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMzcyYjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N0cmluZ1ZhbHVlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBUcmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCi0gKiA8Y29kZT5TdHJpbmcudmFsdWVPZjwvY29kZT4gb24gdGhlIGlucHV0IG9iamVjdC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdWYWx1ZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzUxMTExMDY5MzE3MTc1ODYwNkw7Ci0KLSAgICAvKiogU2luZ2xldG9uIHByZWRpY2F0ZSBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgU3RyaW5nVmFsdWVUcmFuc2Zvcm1lcigpOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSByZXR1cm5pbmcgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyYW5zZm9ybWVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1ZhbHVlVHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdG8gcmVzdWx0IGJ5IGNhbGxpbmcgPGNvZGU+U3RyaW5nLnZhbHVlT2Y8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlucHV0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Td2l0Y2hDbG9zdXJlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3dpdGNoQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjUzZjJhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9Td2l0Y2hDbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIGNhbGxzIHRoZSBjbG9zdXJlIHdob3NlIHByZWRpY2F0ZSByZXR1cm5zIHRydWUsCi0gKiBsaWtlIGEgc3dpdGNoIHN0YXRlbWVudC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ2xvc3VyZSBpbXBsZW1lbnRzIENsb3N1cmUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzUxODQ3NzMwODQ2NjQ4NjEzMEw7Ci0KLSAgICAvKiogVGhlIHRlc3RzIHRvIGNvbnNpZGVyICovCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGVbXSBpUHJlZGljYXRlczsKLSAgICAvKiogVGhlIG1hdGNoaW5nIGNsb3N1cmVzIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsb3N1cmVbXSBpQ2xvc3VyZXM7Ci0gICAgLyoqIFRoZSBkZWZhdWx0IGNsb3N1cmUgdG8gY2FsbCBpZiBubyB0ZXN0cyBtYXRjaCAqLwotICAgIHByaXZhdGUgZmluYWwgQ2xvc3VyZSBpRGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbiBhbmQgY29waWVzIHRoZSBwYXJhbWV0ZXIgYXJyYXlzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhcnJheSBvZiBwcmVkaWNhdGVzLCBjbG9uZWQsIG5vIG51bGxzCi0gICAgICogQHBhcmFtIGNsb3N1cmVzICBtYXRjaGluZyBhcnJheSBvZiBjbG9zdXJlcywgY2xvbmVkLCBubyBudWxscwotICAgICAqIEBwYXJhbSBkZWZhdWx0Q2xvc3VyZSAgdGhlIGNsb3N1cmUgdG8gdXNlIGlmIG5vIG1hdGNoLCBudWxsIG1lYW5zIG5vcAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNoYWluZWQ8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0SW5zdGFuY2UoUHJlZGljYXRlW10gcHJlZGljYXRlcywgQ2xvc3VyZVtdIGNsb3N1cmVzLCBDbG9zdXJlIGRlZmF1bHRDbG9zdXJlKSB7Ci0gICAgICAgIEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgRnVuY3RvclV0aWxzLnZhbGlkYXRlKGNsb3N1cmVzKTsKLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoICE9IGNsb3N1cmVzLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHByZWRpY2F0ZSBhbmQgY2xvc3VyZSBhcnJheXMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoZGVmYXVsdENsb3N1cmUgPT0gbnVsbCA/IE5PUENsb3N1cmUuSU5TVEFOQ0UgOiBkZWZhdWx0Q2xvc3VyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZGljYXRlcyA9IEZ1bmN0b3JVdGlscy5jb3B5KHByZWRpY2F0ZXMpOwotICAgICAgICBjbG9zdXJlcyA9IEZ1bmN0b3JVdGlscy5jb3B5KGNsb3N1cmVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hDbG9zdXJlKHByZWRpY2F0ZXMsIGNsb3N1cmVzLCBkZWZhdWx0Q2xvc3VyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENsb3N1cmUgdGhhdCBjYWxscyBvbmUgb2YgdGhlIGNsb3N1cmVzIGRlcGVuZGluZyAKLSAgICAgKiBvbiB0aGUgcHJlZGljYXRlcy4gCi0gICAgICogPHA+Ci0gICAgICogVGhlIE1hcCBjb25zaXN0cyBvZiBQcmVkaWNhdGUga2V5cyBhbmQgQ2xvc3VyZSB2YWx1ZXMuIEEgY2xvc3VyZSAKLSAgICAgKiBpcyBjYWxsZWQgaWYgaXRzIG1hdGNoaW5nIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuIEVhY2ggcHJlZGljYXRlIGlzIGV2YWx1YXRlZAotICAgICAqIHVudGlsIG9uZSByZXR1cm5zIHRydWUuIElmIG5vIHByZWRpY2F0ZXMgZXZhbHVhdGUgdG8gdHJ1ZSwgdGhlIGRlZmF1bHQKLSAgICAgKiBjbG9zdXJlIGlzIGNhbGxlZC4gVGhlIGRlZmF1bHQgY2xvc3VyZSBpcyBzZXQgaW4gdGhlIG1hcCB3aXRoIGEgCi0gICAgICogbnVsbCBrZXkuIFRoZSBvcmRlcmluZyBpcyB0aGF0IG9mIHRoZSBpdGVyYXRvcigpIG1ldGhvZCBvbiB0aGUgZW50cnlzZXQgCi0gICAgICogY29sbGVjdGlvbiBvZiB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzQW5kQ2xvc3VyZXMgIGEgbWFwIG9mIHByZWRpY2F0ZXMgdG8gY2xvc3VyZXMKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5zd2l0Y2g8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY2xvc3VyZSBpbiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAgaWYgdGhlIG1hcCBlbGVtZW50cyBhcmUgb2YgdGhlIHdyb25nIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0SW5zdGFuY2UoTWFwIHByZWRpY2F0ZXNBbmRDbG9zdXJlcykgewotICAgICAgICBDbG9zdXJlW10gY2xvc3VyZXMgPSBudWxsOwotICAgICAgICBQcmVkaWNhdGVbXSBwcmVkcyA9IG51bGw7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzQW5kQ2xvc3VyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHByZWRpY2F0ZSBhbmQgY2xvc3VyZSBtYXAgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzQW5kQ2xvc3VyZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT1BDbG9zdXJlLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvbnZlcnQgdG8gYXJyYXkgbGlrZSB0aGlzIHRvIGd1YXJhbnRlZSBpdGVyYXRvcigpIG9yZGVyaW5nCi0gICAgICAgIENsb3N1cmUgZGVmYXVsdENsb3N1cmUgPSAoQ2xvc3VyZSkgcHJlZGljYXRlc0FuZENsb3N1cmVzLnJlbW92ZShudWxsKTsKLSAgICAgICAgaW50IHNpemUgPSBwcmVkaWNhdGVzQW5kQ2xvc3VyZXMuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGRlZmF1bHRDbG9zdXJlID09IG51bGwgPyBOT1BDbG9zdXJlLklOU1RBTkNFIDogZGVmYXVsdENsb3N1cmUpOwotICAgICAgICB9Ci0gICAgICAgIGNsb3N1cmVzID0gbmV3IENsb3N1cmVbc2l6ZV07Ci0gICAgICAgIHByZWRzID0gbmV3IFByZWRpY2F0ZVtzaXplXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJlZGljYXRlc0FuZENsb3N1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgcHJlZHNbaV0gPSAoUHJlZGljYXRlKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGNsb3N1cmVzW2ldID0gKENsb3N1cmUpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hDbG9zdXJlKHByZWRzLCBjbG9zdXJlcywgZGVmYXVsdENsb3N1cmUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhcnJheSBvZiBwcmVkaWNhdGVzLCBub3QgY2xvbmVkLCBubyBudWxscwotICAgICAqIEBwYXJhbSBjbG9zdXJlcyAgbWF0Y2hpbmcgYXJyYXkgb2YgY2xvc3VyZXMsIG5vdCBjbG9uZWQsIG5vIG51bGxzCi0gICAgICogQHBhcmFtIGRlZmF1bHRDbG9zdXJlICB0aGUgY2xvc3VyZSB0byB1c2UgaWYgbm8gbWF0Y2gsIG51bGwgbWVhbnMgbm9wCi0gICAgICovCi0gICAgcHVibGljIFN3aXRjaENsb3N1cmUoUHJlZGljYXRlW10gcHJlZGljYXRlcywgQ2xvc3VyZVtdIGNsb3N1cmVzLCBDbG9zdXJlIGRlZmF1bHRDbG9zdXJlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlQcmVkaWNhdGVzID0gcHJlZGljYXRlczsKLSAgICAgICAgaUNsb3N1cmVzID0gY2xvc3VyZXM7Ci0gICAgICAgIGlEZWZhdWx0ID0gKGRlZmF1bHRDbG9zdXJlID09IG51bGwgPyBOT1BDbG9zdXJlLklOU1RBTkNFIDogZGVmYXVsdENsb3N1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBjbG9zdXJlIHdob3NlIG1hdGNoaW5nIHByZWRpY2F0ZSByZXR1cm5zIHRydWUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlQcmVkaWNhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaVByZWRpY2F0ZXNbaV0uZXZhbHVhdGUoaW5wdXQpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBpQ2xvc3VyZXNbaV0uZXhlY3V0ZShpbnB1dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlEZWZhdWx0LmV4ZWN1dGUoaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZWRpY2F0ZXMsIGRvIG5vdCBtb2RpZnkgdGhlIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZXMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlW10gZ2V0UHJlZGljYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGlQcmVkaWNhdGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsb3N1cmVzLCBkbyBub3QgbW9kaWZ5IHRoZSBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlW10gZ2V0Q2xvc3VyZXMoKSB7Ci0gICAgICAgIHJldHVybiBpQ2xvc3VyZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBjbG9zdXJlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgY2xvc3VyZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldERlZmF1bHRDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gaURlZmF1bHQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1N3aXRjaFRyYW5zZm9ybWVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3dpdGNoVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWUyNmUxMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvU3dpdGNoVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQsMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIGNhbGxzIHRoZSB0cmFuc2Zvcm1lciB3aG9zZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLAotICogbGlrZSBhIHN3aXRjaCBzdGF0ZW1lbnQuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaFRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY0MDQ0NjA4OTA5MDM0NjkzMzJMOwotCi0gICAgLyoqIFRoZSB0ZXN0cyB0byBjb25zaWRlciAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlW10gaVByZWRpY2F0ZXM7Ci0gICAgLyoqIFRoZSBtYXRjaGluZyB0cmFuc2Zvcm1lcnMgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXJbXSBpVHJhbnNmb3JtZXJzOwotICAgIC8qKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciB0byBjYWxsIGlmIG5vIHRlc3RzIG1hdGNoICovCi0gICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lciBpRGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbiBhbmQgY29waWVzIHRoZSBwYXJhbWV0ZXIgYXJyYXlzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhcnJheSBvZiBwcmVkaWNhdGVzLCBjbG9uZWQsIG5vIG51bGxzCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVycyAgbWF0Y2hpbmcgYXJyYXkgb2YgdHJhbnNmb3JtZXJzLCBjbG9uZWQsIG5vIG51bGxzCi0gICAgICogQHBhcmFtIGRlZmF1bHRUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBpZiBubyBtYXRjaCwgbnVsbCBtZWFucyByZXR1cm4gbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNoYWluZWQ8L2NvZGU+IHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBnZXRJbnN0YW5jZShQcmVkaWNhdGVbXSBwcmVkaWNhdGVzLCBUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycywgVHJhbnNmb3JtZXIgZGVmYXVsdFRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIEZ1bmN0b3JVdGlscy52YWxpZGF0ZShwcmVkaWNhdGVzKTsKLSAgICAgICAgRnVuY3RvclV0aWxzLnZhbGlkYXRlKHRyYW5zZm9ybWVycyk7Ci0gICAgICAgIGlmIChwcmVkaWNhdGVzLmxlbmd0aCAhPSB0cmFuc2Zvcm1lcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJlZGljYXRlIGFuZCB0cmFuc2Zvcm1lciBhcnJheXMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWRpY2F0ZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoZGVmYXVsdFRyYW5zZm9ybWVyID09IG51bGwgPyBDb25zdGFudFRyYW5zZm9ybWVyLk5VTExfSU5TVEFOQ0UgOiBkZWZhdWx0VHJhbnNmb3JtZXIpOwotICAgICAgICB9Ci0gICAgICAgIHByZWRpY2F0ZXMgPSBGdW5jdG9yVXRpbHMuY29weShwcmVkaWNhdGVzKTsKLSAgICAgICAgdHJhbnNmb3JtZXJzID0gRnVuY3RvclV0aWxzLmNvcHkodHJhbnNmb3JtZXJzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hUcmFuc2Zvcm1lcihwcmVkaWNhdGVzLCB0cmFuc2Zvcm1lcnMsIGRlZmF1bHRUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFRyYW5zZm9ybWVyIHRoYXQgY2FsbHMgb25lIG9mIHRoZSB0cmFuc2Zvcm1lcnMgZGVwZW5kaW5nIAotICAgICAqIG9uIHRoZSBwcmVkaWNhdGVzLiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTWFwIGNvbnNpc3RzIG9mIFByZWRpY2F0ZSBrZXlzIGFuZCBUcmFuc2Zvcm1lciB2YWx1ZXMuIEEgdHJhbnNmb3JtZXIgCi0gICAgICogaXMgY2FsbGVkIGlmIGl0cyBtYXRjaGluZyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlLiBFYWNoIHByZWRpY2F0ZSBpcyBldmFsdWF0ZWQKLSAgICAgKiB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBJZiBubyBwcmVkaWNhdGVzIGV2YWx1YXRlIHRvIHRydWUsIHRoZSBkZWZhdWx0Ci0gICAgICogdHJhbnNmb3JtZXIgaXMgY2FsbGVkLiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciBpcyBzZXQgaW4gdGhlIG1hcCB3aXRoIGEgCi0gICAgICogbnVsbCBrZXkuIFRoZSBvcmRlcmluZyBpcyB0aGF0IG9mIHRoZSBpdGVyYXRvcigpIG1ldGhvZCBvbiB0aGUgZW50cnlzZXQgCi0gICAgICogY29sbGVjdGlvbiBvZiB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzQW5kVHJhbnNmb3JtZXJzICBhIG1hcCBvZiBwcmVkaWNhdGVzIHRvIHRyYW5zZm9ybWVycwotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnN3aXRjaDwvY29kZT4gdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgdHJhbnNmb3JtZXIgaW4gdGhlIG1hcCBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gIGlmIHRoZSBtYXAgZWxlbWVudHMgYXJlIG9mIHRoZSB3cm9uZyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc2Zvcm1lciBnZXRJbnN0YW5jZShNYXAgcHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycykgewotICAgICAgICBUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG51bGw7Ci0gICAgICAgIFByZWRpY2F0ZVtdIHByZWRzID0gbnVsbDsKLSAgICAgICAgaWYgKHByZWRpY2F0ZXNBbmRUcmFuc2Zvcm1lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHByZWRpY2F0ZSBhbmQgdHJhbnNmb3JtZXIgbWFwIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50VHJhbnNmb3JtZXIuTlVMTF9JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGxpa2UgdGhpcyB0byBndWFyYW50ZWUgaXRlcmF0b3IoKSBvcmRlcmluZwotICAgICAgICBUcmFuc2Zvcm1lciBkZWZhdWx0VHJhbnNmb3JtZXIgPSAoVHJhbnNmb3JtZXIpIHByZWRpY2F0ZXNBbmRUcmFuc2Zvcm1lcnMucmVtb3ZlKG51bGwpOwotICAgICAgICBpbnQgc2l6ZSA9IHByZWRpY2F0ZXNBbmRUcmFuc2Zvcm1lcnMuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGRlZmF1bHRUcmFuc2Zvcm1lciA9PSBudWxsID8gQ29uc3RhbnRUcmFuc2Zvcm1lci5OVUxMX0lOU1RBTkNFIDogZGVmYXVsdFRyYW5zZm9ybWVyKTsKLSAgICAgICAgfQotICAgICAgICB0cmFuc2Zvcm1lcnMgPSBuZXcgVHJhbnNmb3JtZXJbc2l6ZV07Ci0gICAgICAgIHByZWRzID0gbmV3IFByZWRpY2F0ZVtzaXplXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJlZGljYXRlc0FuZFRyYW5zZm9ybWVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHByZWRzW2ldID0gKFByZWRpY2F0ZSkgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lcnNbaV0gPSAoVHJhbnNmb3JtZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hUcmFuc2Zvcm1lcihwcmVkcywgdHJhbnNmb3JtZXJzLCBkZWZhdWx0VHJhbnNmb3JtZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzICBhcnJheSBvZiBwcmVkaWNhdGVzLCBub3QgY2xvbmVkLCBubyBudWxscwotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lcnMgIG1hdGNoaW5nIGFycmF5IG9mIHRyYW5zZm9ybWVycywgbm90IGNsb25lZCwgbm8gbnVsbHMKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGlmIG5vIG1hdGNoLCBudWxsIG1lYW5zIHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN3aXRjaFRyYW5zZm9ybWVyKFByZWRpY2F0ZVtdIHByZWRpY2F0ZXMsIFRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzLCBUcmFuc2Zvcm1lciBkZWZhdWx0VHJhbnNmb3JtZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVByZWRpY2F0ZXMgPSBwcmVkaWNhdGVzOwotICAgICAgICBpVHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzOwotICAgICAgICBpRGVmYXVsdCA9IChkZWZhdWx0VHJhbnNmb3JtZXIgPT0gbnVsbCA/IENvbnN0YW50VHJhbnNmb3JtZXIuTlVMTF9JTlNUQU5DRSA6IGRlZmF1bHRUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdG8gcmVzdWx0IGJ5IGNhbGxpbmcgdGhlIHRyYW5zZm9ybWVyIHdob3NlIG1hdGNoaW5nCi0gICAgICogcHJlZGljYXRlIHJldHVybnMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QgdG8gdHJhbnNmb3JtCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaVByZWRpY2F0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpUHJlZGljYXRlc1tpXS5ldmFsdWF0ZShpbnB1dCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpVHJhbnNmb3JtZXJzW2ldLnRyYW5zZm9ybShpbnB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlEZWZhdWx0LnRyYW5zZm9ybShpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJlZGljYXRlcywgZG8gbm90IG1vZGlmeSB0aGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGVbXSBnZXRQcmVkaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXJzLCBkbyBub3QgbW9kaWZ5IHRoZSBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lcnMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKSB7Ci0gICAgICAgIHJldHVybiBpVHJhbnNmb3JtZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lcgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2Zvcm1lciBnZXREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0gICAgICAgIHJldHVybiBpRGVmYXVsdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9UcmFuc2Zvcm1lZFByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVkUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ODc1ZjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVkUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgZ2l2ZW4gb2JqZWN0IGJlZm9yZSBpbnZva2luZwotICogYW5vdGhlciA8Y29kZT5QcmVkaWNhdGU8L2NvZGU+LgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICogQGF1dGhvciBBbGJhbiBQZWlnbmllcgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zZm9ybWVkUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlLCBQcmVkaWNhdGVEZWNvcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU1OTYwOTA5MTk2NjgzMTU4MzRMOwotICAgIAotICAgIC8qKiBUaGUgdHJhbnNmb3JtZXIgdG8gY2FsbCAqLwotICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXIgaVRyYW5zZm9ybWVyOwotICAgIC8qKiBUaGUgcHJlZGljYXRlIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZSBpUHJlZGljYXRlOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byBjYWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byBjYWxsIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zZm9ybWVyIG9yIHRoZSBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlIGdldEluc3RhbmNlKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlmICh0cmFuc2Zvcm1lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtZXIgdG8gY2FsbCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWRpY2F0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJlZGljYXRlIHRvIGNhbGwgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRQcmVkaWNhdGUodHJhbnNmb3JtZXIsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIGRlY29yYXRlCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWVkUHJlZGljYXRlKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIGlUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotICAgICAgICBpUHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHByZWRpY2F0ZSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgZGVjb3JhdGVkIHByZWRpY2F0ZQotICAgICAqIG9uY2UgdGhlIGlucHV0IGhhcyBiZWVuIHRyYW5zZm9ybWVkCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdCB3aGljaCB3aWxsIGJlIHRyYW5zZm9ybWVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIGRlY29yYXRlZCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gaVRyYW5zZm9ybWVyLnRyYW5zZm9ybShvYmplY3QpOwotICAgICAgICByZXR1cm4gaVByZWRpY2F0ZS5ldmFsdWF0ZShyZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZWRpY2F0ZSBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlIGFzIHRoZSBvbmx5IGVsZW1lbnQgaW4gYW4gYXJyYXkKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlW10gZ2V0UHJlZGljYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVbXSB7aVByZWRpY2F0ZX07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXIgaW4gdXNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgewotICAgICAgICByZXR1cm4gaVRyYW5zZm9ybWVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVyQ2xvc3VyZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVyQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODZlZWZhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9UcmFuc2Zvcm1lckNsb3N1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5DbG9zdXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgYSBUcmFuc2Zvcm1lciB1c2luZyB0aGUgaW5wdXQgb2JqZWN0Ci0gKiBhbmQgaWdub3JlIHRoZSByZXN1bHQuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVyQ2xvc3VyZSBpbXBsZW1lbnRzIENsb3N1cmUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUxOTQ5OTI1ODkxOTMzODg5NjlMOwotCi0gICAgLyoqIFRoZSB0cmFuc2Zvcm1lciB0byB3cmFwICovCi0gICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lciBpVHJhbnNmb3JtZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQSBudWxsIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIHRoZSA8Y29kZT5OT1BDbG9zdXJlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byBjYWxsLCBudWxsIG1lYW5zIG5vcAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnRyYW5zZm9ybWVyPC9jb2RlPiBjbG9zdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbG9zdXJlIGdldEluc3RhbmNlKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIGlmICh0cmFuc2Zvcm1lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9QQ2xvc3VyZS5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVyQ2xvc3VyZSh0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byBjYWxsLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2Zvcm1lckNsb3N1cmUoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaVRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGNsb3N1cmUgYnkgY2FsbGluZyB0aGUgZGVjb3JhdGVkIHRyYW5zZm9ybWVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoT2JqZWN0IGlucHV0KSB7Ci0gICAgICAgIGlUcmFuc2Zvcm1lci50cmFuc2Zvcm0oaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgewotICAgICAgICByZXR1cm4gaVRyYW5zZm9ybWVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RyYW5zZm9ybWVyUHJlZGljYXRlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZXJQcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzZmNmJkOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvVHJhbnNmb3JtZXJQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GdW5jdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFByZWRpY2F0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIHRyYW5zZm9ybWVyLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzMgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2Zvcm1lclByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjQwNzk2NjQwMjkyMDU3ODc0MUw7Ci0gICAgCi0gICAgLyoqIFRoZSB0cmFuc2Zvcm1lciB0byBjYWxsICovCi0gICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lciBpVHJhbnNmb3JtZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byBkZWNvcmF0ZQotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0cmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgaWYgKHRyYW5zZm9ybWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB0cmFuc2Zvcm1lciB0byBjYWxsIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVyUHJlZGljYXRlKHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIGRlY29yYXRlCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWVyUHJlZGljYXRlKFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlcyB0aGUgcHJlZGljYXRlIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBkZWNvcmF0ZWQgdHJhbnNmb3JtZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWNvcmF0ZWQgdHJhbnNmb3JtZXIgcmV0dXJucyBCb29sZWFuLlRSVUUKLSAgICAgKiBAdGhyb3dzIEZ1bmN0b3JFeGNlcHRpb24gaWYgdGhlIHRyYW5zZm9ybWVyIHJldHVybnMgYW4gaW52YWxpZCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gaVRyYW5zZm9ybWVyLnRyYW5zZm9ybShvYmplY3QpOwotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbiA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRyYW5zZm9ybWVyIG11c3QgcmV0dXJuIGFuIGluc3RhbmNlb2YgQm9vbGVhbiwgaXQgd2FzIGEgIgotICAgICAgICAgICAgICAgICAgICArIChyZXN1bHQgPT0gbnVsbCA/ICJudWxsIG9iamVjdCIgOiByZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgewotICAgICAgICByZXR1cm4gaVRyYW5zZm9ybWVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RydWVQcmVkaWNhdGUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9UcnVlUHJlZGljYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjOTU0MmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1RydWVQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogUHJlZGljYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdHJ1ZS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMzICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJ1ZVByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWwgdmVyc2lvbiBVSUQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzc0NzY3MTU4NzU2MTg5NzQwTDsKLSAgICAKLSAgICAvKiogU2luZ2xldG9uIHByZWRpY2F0ZSBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlIElOU1RBTkNFID0gbmV3IFRydWVQcmVkaWNhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgcmV0dXJuaW5nIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgVHJ1ZVByZWRpY2F0ZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHByZWRpY2F0ZSByZXR1cm5pbmcgdHJ1ZSBhbHdheXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIGlucHV0IG9iamVjdAotICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1VuaXF1ZVByZWRpY2F0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2Z1bmN0b3JzL1VuaXF1ZVByZWRpY2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzRjNzI0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9VbmlxdWVQcmVkaWNhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBQcmVkaWNhdGUgaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRydWUgdGhlIGZpcnN0IHRpbWUgYW4gb2JqZWN0IGlzCi0gKiBwYXNzZWQgaW50byB0aGUgcHJlZGljYXRlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmlxdWVQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMzMTk0MTc0MzgwMjc0MzgwNDBMOwotICAgIAotICAgIC8qKiBUaGUgc2V0IG9mIHByZXZpb3VzbHkgc2VlbiBvYmplY3RzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgaVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVkaWNhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByZWRpY2F0ZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVQcmVkaWNhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHBlcmZvcm1zIG5vIHZhbGlkYXRpb24uCi0gICAgICogVXNlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0aGF0LgotICAgICAqLwotICAgIHB1YmxpYyBVbmlxdWVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgcmV0dXJuaW5nIHRydWUgaWYgdGhlIGlucHV0IG9iamVjdCBoYXNuJ3QgYmVlbgotICAgICAqIHJlY2VpdmVkIHlldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIG9iamVjdCBpcyBzZWVuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gaVNldC5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9XaGlsZUNsb3N1cmUuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9XaGlsZUNsb3N1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZkZjhhYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvV2hpbGVDbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBDbG9zdXJlIGltcGxlbWVudGF0aW9uIHRoYXQgZXhlY3V0ZXMgYSBjbG9zdXJlIHJlcGVhdGVkbHkgdW50aWwgYSBjb25kaXRpb24gaXMgbWV0LAotICogbGlrZSBhIGRvLXdoaWxlIG9yIHdoaWxlIGxvb3AuCi0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMiAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFdoaWxlQ2xvc3VyZSBpbXBsZW1lbnRzIENsb3N1cmUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsIHZlcnNpb24gVUlEICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMxMTA1MzgxMTY5MTM3NjAxMDhMOwotCi0gICAgLyoqIFRoZSB0ZXN0IGNvbmRpdGlvbiAqLwotICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlIGlQcmVkaWNhdGU7Ci0gICAgLyoqIFRoZSBjbG9zdXJlIHRvIGNhbGwgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgaUNsb3N1cmU7Ci0gICAgLyoqIFRoZSBmbGFnLCB0cnVlIGlzIGEgZG8gbG9vcCwgZmFsc2UgaXMgYSB3aGlsZSAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpRG9Mb29wOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdGhhdCBwZXJmb3JtcyB2YWxpZGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byBldmFsdWF0ZSB3aGVuIHRoZSBsb29wIHRlcm1pbmF0ZXMsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNsb3N1cmUgIHRoZSBjbG9zdXJlIHRoZSBleGVjdXRlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBkb0xvb3AgIHRydWUgdG8gYWN0IGFzIGEgZG8td2hpbGUgbG9vcCwgYWx3YXlzIGV4ZWN1dGluZyB0aGUgY2xvc3VyZSBvbmNlCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+d2hpbGU8L2NvZGU+IGNsb3N1cmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJlZGljYXRlIG9yIGNsb3N1cmUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xvc3VyZSBnZXRJbnN0YW5jZShQcmVkaWNhdGUgcHJlZGljYXRlLCBDbG9zdXJlIGNsb3N1cmUsIGJvb2xlYW4gZG9Mb29wKSB7Ci0gICAgICAgIGlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJlZGljYXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbG9zdXJlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFdoaWxlQ2xvc3VyZShwcmVkaWNhdGUsIGNsb3N1cmUsIGRvTG9vcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwZXJmb3JtcyBubyB2YWxpZGF0aW9uLgotICAgICAqIFVzZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gaWYgeW91IHdhbnQgdGhhdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gZXZhbHVhdGUgd2hlbiB0aGUgbG9vcCB0ZXJtaW5hdGVzLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjbG9zdXJlICB0aGUgY2xvc3VyZSB0aGUgZXhlY3V0ZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gZG9Mb29wICB0cnVlIHRvIGFjdCBhcyBhIGRvLXdoaWxlIGxvb3AsIGFsd2F5cyBleGVjdXRpbmcgdGhlIGNsb3N1cmUgb25jZQotICAgICAqLwotICAgIHB1YmxpYyBXaGlsZUNsb3N1cmUoUHJlZGljYXRlIHByZWRpY2F0ZSwgQ2xvc3VyZSBjbG9zdXJlLCBib29sZWFuIGRvTG9vcCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpUHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgICAgICBpQ2xvc3VyZSA9IGNsb3N1cmU7Ci0gICAgICAgIGlEb0xvb3AgPSBkb0xvb3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGNsb3N1cmUgdW50aWwgdGhlIHByZWRpY2F0ZSBpcyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE9iamVjdCBpbnB1dCkgewotICAgICAgICBpZiAoaURvTG9vcCkgewotICAgICAgICAgICAgaUNsb3N1cmUuZXhlY3V0ZShpbnB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGlQcmVkaWNhdGUuZXZhbHVhdGUoaW5wdXQpKSB7Ci0gICAgICAgICAgICBpQ2xvc3VyZS5leGVjdXRlKGlucHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZWRpY2F0ZSBpbiB1c2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIFByZWRpY2F0ZSBnZXRQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBpUHJlZGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsb3N1cmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2xvc3VyZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBpQ2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGUgbG9vcCBhIGRvLXdoaWxlIGxvb3AuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlzIGRvLXdoaWxlLCBmYWxzZSBpZiB3aGlsZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRG9Mb29wKCkgewotICAgICAgICByZXR1cm4gaURvTG9vcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvZnVuY3RvcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWM4Y2JhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9mdW5jdG9ycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tICRJZDogcGFja2FnZS5odG1sLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MzMgbXBhcmtlciBFeHAgJCAtLT4KLSA8IS0tCi0gICBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxCT0RZPgotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZQote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5DbG9zdXJlIENsb3N1cmV9LAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGUgUHJlZGljYXRlfSwKLXtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXIgVHJhbnNmb3JtZXJ9IGFuZAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5GYWN0b3J5IEZhY3Rvcnl9IGludGVyZmFjZXMuCi1UaGVzZSBwcm92aWRlIHNpbXBsZSBjYWxsYmFja3MgZm9yIHByb2Nlc3Npbmcgd2l0aCBjb2xsZWN0aW9ucy4KLTwvcD4KLTwvQk9EWT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RFbXB0eUl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0RW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTUxMTE0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RFbXB0eUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqIAotICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYW4gZW1wdHkgaXRlcmF0b3IuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbXB0eUl0ZXJhdG9yIHsKLSAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFbXB0eUl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJJdGVyYXRvciBjb250YWlucyBubyBlbGVtZW50cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIkl0ZXJhdG9yIGNvbnRhaW5zIG5vIGVsZW1lbnRzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiYWRkKCkgbm90IHN1cHBvcnRlZCBmb3IgZW1wdHkgSXRlcmF0b3IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciBjb250YWlucyBubyBlbGVtZW50cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgY29udGFpbnMgbm8gZWxlbWVudHMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlcmF0b3IgY29udGFpbnMgbm8gZWxlbWVudHMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciBjb250YWlucyBubyBlbGVtZW50cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIGNvbnRhaW5zIG5vIGVsZW1lbnRzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxNTA4YjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqIAotICogUHJvdmlkZXMgYmFzaWMgYmVoYXZpb3VyIGZvciBkZWNvcmF0aW5nIGFuIGl0ZXJhdG9yIHdpdGggZXh0cmEgZnVuY3Rpb25hbGl0eS4KLSAqIDxwPgotICogQWxsIG1ldGhvZHMgYXJlIGZvcndhcmRlZCB0byB0aGUgZGVjb3JhdGVkIGl0ZXJhdG9yLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBkZWNvcmF0ZXMgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJdGVyYXRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGl0ZXJhdG9yIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RMaXN0SXRlcmF0b3JEZWNvcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RMaXN0SXRlcmF0b3JEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQ1MWNjYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgYmFzaWMgYmVoYXZpb3VyIGZvciBkZWNvcmF0aW5nIGEgbGlzdCBpdGVyYXRvciB3aXRoIGV4dHJhIGZ1bmN0aW9uYWxpdHkuCi0gKiA8cD4KLSAqIEFsbCBtZXRob2RzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGRlY29yYXRlZCBsaXN0IGl0ZXJhdG9yLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RMaXN0SXRlcmF0b3JEZWNvcmF0b3IgaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IgewotCi0gICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgZGVjb3JhdGVzIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RMaXN0SXRlcmF0b3JEZWNvcmF0b3IoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0SXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RJdGVyYXRvciBnZXRMaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0SW5kZXgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgaXRlcmF0b3Iuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvYmopIHsKLSAgICAgICAgaXRlcmF0b3IuYWRkKG9iaik7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BYnN0cmFjdE1hcEl0ZXJhdG9yRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE1MjJmMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIGJhc2ljIGJlaGF2aW91ciBmb3IgZGVjb3JhdGluZyBhIG1hcCBpdGVyYXRvciB3aXRoIGV4dHJhIGZ1bmN0aW9uYWxpdHkuCi0gKiA8cD4KLSAqIEFsbCBtZXRob2RzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGRlY29yYXRlZCBtYXAgaXRlcmF0b3IuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciB7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdG9yIGJlaW5nIGRlY29yYXRlZCAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBNYXBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlY29yYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0TWFwSXRlcmF0b3JEZWNvcmF0b3IoTWFwSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcEl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaXRlcmF0b3IgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXBJdGVyYXRvciBnZXRNYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmdldEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gaXRlcmF0b3Iuc2V0VmFsdWUob2JqKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RPcmRlcmVkTWFwSXRlcmF0b3JEZWNvcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQWJzdHJhY3RPcmRlcmVkTWFwSXRlcmF0b3JEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjcwMDZhZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0Fic3RyYWN0T3JkZXJlZE1hcEl0ZXJhdG9yRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwSXRlcmF0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgYmFzaWMgYmVoYXZpb3VyIGZvciBkZWNvcmF0aW5nIGFuIG9yZGVyZWQgbWFwIGl0ZXJhdG9yIHdpdGggZXh0cmEgZnVuY3Rpb25hbGl0eS4KLSAqIDxwPgotICogQWxsIG1ldGhvZHMgYXJlIGZvcndhcmRlZCB0byB0aGUgZGVjb3JhdGVkIG1hcCBpdGVyYXRvci4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RPcmRlcmVkTWFwSXRlcmF0b3JEZWNvcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkTWFwSXRlcmF0b3IgewotCi0gICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT3JkZXJlZE1hcEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgZGVjb3JhdGVzIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RPcmRlcmVkTWFwSXRlcmF0b3JEZWNvcmF0b3IoT3JkZXJlZE1hcEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcmRlcmVkTWFwSXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9yZGVyZWRNYXBJdGVyYXRvciBnZXRPcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNQcmV2aW91cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5wcmV2aW91cygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5zZXRWYWx1ZShvYmopOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZjMjJkOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLQotLyoqIAotICogSW1wbGVtZW50cyBhbiB7QGxpbmsgamF2YS51dGlsLkl0ZXJhdG9yIEl0ZXJhdG9yfSBvdmVyIGFueSBhcnJheS4KLSAqIDxwPgotICogVGhlIGFycmF5IGNhbiBiZSBlaXRoZXIgYW4gYXJyYXkgb2Ygb2JqZWN0IG9yIG9mIHByaW1pdGl2ZXMuIElmIHlvdSBrbm93IAotICogdGhhdCB5b3UgaGF2ZSBhbiBvYmplY3QgYXJyYXksIHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLk9iamVjdEFycmF5SXRlcmF0b3IgT2JqZWN0QXJyYXlJdGVyYXRvcn0KLSAqIGNsYXNzIGlzIGEgYmV0dGVyIGNob2ljZSwgYXMgaXQgd2lsbCBwZXJmb3JtIGJldHRlci4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9yIGltcGxlbWVudHMgYSB7QGxpbmsgI3Jlc2V0fSBtZXRob2QsIGFsbG93aW5nIHRoZSByZXNldCBvZiAKLSAqIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBzdGFydCBpZiByZXF1aXJlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICoKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEBhdXRob3IgTWF1cmljaW8gUy4gTW91cmEKLSAqIEBhdXRob3IgTWljaGFlbCBBLiBTbWl0aAotICogQGF1dGhvciBOZWlsIE8nVG9vbGUKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yIGltcGxlbWVudHMgUmVzZXR0YWJsZUl0ZXJhdG9yIHsKLQotICAgIC8qKiBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyICovICAgIAotICAgIHByb3RlY3RlZCBPYmplY3QgYXJyYXk7Ci0gICAgLyoqIFRoZSBzdGFydCBpbmRleCB0byBsb29wIGZyb20gKi8KLSAgICBwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAwOwotICAgIC8qKiBUaGUgZW5kIGluZGV4IHRvIGxvb3AgdG8gKi8KLQlwcm90ZWN0ZWQgaW50IGVuZEluZGV4ID0gMDsKLSAgICAvKiogVGhlIGN1cnJlbnQgaXRlcmF0b3IgaW5kZXggKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gMDsKLSAgICAKLSAgICAvLyBDb25zdHJ1Y3RvcnMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSB3aXRoIDxjb2RlPnNldEFycmF5PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yLCB0aGUgaXRlcmF0b3IgaXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBpdGVyYXRvcgotICAgICAqIHVudGlsIHtAbGluayAjc2V0QXJyYXkoT2JqZWN0KX0gaXMgIGNhbGxlZCB0byBlc3RhYmxpc2ggdGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlJdGVyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIEFycmF5SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBub3QgYW4gYXJyYXkuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlJdGVyYXRvcihmaW5hbCBPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0QXJyYXkoYXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gQXJyYXlJdGVyYXRvciB0aGF0IHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSB2YWx1ZXMgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIGFycmF5IGZyb20gYSBzcGVjaWZpYyBzdGFydCBpbmRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGl0ZXJhdGluZyBhdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgbm90IGFuIGFycmF5LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YXJyYXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIEFycmF5SXRlcmF0b3IoZmluYWwgT2JqZWN0IGFycmF5LCBmaW5hbCBpbnQgc3RhcnRJbmRleCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRBcnJheShhcnJheSk7Ci0gICAgICAgIGNoZWNrQm91bmQoc3RhcnRJbmRleCwgInN0YXJ0Iik7Ci0gICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydEluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBBcnJheUl0ZXJhdG9yIHRoYXQgd2lsbCBpdGVyYXRlIG92ZXIgYSByYW5nZSBvZiB2YWx1ZXMgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGl0ZXJhdGluZyBhdC4KLSAgICAgKiBAcGFyYW0gZW5kSW5kZXggIHRoZSBpbmRleCB0byBmaW5pc2ggaXRlcmF0aW5nIGF0LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBub3QgYW4gYXJyYXkuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZWl0aGVyIGluZGV4IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlJdGVyYXRvcihmaW5hbCBPYmplY3QgYXJyYXksIGZpbmFsIGludCBzdGFydEluZGV4LCBmaW5hbCBpbnQgZW5kSW5kZXgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0QXJyYXkoYXJyYXkpOwotICAgICAgICBjaGVja0JvdW5kKHN0YXJ0SW5kZXgsICJzdGFydCIpOwotICAgICAgICBjaGVja0JvdW5kKGVuZEluZGV4LCAiZW5kIik7Ci0gICAgICAgIGlmIChlbmRJbmRleCA8IHN0YXJ0SW5kZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVuZCBpbmRleCBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgaW5kZXguIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLSAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4OwotICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnRJbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgaW5kZXggaXMgdmFsaWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEBwYXJhbSBib3VuZCAgdGhlIGluZGV4IHRvIGNoZWNrCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSBpbmRleCB0eXBlIChmb3IgZXJyb3IgbWVzc2FnZXMpCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tCb3VuZChmaW5hbCBpbnQgYm91bmQsIGZpbmFsIFN0cmluZyB0eXBlICkgewotICAgICAgICBpZiAoYm91bmQgPiB0aGlzLmVuZEluZGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBtYWtlIGFuIEFycmF5SXRlcmF0b3IgdGhhdCAiICsgdHlwZSArCi0gICAgICAgICAgICAgICJzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhcnJheS4gIgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm91bmQgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBtYWtlIGFuIEFycmF5SXRlcmF0b3IgdGhhdCAiICsgdHlwZSArCi0gICAgICAgICAgICAgICJzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LiAiCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyB0byByZXR1cm4gZnJvbSB0aGUgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IGVsZW1lbnQgdG8gcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChpbmRleCA8IGVuZEluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICAgICAqICBoYXZlIGFscmVhZHkgYmVlbiByZXR1cm5lZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgaWYgKGhhc05leHQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQXJyYXkuZ2V0KGFycmF5LCBpbmRleCsrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZSgpIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgLy8gUHJvcGVydGllcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSB0aGF0IHRoaXMgaXRlcmF0b3IgaXMgaXRlcmF0aW5nIG92ZXIuIAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgdGhpcyBpdGVyYXRvciBpdGVyYXRlcyBvdmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICB0aGUgbm8tYXJnIGNvbnN0cnVjdG9yIHdhcyB1c2VkIGFuZCB7QGxpbmsgI3NldEFycmF5KE9iamVjdCl9IGhhcyBuZXZlcgotICAgICAqICBiZWVuIGNhbGxlZCB3aXRoIGEgdmFsaWQgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhcnJheSB0aGF0IHRoZSBBcnJheUl0ZXJhdG9yIHNob3VsZCBpdGVyYXRlIG92ZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgYW4gYXJyYXkgaGFzIHByZXZpb3VzbHkgYmVlbiBzZXQgKHVzaW5nIHRoZSBzaW5nbGUtYXJnIGNvbnN0cnVjdG9yCi0gICAgICogb3IgdGhpcyBtZXRob2QpIHRoZW4gdGhhdCBhcnJheSBpcyBkaXNjYXJkZWQgaW4gZmF2b3VyIG9mIHRoaXMgb25lLgotICAgICAqIEl0ZXJhdGlvbiBpcyByZXN0YXJ0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXcgYXJyYXkuCi0gICAgICogQWx0aG91Z2ggdGhpcyBjYW4gYmUgdXNlZCB0byByZXNldCBpdGVyYXRpb24sIHRoZSB7QGxpbmsgI3Jlc2V0KCl9IG1ldGhvZAotICAgICAqIGlzIGEgbW9yZSBlZmZlY3RpdmUgY2hvaWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0aGF0IHRoZSBpdGVyYXRvciBzaG91bGQgaXRlcmF0ZSBvdmVyLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBub3QgYW4gYXJyYXkuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShmaW5hbCBPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgLy8gQXJyYXkuZ2V0TGVuZ3RoIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyBub3QKLSAgICAgICAgLy8gYW4gYXJyYXkgb3IgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyBudWxsLiAgVGhpcyBjYWxsCi0gICAgICAgIC8vIGlzIG1hZGUgYmVmb3JlIHNhdmluZyB0aGUgYXJyYXkgYW5kIHJlc2V0dGluZyB0aGUgaW5kZXggc28gdGhhdCB0aGUKLSAgICAgICAgLy8gYXJyYXkgaXRlcmF0b3IgcmVtYWlucyBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdAotICAgICAgICAvLyBhbiBhcnJheSBvciBpcyBudWxsLgotICAgICAgICB0aGlzLmVuZEluZGV4ID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gMDsKLSAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgICAgICB0aGlzLmluZGV4ID0gMDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBzdGFydCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuc3RhcnRJbmRleDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWRiY2JjNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IG92ZXIgYW4gYXJyYXkuIAotICogPHA+Ci0gKiBUaGUgYXJyYXkgY2FuIGJlIGVpdGhlciBhbiBhcnJheSBvZiBvYmplY3Qgb3Igb2YgcHJpbWl0aXZlcy4gSWYgeW91IGtub3cgCi0gKiB0aGF0IHlvdSBoYXZlIGFuIG9iamVjdCBhcnJheSwgdGhlIHtAbGluayBPYmplY3RBcnJheUxpc3RJdGVyYXRvcn0KLSAqIGNsYXNzIGlzIGEgYmV0dGVyIGNob2ljZSwgYXMgaXQgd2lsbCBwZXJmb3JtIGJldHRlci4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQge0BsaW5rICNhZGQoT2JqZWN0KX0gb3Ige0BsaW5rICNyZW1vdmUoKX0sIGFzIHRoZSBhcnJheSAKLSAqIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHNpemUuIFRoZSB7QGxpbmsgI3NldChPYmplY3QpfSBtZXRob2QgaXMgc3VwcG9ydGVkIGhvd2V2ZXIuCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3IKLSAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gKiBAc2VlIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICoKLSAqIEBhdXRob3IgTmVpbCBPJ1Rvb2xlCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBQaGlsIFN0ZWl0egotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3IgZXh0ZW5kcyBBcnJheUl0ZXJhdG9yCi0JCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yLCBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIEhvbGRzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpdGVtIHJldHVybmVkIGJ5IGEgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+Ci0gICAgICogb3IgPGNvZGU+cHJldmlvdXMoKTwvY29kZT4uIFRoaXMgaXMgc2V0IHRvIDxjb2RlPi0xPC9jb2RlPiBpZiBuZWl0aGVyIG1ldGhvZAotICAgICAqIGhhcyB5ZXQgYmVlbiBpbnZva2VkLiA8Y29kZT5sYXN0SXRlbUluZGV4PC9jb2RlPiBpcyB1c2VkIHRvIHRvIGltcGxlbWVudCAKLSAgICAgKiB0aGUge0BsaW5rICNzZXR9IG1ldGhvZC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbGFzdEl0ZW1JbmRleCA9IC0xOwotCi0gICAgLy8gQ29uc3RydWN0b3JzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2Ugd2l0aCA8Y29kZT5zZXRBcnJheTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVXNpbmcgdGhpcyBjb25zdHJ1Y3RvciwgdGhlIGl0ZXJhdG9yIGlzIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgaXRlcmF0b3IKLSAgICAgKiB1bnRpbCB7QGxpbmsgI3NldEFycmF5KE9iamVjdCl9IGlzICBjYWxsZWQgdG8gZXN0YWJsaXNoIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gQXJyYXlMaXN0SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YXJyYXk8L2NvZGU+IGlzIG5vdCBhbiBhcnJheS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3RJdGVyYXRvcihPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgc3VwZXIoYXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gQXJyYXlMaXN0SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBmcm9tIGEgc3BlY2lmaWMgc3RhcnQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIKLSAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGl0ZXJhdGluZyBhdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBub3QgYW4gYXJyYXkuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHN0YXJ0IGluZGV4IGlzIG91dCBvZiBib3VuZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoT2JqZWN0IGFycmF5LCBpbnQgc3RhcnRJbmRleCkgewotICAgICAgICBzdXBlcihhcnJheSwgc3RhcnRJbmRleCk7Ci0gICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIEFycmF5TGlzdEl0ZXJhdG9yIHRoYXQgd2lsbCBpdGVyYXRlIG92ZXIgYSByYW5nZSBvZiB2YWx1ZXMgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IHRvIGl0ZXJhdGUgb3ZlcgotICAgICAqIEBwYXJhbSBzdGFydEluZGV4ICB0aGUgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIGF0Ci0gICAgICogQHBhcmFtIGVuZEluZGV4ICB0aGUgaW5kZXggKGV4Y2x1c2l2ZSkgdG8gZmluaXNoIGl0ZXJhdGluZyBhdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBub3QgYW4gYXJyYXkuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBzdGFydCBvciBlbmQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVuZCBpbmRleCBpcyBiZWZvcmUgdGhlIHN0YXJ0Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoT2JqZWN0IGFycmF5LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0gICAgICAgIHN1cGVyKGFycmF5LCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgfQotCi0gICAgLy8gTGlzdEl0ZXJhdG9yIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHByZXZpb3VzIGVsZW1lbnRzIHRvIHJldHVybiBmcm9tIHRoZSBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGVsZW1lbnQgdG8gcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiAodGhpcy5pbmRleCA+IHRoaXMuc3RhcnRJbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJldmlvdXMgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBlbGVtZW50Ci0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICBpZiAoaGFzUHJldmlvdXMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxhc3RJdGVtSW5kZXggPSAtLXRoaXMuaW5kZXg7Ci0gICAgICAgIHJldHVybiBBcnJheS5nZXQodGhpcy5hcnJheSwgdGhpcy5pbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBuZXh0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmIChoYXNOZXh0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sYXN0SXRlbUluZGV4ID0gdGhpcy5pbmRleDsKLSAgICAgICAgcmV0dXJuIEFycmF5LmdldCh0aGlzLmFycmF5LCB0aGlzLmluZGV4KyspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5leHQgaW5kZXggdG8gYmUgcmV0cmlldmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGJlIHJldHJpZXZlZCBuZXh0Ci0gICAgICovCi0gICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluZGV4IC0gdGhpcy5zdGFydEluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGJlIHJldHJpZXZlZCBpZiB7QGxpbmsgI3ByZXZpb3VzKCl9IGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSByZXRyaWV2ZWQgbmV4dAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSB0aGlzLnN0YXJ0SW5kZXggLSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCBtb2RpZmljYXRpb24gb2YgaXRzIGJhY2tpbmcgY29sbGVjdGlvbiwgYW5kIHNvIHdpbGwKLSAgICAgKiBhbHdheXMgdGhyb3cgYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSB3aGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cyB0aHJvd24uCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI3NldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImFkZCgpIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCB1bmRlciB0aGUgY3Vyc29yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCAKLSAgICAgKiB0byB7QGxpbmsgI25leHQoKX0gb2Yge0BsaW5rICNwcmV2aW91cygpfS4gCi0gICAgICogPHA+Ci0gICAgICogPGI+Tm90ZTo8L2I+IHtAbGluayBMaXN0SXRlcmF0b3J9IGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQKLSAgICAgKiA8Y29kZT5hZGQoKTwvY29kZT4gYW5kIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBvbmx5IGFsbG93IDxjb2RlPnNldCgpPC9jb2RlPiB0byBiZSBjYWxsZWQKLSAgICAgKiBvbmNlIHBlciBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4gb3IgPGNvZGU+cHJldmlvdXM8L2NvZGU+IChzZWUgdGhlIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gICAgICogamF2YWRvYyBmb3IgbW9yZSBkZXRhaWxzKS4gU2luY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzCi0gICAgICogbm90IHN1cHBvcnQgPGNvZGU+YWRkKCk8L2NvZGU+IG9yIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiwgPGNvZGU+c2V0KCk8L2NvZGU+IG1heSBiZQotICAgICAqIGNhbGxlZCBhcyBvZnRlbiBhcyBkZXNpcmVkLgotICAgICAqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI3NldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgbykgewotICAgICAgICBpZiAodGhpcy5sYXN0SXRlbUluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtdXN0IGNhbGwgbmV4dCgpIG9yIHByZXZpb3VzKCkgYmVmb3JlIGEgY2FsbCB0byBzZXQoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXkuc2V0KHRoaXMuYXJyYXksIHRoaXMubGFzdEl0ZW1JbmRleCwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBzdGFydCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgc3VwZXIucmVzZXQoKTsKLSAgICAgICAgdGhpcy5sYXN0SXRlbUluZGV4ID0gLTE7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0NvbGxhdGluZ0l0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0NvbGxhdGluZ0l0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMTg2MzQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Db2xsYXRpbmdJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LlVubW9kaWZpYWJsZUxpc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgYW4gb3JkZXJlZCBpdGVyYXRpb24gb3ZlciB0aGUgZWxlbWVudHMgY29udGFpbmVkIGluCi0gKiBhIGNvbGxlY3Rpb24gb2Ygb3JkZXJlZCBJdGVyYXRvcnMuCi0gKiA8cD4KLSAqIEdpdmVuIHR3byBvcmRlcmVkIHtAbGluayBJdGVyYXRvcn0gaW5zdGFuY2VzIDxjb2RlPkE8L2NvZGU+IGFuZCA8Y29kZT5CPC9jb2RlPiwKLSAqIHRoZSB7QGxpbmsgI25leHR9IG1ldGhvZCBvbiB0aGlzIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIHRoZSBsZXNzZXIgb2YgCi0gKiA8Y29kZT5BLm5leHQoKTwvY29kZT4gYW5kIDxjb2RlPkIubmV4dCgpPC9jb2RlPi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIENvbGxhdGluZ0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgLyoqIFRoZSB7QGxpbmsgQ29tcGFyYXRvcn0gdXNlZCB0byBldmFsdWF0ZSBvcmRlci4gKi8KLSAgICBwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG51bGw7Ci0KLSAgICAvKiogVGhlIGxpc3Qgb2Yge0BsaW5rIEl0ZXJhdG9yfXMgdG8gZXZhbHVhdGUuICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgaXRlcmF0b3JzID0gbnVsbDsKLSAgIAotICAgIC8qKiB7QGxpbmsgSXRlcmF0b3IjbmV4dCBOZXh0fSBvYmplY3RzIHBlZWtlZCBmcm9tIGVhY2ggaXRlcmF0b3IuICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgdmFsdWVzID0gbnVsbDsKLSAgICAKLSAgICAvKiogV2hldGhlciBvciBub3QgZWFjaCB7QGxpbmsgI3ZhbHVlc30gZWxlbWVudCBoYXMgYmVlbiBzZXQuICovCi0gICAgcHJpdmF0ZSBCaXRTZXQgdmFsdWVTZXQgPSBudWxsOwotCi0gICAgLyoqIEluZGV4IG9mIHRoZSB7QGxpbmsgI2l0ZXJhdG9ycyBpdGVyYXRvcn0gZnJvbSB3aG9tIHRoZSBsYXN0IHJldHVybmVkIHZhbHVlIHdhcyBvYnRhaW5lZC4gKi8KLSAgICBwcml2YXRlIGludCBsYXN0UmV0dXJuZWQgPSAtMTsKLQotICAgIC8vIENvbnN0cnVjdG9ycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkNvbGxhdGluZ0l0ZXJhdG9yPC9jb2RlPi4gIE5hdHVyYWwgc29ydCBvcmRlcgotICAgICAqIHdpbGwgYmUgdXNlZCwgYW5kIGNoaWxkIGl0ZXJhdG9ycyB3aWxsIGhhdmUgdG8gYmUgbWFudWFsbHkgYWRkZWQgCi0gICAgICogdXNpbmcgdGhlIHtAbGluayAjYWRkSXRlcmF0b3IoSXRlcmF0b3IpfSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIENvbGxhdGluZ0l0ZXJhdG9yKCkgewotICAgICAgICB0aGlzKG51bGwsMik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+Q29sbGF0aW5nSXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCB1c2VkIHRoZQotICAgICAqIHNwZWNpZmllZCBjb21wYXJhdG9yIGZvciBvcmRlcmluZy4gIENoaWxkIGl0ZXJhdG9ycyB3aWxsIGhhdmUgdG8gYmUgCi0gICAgICogbWFudWFsbHkgYWRkZWQgdXNpbmcgdGhlIHtAbGluayAjYWRkSXRlcmF0b3IoSXRlcmF0b3IpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcCAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlIHRvIHNvcnQsIG9yIG51bGwgdG8gdXNlIG5hdHVyYWwgc29ydCBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsYXRpbmdJdGVyYXRvcihmaW5hbCBDb21wYXJhdG9yIGNvbXApIHsKLSAgICAgICAgdGhpcyhjb21wLDIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkNvbGxhdGluZ0l0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgdXNlZCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvciBmb3Igb3JkZXJpbmcgYW5kIGhhdmUgdGhlIHNwZWNpZmllZCBpbml0aWFsCi0gICAgICogY2FwYWNpdHkuICBDaGlsZCBpdGVyYXRvcnMgd2lsbCBoYXZlIHRvIGJlIAotICAgICAqIG1hbnVhbGx5IGFkZGVkIHVzaW5nIHRoZSB7QGxpbmsgI2FkZEl0ZXJhdG9yKEl0ZXJhdG9yKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXAgIHRoZSBjb21wYXJhdG9yIHRvIHVzZSB0byBzb3J0LCBvciBudWxsIHRvIHVzZSBuYXR1cmFsIHNvcnQgb3JkZXIKLSAgICAgKiBAcGFyYW0gaW5pdEl0ZXJDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBpbnRlcm5hbCBsaXN0Ci0gICAgICogICAgb2YgY2hpbGQgaXRlcmF0b3JzCi0gICAgICovCi0gICAgcHVibGljIENvbGxhdGluZ0l0ZXJhdG9yKGZpbmFsIENvbXBhcmF0b3IgY29tcCwgZmluYWwgaW50IGluaXRJdGVyQ2FwYWNpdHkpIHsKLSAgICAgICAgaXRlcmF0b3JzID0gbmV3IEFycmF5TGlzdChpbml0SXRlckNhcGFjaXR5KTsKLSAgICAgICAgc2V0Q29tcGFyYXRvcihjb21wKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkNvbGxhdGluZ0l0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgdXNlIHRoZQotICAgICAqIHNwZWNpZmllZCBjb21wYXJhdG9yIHRvIHByb3ZpZGUgb3JkZXJlZCBpdGVyYXRpb24gb3ZlciB0aGUgdHdvCi0gICAgICogZ2l2ZW4gaXRlcmF0b3JzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXAgIHRoZSBjb21wYXJhdG9yIHRvIHVzZSB0byBzb3J0LCBvciBudWxsIHRvIHVzZSBuYXR1cmFsIHNvcnQgb3JkZXIKLSAgICAgKiBAcGFyYW0gYSAgdGhlIGZpcnN0IGNoaWxkIG9yZGVyZWQgaXRlcmF0b3IKLSAgICAgKiBAcGFyYW0gYiAgdGhlIHNlY29uZCBjaGlsZCBvcmRlcmVkIGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDb2xsYXRpbmdJdGVyYXRvcihmaW5hbCBDb21wYXJhdG9yIGNvbXAsIGZpbmFsIEl0ZXJhdG9yIGEsIGZpbmFsIEl0ZXJhdG9yIGIpIHsKLSAgICAgICAgdGhpcyhjb21wLDIpOwotICAgICAgICBhZGRJdGVyYXRvcihhKTsKLSAgICAgICAgYWRkSXRlcmF0b3IoYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Db2xsYXRpbmdJdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIHVzZSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvciB0byBwcm92aWRlIG9yZGVyZWQgaXRlcmF0aW9uIG92ZXIgdGhlIGFycmF5Ci0gICAgICogb2YgaXRlcmF0b3JzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXAgIHRoZSBjb21wYXJhdG9yIHRvIHVzZSB0byBzb3J0LCBvciBudWxsIHRvIHVzZSBuYXR1cmFsIHNvcnQgb3JkZXIKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3JzICB0aGUgYXJyYXkgb2YgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgYXJyYXkgaXMgb3IgY29udGFpbnMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDb2xsYXRpbmdJdGVyYXRvcihmaW5hbCBDb21wYXJhdG9yIGNvbXAsIGZpbmFsIEl0ZXJhdG9yW10gaXRlcmF0b3JzKSB7Ci0gICAgICAgIHRoaXMoY29tcCwgaXRlcmF0b3JzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRJdGVyYXRvcihpdGVyYXRvcnNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Db2xsYXRpbmdJdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIHVzZSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY29tcGFyYXRvciB0byBwcm92aWRlIG9yZGVyZWQgaXRlcmF0aW9uIG92ZXIgdGhlIGNvbGxlY3Rpb24KLSAgICAgKiBvZiBpdGVyYXRvcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcCAgdGhlIGNvbXBhcmF0b3IgdG8gdXNlIHRvIHNvcnQsIG9yIG51bGwgdG8gdXNlIG5hdHVyYWwgc29ydCBvcmRlcgotICAgICAqIEBwYXJhbSBpdGVyYXRvcnMgIHRoZSBjb2xsZWN0aW9uIG9mIGl0ZXJhdG9ycwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdG9ycyBjb2xsZWN0aW9uIGlzIG9yIGNvbnRhaW5zIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3JzIGNvbGxlY3Rpb24gY29udGFpbnMgYW4KLSAgICAgKiAgICAgICAgIGVsZW1lbnQgdGhhdCdzIG5vdCBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gICAgICovCi0gICAgcHVibGljIENvbGxhdGluZ0l0ZXJhdG9yKGZpbmFsIENvbXBhcmF0b3IgY29tcCwgZmluYWwgQ29sbGVjdGlvbiBpdGVyYXRvcnMpIHsKLSAgICAgICAgdGhpcyhjb21wLCBpdGVyYXRvcnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGl0ZXJhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVtID0gKEl0ZXJhdG9yKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBhZGRJdGVyYXRvcihpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFB1YmxpYyBNZXRob2RzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIHtAbGluayBJdGVyYXRvcn0gdG8gdGhlIGl0ZXJhdG9ycyBiZWluZyBjb2xsYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBhZGQgdG8gdGhlIGNvbGxhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGl0ZXJhdGlvbiBoYXMgc3RhcnRlZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJdGVyYXRvcihmaW5hbCBJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBjaGVja05vdFN0YXJ0ZWQoKTsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGl0ZXJhdG9ycy5hZGQoaXRlcmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGl0ZXJhdG9yIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIGluZGV4IG9mIHRoZSBJdGVyYXRvciB0byByZXBsYWNlCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICBJdGVyYXRvciB0byBwbGFjZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggJmx0OyAwIG9yIGluZGV4ICZndDsgc2l6ZSgpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXRlcmF0aW9uIGhhcyBzdGFydGVkCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZXJhdG9yKGZpbmFsIGludCBpbmRleCwgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgY2hlY2tOb3RTdGFydGVkKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpdGVyYXRvcnMuc2V0KGluZGV4LCBpdGVyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBJdGVyYXRvcnMgKHVubW9kaWZpYWJsZSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdW5tb2RpZmlhYmxlIGxpc3Qgb2YgaXRlcmF0b3JzIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SXRlcmF0b3JzKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdC5kZWNvcmF0ZShpdGVyYXRvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBDb21wYXJhdG9yfSBieSB3aGljaCBjb2xsYXRhdGlvbiBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIENvbXBhcmF0b3J9IGJ5IHdoaWNoIGNvbGxhdGlvbiBvY2N1cnMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXRlcmF0aW9uIGhhcyBzdGFydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihmaW5hbCBDb21wYXJhdG9yIGNvbXApIHsKLSAgICAgICAgY2hlY2tOb3RTdGFydGVkKCk7Ci0gICAgICAgIGNvbXBhcmF0b3IgPSBjb21wOwotICAgIH0KLQotICAgIC8vIEl0ZXJhdG9yIE1ldGhvZHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgY2hpbGQgaXRlcmF0b3IgaGFzIHJlbWFpbmluZyBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGhhcyByZW1haW5pbmcgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBzdGFydCgpOwotICAgICAgICByZXR1cm4gYW55VmFsdWVTZXQodmFsdWVTZXQpIHx8IGFueUhhc05leHQoaXRlcmF0b3JzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IG9yZGVyZWQgZWxlbWVudCBmcm9tIGEgY2hpbGQgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IG9yZGVyZWQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBubyBjaGlsZCBpdGVyYXRvciBoYXMgYW55IG1vcmUgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChoYXNOZXh0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxlYXN0SW5kZXggPSBsZWFzdCgpOwotICAgICAgICBpZiAobGVhc3RJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSB2YWx1ZXMuZ2V0KGxlYXN0SW5kZXgpOwotICAgICAgICAgICAgY2xlYXIobGVhc3RJbmRleCk7Ci0gICAgICAgICAgICBsYXN0UmV0dXJuZWQgPSBsZWFzdEluZGV4OwotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGxhc3QgcmV0dXJuZWQgZWxlbWVudCBmcm9tIHRoZSBjaGlsZCBpdGVyYXRvciB0aGF0IAotICAgICAqIHByb2R1Y2VkIGl0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gbGFzdCByZXR1cm5lZCBlbGVtZW50LAotICAgICAqICBvciBpZiB0aGUgbGFzdCByZXR1cm5lZCBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaWYgKGxhc3RSZXR1cm5lZCA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gdmFsdWUgY2FuIGJlIHJlbW92ZWQgYXQgcHJlc2VudCIpOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gKEl0ZXJhdG9yKSAoaXRlcmF0b3JzLmdldChsYXN0UmV0dXJuZWQpKTsKLSAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgfQotCi0gICAgLy8gUHJpdmF0ZSBNZXRob2RzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiAKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY29sbGF0aW5nIHN0YXRlIGlmIGl0IGhhc24ndCBiZWVuIGFscmVhZHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoaXRlcmF0b3JzLnNpemUoKSk7Ci0gICAgICAgICAgICB2YWx1ZVNldCA9IG5ldyBCaXRTZXQoaXRlcmF0b3JzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdG9ycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTZXQuY2xlYXIoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUge0BsaW5rICN2YWx1ZXN9IGFuZCB7QGxpbmsgI3ZhbHVlU2V0fSBhdHRyaWJ1dGVzIAotICAgICAqIGF0IHBvc2l0aW9uIDxpPmk8L2k+IHRvIHRoZSBuZXh0IHZhbHVlIG9mIHRoZSAKLSAgICAgKiB7QGxpbmsgI2l0ZXJhdG9ycyBpdGVyYXRvcn0gYXQgcG9zaXRpb24gPGk+aTwvaT4sIG9yIAotICAgICAqIGNsZWFyIHRoZW0gaWYgdGhlIDxpPmk8L2k+PHN1cD50aDwvc3VwPiBpdGVyYXRvcgotICAgICAqIGhhcyBubyBuZXh0IHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZmYgdGhlcmUgd2FzIG5vIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXQoaW50IGkpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSAoSXRlcmF0b3IpKGl0ZXJhdG9ycy5nZXQoaSkpOwotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZXMuc2V0KGksIGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICB2YWx1ZVNldC5zZXQoaSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlcy5zZXQoaSxudWxsKTsKLSAgICAgICAgICAgIHZhbHVlU2V0LmNsZWFyKGkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIENsZWFycyB0aGUge0BsaW5rICN2YWx1ZXN9IGFuZCB7QGxpbmsgI3ZhbHVlU2V0fSBhdHRyaWJ1dGVzIAotICAgICAqIGF0IHBvc2l0aW9uIDxpPmk8L2k+LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhcihpbnQgaSkgewotICAgICAgICB2YWx1ZXMuc2V0KGksbnVsbCk7Ci0gICAgICAgIHZhbHVlU2V0LmNsZWFyKGkpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaHJvd3Mge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgaXRlcmF0aW9uIGhhcyBzdGFydGVkIAotICAgICAqIHZpYSB7QGxpbmsgI3N0YXJ0fS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpdGVyYXRpb24gc3RhcnRlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja05vdFN0YXJ0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBkbyB0aGF0IGFmdGVyIG5leHQgb3IgaGFzTmV4dCBoYXMgYmVlbiBjYWxsZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxlYXN0IGVsZW1lbnQgaW4ge0BsaW5rICN2YWx1ZXN9LAotICAgICAqIHtAbGluayAjc2V0KGludCkgc2V0dGluZ30gYW55IHVuaW5pdGlhbGl6ZWQgdmFsdWVzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbGVhc3QoKSB7Ci0gICAgICAgIGludCBsZWFzdEluZGV4ID0gLTE7Ci0gICAgICAgIE9iamVjdCBsZWFzdE9iamVjdCA9IG51bGw7ICAgICAgICAgICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHZhbHVlU2V0LmdldChpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHNldChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZVNldC5nZXQoaSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGVhc3RJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBsZWFzdEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbGVhc3RPYmplY3QgPSB2YWx1ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBjdXJPYmplY3QgPSB2YWx1ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlKGN1ck9iamVjdCxsZWFzdE9iamVjdCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWFzdE9iamVjdCA9IGN1ck9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlYXN0SW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsZWFzdEluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIGFueSBiaXQgaW4gdGhlIGdpdmVuIHNldCBpcyAKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYW55VmFsdWVTZXQoQml0U2V0IHNldCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHNldC5nZXQoaSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgYW55IHtAbGluayBJdGVyYXRvcn0gCi0gICAgICogaW4gdGhlIGdpdmVuIGxpc3QgaGFzIGEgbmV4dCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYW55SGFzTmV4dChBcnJheUxpc3QgaXRlcnMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoSXRlcmF0b3IpIGl0ZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTQwMmI4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLQotLyoqIAotICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYW4gZW1wdHkgaXRlcmF0b3IuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYW4gZW1wdHkgaXRlcmF0b3IuCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGZvciBiaW5hcnkgY29tcGF0YWJpbGl0eSBiZXR3ZWVuIENvbW1vbnMgQ29sbGVjdGlvbnMKLSAqIDIuMS4xIGFuZCAzLjEgZHVlIHRvIGlzc3VlcyB3aXRoIDxjb2RlPkl0ZXJhdG9yVXRpbHM8L2NvZGU+LgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMS4xIGFuZCAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVzZXR0YWJsZUl0ZXJhdG9yIFJFU0VUVEFCTEVfSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgaXRlcmF0b3IuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4xLjEgYW5kIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSXRlcmF0b3IgSU5TVEFOQ0UgPSBSRVNFVFRBQkxFX0lOU1RBTkNFOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVtcHR5SXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxMTgyMjkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5SZXNldHRhYmxlTGlzdEl0ZXJhdG9yOwotCi0vKiogCi0gKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlbXB0eSBsaXN0IGl0ZXJhdG9yLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGFuIGVtcHR5IGxpc3QgaXRlcmF0b3IuCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGZvciBiaW5hcnkgY29tcGF0YWJpbGl0eSBiZXR3ZWVuIENvbW1vbnMgQ29sbGVjdGlvbnMKLSAqIDIuMS4xIGFuZCAzLjEgZHVlIHRvIGlzc3VlcyB3aXRoIDxjb2RlPkl0ZXJhdG9yVXRpbHM8L2NvZGU+LgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMS4xIGFuZCAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgaXRlcmF0b3IuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIFJFU0VUVEFCTEVfSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmF0b3IoKTsKLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMS4xIGFuZCAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3RJdGVyYXRvciBJTlNUQU5DRSA9IFJFU0VUVEFCTEVfSU5TVEFOQ0U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRW1wdHlMaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5TWFwSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlNYXBJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDg3OTNiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlNYXBJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5SZXNldHRhYmxlSXRlcmF0b3I7Ci0KLS8qKiAKLSAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGFuIGVtcHR5IG1hcCBpdGVyYXRvci4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlNYXBJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIE1hcEl0ZXJhdG9yLCBSZXNldHRhYmxlSXRlcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBpdGVyYXRvci4KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcEl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5TWFwSXRlcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbXB0eU1hcEl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU9yZGVyZWRJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU9yZGVyZWRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmIzYTdmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW1wdHlPcmRlcmVkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLQotLyoqIAotICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYW4gZW1wdHkgb3JkZXJlZCBpdGVyYXRvci4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlPcmRlcmVkSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkSXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3JkZXJlZEl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5T3JkZXJlZEl0ZXJhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRW1wdHlPcmRlcmVkSXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkYTFlZmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbXB0eU9yZGVyZWRNYXBJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUl0ZXJhdG9yOwotCi0vKiogCi0gKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlbXB0eSBvcmRlcmVkIG1hcCBpdGVyYXRvci4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlPcmRlcmVkTWFwSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkTWFwSXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3JkZXJlZE1hcEl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRW1wdHlPcmRlcmVkTWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0VudHJ5U2V0TWFwSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW50cnlTZXRNYXBJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTM4YTRkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW50cnlTZXRNYXBJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGEgPGNvZGU+TWFwSXRlcmF0b3I8L2NvZGU+IHVzaW5nIGEgTWFwIGVudHJ5U2V0LgotICogUmV2ZXJzZSBpdGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqIDxwcmU+Ci0gKiBNYXBJdGVyYXRvciBpdCA9IG1hcC5tYXBJdGVyYXRvcigpOwotICogd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICogICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICogICBPYmplY3QgdmFsdWUgPSBpdC5nZXRWYWx1ZSgpOwotICogICBpdC5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqICAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEVudHJ5U2V0TWFwSXRlcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciwgUmVzZXR0YWJsZUl0ZXJhdG9yIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcCBtYXA7Ci0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLSAgICBwcml2YXRlIE1hcC5FbnRyeSBsYXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGl0ZXJhdGUgb3ZlcgotICAgICAqLwotICAgIHB1YmxpYyBFbnRyeVNldE1hcEl0ZXJhdG9yKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBtYXA7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgbW9yZSBlbnRyaWVzIHN0aWxsIHRvIGJlIGl0ZXJhdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaXRlcmF0b3IgaGFzIG1vcmUgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5leHQgPGVtPmtleTwvZW0+IGZyb20gdGhlIDxjb2RlPk1hcDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGtleSBpbiB0aGUgaXRlcmF0aW9uCi0gICAgICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0aW9uIGlzIGZpbmlzaGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBsYXN0ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBjYW5SZW1vdmUgPSB0cnVlOwotICAgICAgICByZXR1cm4gbGFzdC5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGFzdCByZXR1cm5lZCBrZXkgZnJvbSB0aGUgdW5kZXJseWluZyA8Y29kZT5NYXA8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb25jZSBwZXIgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiByZW1vdmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbWFwCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+bmV4dCgpPC9jb2RlPiBoYXMgbm90IHlldCBiZWVuIGNhbGxlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAotICAgICAqICBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIHJlbW92ZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGFmdGVyIG5leHQoKSIpOwotICAgICAgICB9Ci0gICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGtleSwgd2hpY2ggaXMgdGhlIGtleSByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsCi0gICAgICogdG8gPGNvZGU+bmV4dCgpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQga2V5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+bmV4dCgpPC9jb2RlPiBoYXMgbm90IHlldCBiZWVuIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdGVyYXRvciBnZXRLZXkoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbmV4dCgpIGFuZCBiZWZvcmUgcmVtb3ZlKCkiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFzdC5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlLCB3aGljaCBpcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXN0IGtleQotICAgICAqIHJldHVybmVkIGJ5IDxjb2RlPm5leHQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+bmV4dCgpPC9jb2RlPiBoYXMgbm90IHlldCBiZWVuIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIGdldFZhbHVlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhc3QuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHNldFZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPm5leHQoKTwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5yZW1vdmUoKTwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIHNpbmNlIHRoZQotICAgICAqICBsYXN0IGNhbGwgdG8gPGNvZGU+bmV4dCgpPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIHNldFZhbHVlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhc3Quc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgaXRlcmF0b3IgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGl0ZXJhdG9yIGFzIGEgU3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgaXRlcmF0b3IKLSAgICAgKi8gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJNYXBJdGVyYXRvclsiICsgZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpICsgIl0iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJNYXBJdGVyYXRvcltdIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkZDQ2ZjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKiogCi0gKiBBZGFwdGVyIHRvIG1ha2Uge0BsaW5rIEVudW1lcmF0aW9uIEVudW1lcmF0aW9ufSBpbnN0YW5jZXMgYXBwZWFyCi0gKiB0byBiZSB7QGxpbmsgSXRlcmF0b3IgSXRlcmF0b3J9IGluc3RhbmNlcy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkbHJAZmluZW1hbHRjb2RpbmcuY29tIj5EYW5pZWwgUmFsbDwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgCi0gICAgLyoqIFRoZSBjb2xsZWN0aW9uIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tICovCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0gICAgLyoqIFRoZSBlbnVtZXJhdGlvbiBiZWluZyBjb252ZXJ0ZWQgKi8KLSAgICBwcml2YXRlIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uOwotICAgIC8qKiBUaGUgbGFzdCBvYmplY3QgcmV0cmlldmVkICovCi0gICAgcHJpdmF0ZSBPYmplY3QgbGFzdDsKLSAgICAKLSAgICAvLyBDb25zdHJ1Y3RvcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgbm90Ci0gICAgICogZnVuY3Rpb24gdW50aWwge0BsaW5rICNzZXRFbnVtZXJhdGlvbihFbnVtZXJhdGlvbil9IGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcigpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkVudW1lcmF0aW9uSXRlcmF0b3I8L2NvZGU+IHRoYXQgcHJvdmlkZXMKLSAgICAgKiBhbiBpdGVyYXRvciB2aWV3IG9mIHRoZSBnaXZlbiBlbnVtZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnVtZXJhdGlvbiAgdGhlIGVudW1lcmF0aW9uIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbkl0ZXJhdG9yKGZpbmFsIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uKSB7Ci0gICAgICAgIHRoaXMoZW51bWVyYXRpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RW51bWVyYXRpb25JdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIHJlbW92ZQotICAgICAqIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudW1lcmF0aW9uICB0aGUgZW51bWVyYXRpb24gdG8gdXNlCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gIHRoZSBjb2xsZWN0aW9uIHRvIHJlbW92ZSBlbGVtZW50cyBmb3JtCi0gICAgICovCi0gICAgcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3IoZmluYWwgRW51bWVyYXRpb24gZW51bWVyYXRpb24sIGZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmVudW1lcmF0aW9uID0gZW51bWVyYXRpb247Ci0gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0gICAgICAgIHRoaXMubGFzdCA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlbnVtZXJhdGlvbiBoYXMgbW9yZSBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlbnVtZXJhdGlvbiBoYXMgbW9yZSBlbGVtZW50cwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGVudW1lcmF0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBlbnVtZXJhdGlvbgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGVudW1lcmF0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGxhc3QgPSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gbGFzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IHJldHJpZXZlZCBlbGVtZW50IGlmIGEgY29sbGVjdGlvbiBpcyBhdHRhY2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBGdW5jdGlvbnMgaWYgYW4gYXNzb2NpYXRlZCA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBpcyBrbm93bi4KLSAgICAgKiBJZiBzbywgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGxhc3QgcmV0dXJuZWQgb2JqZWN0IGZyb20gdGhpcwotICAgICAqIGl0ZXJhdG9yIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gPGNvZGU+bmV4dCgpPC9jb2RlPiBub3QgY2FsbGVkLgotICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbm8gYXNzb2NpYXRlZCBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5yZW1vdmUobGFzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5leHQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZm9yIHJlbW92ZSgpIHRvIGZ1bmN0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIENvbGxlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgSXRlcmF0b3IiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBlbnVtZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgZW51bWVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bWVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBlbnVtZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB1bmRlcmx5aW5nIGVudW1lcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudW1lcmF0aW9uICB0aGUgbmV3IHVuZGVybHlpbmcgZW51bWVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGlvbihmaW5hbCBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikgewotICAgICAgICB0aGlzLmVudW1lcmF0aW9uID0gZW51bWVyYXRpb247Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9GaWx0ZXJJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9GaWx0ZXJJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzQ1NjY1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvRmlsdGVySXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQsMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqIAotICogRGVjb3JhdGVzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfSB1c2luZyBhIHByZWRpY2F0ZSB0byBmaWx0ZXIgZWxlbWVudHMuCi0gKiA8cD4KLSAqIFRoaXMgaXRlcmF0b3IgZGVjb3JhdGVzIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yLCBvbmx5IGFsbG93aW5nIHRocm91Z2gKLSAqIHRob3NlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCB7QGxpbmsgUHJlZGljYXRlIFByZWRpY2F0ZX0uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBKYW4gU29yZW5zZW4KLSAqIEBhdXRob3IgUmFscGggV2FnbmVyCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVySXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdG9yIGJlaW5nIHVzZWQgKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIC8qKiBUaGUgcHJlZGljYXRlIGJlaW5nIHVzZWQgKi8KLSAgICBwcml2YXRlIFByZWRpY2F0ZSBwcmVkaWNhdGU7Ci0gICAgLyoqIFRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uICovCi0gICAgcHJpdmF0ZSBPYmplY3QgbmV4dE9iamVjdDsKLSAgICAvKiogV2hldGhlciB0aGUgbmV4dCBvYmplY3QgaGFzIGJlZW4gY2FsY3VsYXRlZCB5ZXQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmV4dE9iamVjdFNldCA9IGZhbHNlOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RmlsdGVySXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCBub3QgZnVuY3Rpb24KLSAgICAgKiB1bnRpbCB7QGxpbmsgI3NldEl0ZXJhdG9yKEl0ZXJhdG9yKSBzZXRJdGVyYXRvcn0gaXMgaW52b2tlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsdGVySXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GaWx0ZXJJdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIG5vdCBmdW5jdGlvbgotICAgICAqIHVudGlsIHtAbGluayAjc2V0UHJlZGljYXRlKFByZWRpY2F0ZSkgc2V0UHJlZGljYXRlfSBpcyBpbnZva2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIEZpbHRlckl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkZpbHRlckl0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgdXNlIHRoZQotICAgICAqIGdpdmVuIGl0ZXJhdG9yIGFuZCBwcmVkaWNhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvciwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGNvbnRhaW5zIGFuIG9iamVjdCB0aGF0IAotICAgICAqIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIHByZWRpY2F0ZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBpdGVyYXRvciBvciBwcmVkaWNhdGUgYXJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBpZiAobmV4dE9iamVjdFNldCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0TmV4dE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFJldHVybnMgdGhlIG5leHQgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3Qgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgdGhlIGl0ZXJhdG9yIG9yIHByZWRpY2F0ZSBhcmUgbnVsbAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyB0aGF0Ci0gICAgICogIG1hdGNoIHRoZSBwcmVkaWNhdGUgCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBpZiAoIW5leHRPYmplY3RTZXQpIHsKLSAgICAgICAgICAgIGlmICghc2V0TmV4dE9iamVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXh0T2JqZWN0U2V0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBuZXh0T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgZnJvbSB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG9mIHRoZSBiYXNlIGl0ZXJhdG9yIHRoZSBsYXN0Ci0gICAgICogZWxlbWVudCByZXR1cm5lZCBieSB0aGlzIGl0ZXJhdG9yLgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZAotICAgICAqIGlmIDxjb2RlPm5leHQoKTwvY29kZT4gd2FzIGNhbGxlZCwgYnV0IG5vdCBhZnRlcgotICAgICAqIDxjb2RlPmhhc05leHQoKTwvY29kZT4sIGJlY2F1c2UgdGhlIDxjb2RlPmhhc05leHQoKTwvY29kZT4gY2FsbAotICAgICAqIGNoYW5nZXMgdGhlIGJhc2UgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+IGhhcyBhbHJlYWR5Ci0gICAgICogIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaWYgKG5leHRPYmplY3RTZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJlbW92ZSgpIGNhbm5vdCBiZSBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIAotICAgICAqIEdldHMgdGhlIGl0ZXJhdG9yIHRoaXMgaXRlcmF0b3IgaXMgdXNpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSBpdGVyYXRvciBmb3IgdGhpcyBpdGVyYXRvciB0byB1c2UuCi0gICAgICogSWYgaXRlcmF0aW9uIGhhcyBzdGFydGVkLCB0aGlzIGVmZmVjdGl2ZWx5IHJlc2V0cyB0aGUgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIG5leHRPYmplY3QgPSBudWxsOwotICAgICAgICBuZXh0T2JqZWN0U2V0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiAKLSAgICAgKiBHZXRzIHRoZSBwcmVkaWNhdGUgdGhpcyBpdGVyYXRvciBpcyB1c2luZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZQotICAgICAqLwotICAgIHB1YmxpYyBQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCkgewotICAgICAgICByZXR1cm4gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSBwcmVkaWNhdGUgdGhpcyB0aGUgaXRlcmF0b3IgdG8gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKLSAgICAgICAgbmV4dE9iamVjdCA9IG51bGw7Ci0gICAgICAgIG5leHRPYmplY3RTZXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2V0IG5leHRPYmplY3QgdG8gdGhlIG5leHQgb2JqZWN0LiBJZiB0aGVyZSBhcmUgbm8gbW9yZSAKLSAgICAgKiBvYmplY3RzIHRoZW4gcmV0dXJuIGZhbHNlLiBPdGhlcndpc2UsIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXROZXh0T2JqZWN0KCkgewotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5ldmFsdWF0ZShvYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dE9iamVjdCA9IG9iamVjdDsKLSAgICAgICAgICAgICAgICBuZXh0T2JqZWN0U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0ZpbHRlckxpc3RJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9GaWx0ZXJMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDMzMmRkNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0ZpbHRlckxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKiAKLSAqIERlY29yYXRlcyBhbm90aGVyIHtAbGluayBMaXN0SXRlcmF0b3J9IHVzaW5nIGEgcHJlZGljYXRlIHRvIGZpbHRlciBlbGVtZW50cy4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBkZWNvcmF0ZXMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IsIG9ubHkgYWxsb3dpbmcgdGhyb3VnaAotICogdGhvc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHtAbGluayBQcmVkaWNhdGUgUHJlZGljYXRlfS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKiBUaGUgaXRlcmF0b3IgYmVpbmcgdXNlZCAqLwotICAgIHByaXZhdGUgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIAotICAgIC8qKiBUaGUgcHJlZGljYXRlIGJlaW5nIHVzZWQgKi8KLSAgICBwcml2YXRlIFByZWRpY2F0ZSBwcmVkaWNhdGU7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIHZhbHVlIG9mIHRoZSBuZXh0IChtYXRjaGluZykgb2JqZWN0LCB3aGVuIAotICAgICAqIHtAbGluayAjbmV4dE9iamVjdFNldH0gaXMgdHJ1ZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgbmV4dE9iamVjdDsKLQotICAgIC8qKiAKLSAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUge0BsaW5rICNuZXh0T2JqZWN0fSBoYXMgYmVlbiBzZXQKLSAgICAgKiAocG9zc2libHkgdG8gPGNvZGU+bnVsbDwvY29kZT4pLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmV4dE9iamVjdFNldCA9IGZhbHNlOyAgIAotCi0gICAgLyoqIAotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXMgKG1hdGNoaW5nKSBvYmplY3QsIHdoZW4gCi0gICAgICoge0BsaW5rICNwcmV2aW91c09iamVjdFNldH0gaXMgdHJ1ZS4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJldmlvdXNPYmplY3Q7Ci0KLSAgICAvKiogCi0gICAgICogV2hldGhlciBvciBub3QgdGhlIHtAbGluayAjcHJldmlvdXNPYmplY3R9IGhhcyBiZWVuIHNldAotICAgICAqIChwb3NzaWJseSB0byA8Y29kZT5udWxsPC9jb2RlPikuIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c09iamVjdFNldCA9IGZhbHNlOyAgIAotCi0gICAgLyoqIAotICAgICAqIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHtAbGluayAjbmV4dH0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEluZGV4ID0gMDsKLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GaWx0ZXJMaXN0SXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCBub3QgZnVuY3Rpb24KLSAgICAgKiB1bnRpbCB7QGxpbmsgI3NldExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IpIHNldExpc3RJdGVyYXRvcn0KLSAgICAgKiBhbmQge0BsaW5rICNzZXRQcmVkaWNhdGUoUHJlZGljYXRlKSBzZXRQcmVkaWNhdGV9IGFyZSBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWx0ZXJMaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5GaWx0ZXJMaXN0SXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCBub3QgCi0gICAgICogZnVuY3Rpb24gdW50aWwge0BsaW5rICNzZXRQcmVkaWNhdGUoUHJlZGljYXRlKSBzZXRQcmVkaWNhdGV9IGlzIGludm9rZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsdGVyTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvciBpdGVyYXRvciApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RmlsdGVyTGlzdEl0ZXJhdG9yPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGl0ZXJhdG9yIHRvIHVzZQotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIEZpbHRlckxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgaXRlcmF0b3IsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkZpbHRlckxpc3RJdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIG5vdCBmdW5jdGlvbgotICAgICAqIHVudGlsIHtAbGluayAjc2V0TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcikgc2V0TGlzdEl0ZXJhdG9yfSBpcyBpbnZva2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIEZpbHRlckxpc3RJdGVyYXRvcihQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogTm90IHN1cHBvcnRlZC4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGaWx0ZXJMaXN0SXRlcmF0b3IuYWRkKE9iamVjdCkgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICBpZihuZXh0T2JqZWN0U2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzZXROZXh0T2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgaWYocHJldmlvdXNPYmplY3RTZXQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHNldFByZXZpb3VzT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmKCFuZXh0T2JqZWN0U2V0KSB7Ci0gICAgICAgICAgICBpZighc2V0TmV4dE9iamVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXh0SW5kZXgrKzsKLSAgICAgICAgT2JqZWN0IHRlbXAgPSBuZXh0T2JqZWN0OwotICAgICAgICBjbGVhck5leHRPYmplY3QoKTsKLSAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBuZXh0SW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgaWYoIXByZXZpb3VzT2JqZWN0U2V0KSB7Ci0gICAgICAgICAgICBpZighc2V0UHJldmlvdXNPYmplY3QoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmV4dEluZGV4LS07Ci0gICAgICAgIE9iamVjdCB0ZW1wID0gcHJldmlvdXNPYmplY3Q7Ci0gICAgICAgIGNsZWFyUHJldmlvdXNPYmplY3QoKTsKLSAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gKG5leHRJbmRleC0xKTsKLSAgICB9Ci0KLSAgICAvKiogTm90IHN1cHBvcnRlZC4gKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRmlsdGVyTGlzdEl0ZXJhdG9yLnJlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotCi0gICAgLyoqIE5vdCBzdXBwb3J0ZWQuICovCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRmlsdGVyTGlzdEl0ZXJhdG9yLnNldChPYmplY3QpIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiAKLSAgICAgKiBHZXRzIHRoZSBpdGVyYXRvciB0aGlzIGl0ZXJhdG9yIGlzIHVzaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgZ2V0TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGl0ZXJhdG9yIGZvciB0aGlzIGl0ZXJhdG9yIHRvIHVzZS4KLSAgICAgKiBJZiBpdGVyYXRpb24gaGFzIHN0YXJ0ZWQsIHRoaXMgZWZmZWN0aXZlbHkgcmVzZXRzIHRoZSBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIAotICAgICAqIEdldHMgdGhlIHByZWRpY2F0ZSB0aGlzIGl0ZXJhdG9yIGlzIHVzaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2V0cyB0aGUgcHJlZGljYXRlIHRoaXMgdGhlIGl0ZXJhdG9yIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZGljYXRlKFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgdm9pZCBjbGVhck5leHRPYmplY3QoKSB7Ci0gICAgICAgIG5leHRPYmplY3QgPSBudWxsOwotICAgICAgICBuZXh0T2JqZWN0U2V0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE5leHRPYmplY3QoKSB7Ci0gICAgICAgIC8vIGlmIHByZXZpb3VzT2JqZWN0U2V0LAotICAgICAgICAvLyB0aGVuIHdlJ3ZlIHdhbGtlZCBiYWNrIG9uZSBzdGVwIGluIHRoZSAKLSAgICAgICAgLy8gdW5kZXJseWluZyBsaXN0IChkdWUgdG8gYSBoYXNQcmV2aW91cygpIGNhbGwpCi0gICAgICAgIC8vIHNvIHNraXAgYWhlYWQgb25lIG1hdGNoaW5nIG9iamVjdAotICAgICAgICBpZihwcmV2aW91c09iamVjdFNldCkgewotICAgICAgICAgICAgY2xlYXJQcmV2aW91c09iamVjdCgpOwotICAgICAgICAgICAgaWYoIXNldE5leHRPYmplY3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJOZXh0T2JqZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZihwcmVkaWNhdGUuZXZhbHVhdGUob2JqZWN0KSkgewotICAgICAgICAgICAgICAgIG5leHRPYmplY3QgPSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgbmV4dE9iamVjdFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhclByZXZpb3VzT2JqZWN0KCkgewotICAgICAgICBwcmV2aW91c09iamVjdCA9IG51bGw7Ci0gICAgICAgIHByZXZpb3VzT2JqZWN0U2V0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFByZXZpb3VzT2JqZWN0KCkgewotICAgICAgICAvLyBpZiBuZXh0T2JqZWN0U2V0LAotICAgICAgICAvLyB0aGVuIHdlJ3ZlIHdhbGtlZCBiYWNrIG9uZSBzdGVwIGluIHRoZSAKLSAgICAgICAgLy8gdW5kZXJseWluZyBsaXN0IChkdWUgdG8gYSBoYXNOZXh0KCkgY2FsbCkKLSAgICAgICAgLy8gc28gc2tpcCBhaGVhZCBvbmUgbWF0Y2hpbmcgb2JqZWN0Ci0gICAgICAgIGlmKG5leHRPYmplY3RTZXQpIHsKLSAgICAgICAgICAgIGNsZWFyTmV4dE9iamVjdCgpOwotICAgICAgICAgICAgaWYoIXNldFByZXZpb3VzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5wcmV2aW91cygpOwotICAgICAgICAgICAgaWYocHJlZGljYXRlLmV2YWx1YXRlKG9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c09iamVjdCA9IG9iamVjdDsKLSAgICAgICAgICAgICAgICBwcmV2aW91c09iamVjdFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9JdGVyYXRvckNoYWluLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjk4MTJjNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVW5tb2RpZmlhYmxlTGlzdDsKLQotLyoqCi0gKiBBbiBJdGVyYXRvckNoYWluIGlzIGFuIEl0ZXJhdG9yIHRoYXQgd3JhcHMgYSBudW1iZXIgb2YgSXRlcmF0b3JzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1ha2VzIG11bHRpcGxlIGl0ZXJhdG9ycyBsb29rIGxpa2Ugb25lIHRvIHRoZSBjYWxsZXIKLSAqIFdoZW4gYW55IG1ldGhvZCBmcm9tIHRoZSBJdGVyYXRvciBpbnRlcmZhY2UgaXMgY2FsbGVkLCB0aGUgSXRlcmF0b3JDaGFpbgotICogd2lsbCBkZWxlZ2F0ZSB0byBhIHNpbmdsZSB1bmRlcmx5aW5nIEl0ZXJhdG9yLiBUaGUgSXRlcmF0b3JDaGFpbiB3aWxsCi0gKiBpbnZva2UgdGhlIEl0ZXJhdG9ycyBpbiBzZXF1ZW5jZSB1bnRpbCBhbGwgSXRlcmF0b3JzIGFyZSBleGhhdXN0ZWQuCi0gKiA8cD4KLSAqIFVuZGVyIG1hbnkgY2lyY3Vtc3RhbmNlcywgbGlua2luZyBJdGVyYXRvcnMgdG9nZXRoZXIgaW4gdGhpcyBtYW5uZXIgaXMKLSAqIG1vcmUgZWZmaWNpZW50IChhbmQgY29udmVuaWVudCkgdGhhbiByZWFkaW5nIG91dCB0aGUgY29udGVudHMgb2YgZWFjaAotICogSXRlcmF0b3IgaW50byBhIExpc3QgYW5kIGNyZWF0aW5nIGEgbmV3IEl0ZXJhdG9yLgotICogPHA+Ci0gKiBDYWxsaW5nIGEgbWV0aG9kIHRoYXQgYWRkcyBuZXcgSXRlcmF0b3I8aT5hZnRlciBhIG1ldGhvZCBpbiB0aGUgSXRlcmF0b3IKLSAqIGludGVyZmFjZSBoYXMgYmVlbiBjYWxsZWQ8L2k+IHdpbGwgcmVzdWx0IGluIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotICogU3ViY2xhc3NlcyBzaG91bGQgPGk+dGFrZSBjYXJlPC9pPiB0byBub3QgYWx0ZXIgdGhlIHVuZGVybHlpbmcgTGlzdCBvZiBJdGVyYXRvcnMuCi0gKiA8cD4KLSAqIE5PVEU6IEFzIGZyb20gdmVyc2lvbiAzLjAsIHRoZSBJdGVyYXRvckNoYWluIG1heSBjb250YWluIG5vCi0gKiBpdGVyYXRvcnMuIEluIHRoaXMgY2FzZSB0aGUgY2xhc3Mgd2lsbCBmdW5jdGlvbiBhcyBhbiBlbXB0eSBpdGVyYXRvci4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICoKLSAqIEBhdXRob3IgTW9yZ2FuIERlbGFncmFuZ2UKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckNoYWluIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0JLyoqIFRoZSBjaGFpbiBvZiBpdGVyYXRvcnMgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdCBpdGVyYXRvckNoYWluID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaXRlcmF0b3IgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGN1cnJlbnRJdGVyYXRvckluZGV4ID0gMDsKLSAgICAvKiogVGhlIGN1cnJlbnQgaXRlcmF0b3IgKi8KLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgY3VycmVudEl0ZXJhdG9yID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiBUaGUgImxhc3QgdXNlZCIgSXRlcmF0b3IgaXMgdGhlIEl0ZXJhdG9yIHVwb24gd2hpY2gKLSAgICAgKiBuZXh0KCkgb3IgaGFzTmV4dCgpIHdhcyBtb3N0IHJlY2VudGx5IGNhbGxlZAotICAgICAqIHVzZWQgZm9yIHRoZSByZW1vdmUoKSBvcGVyYXRpb24gb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBsYXN0VXNlZEl0ZXJhdG9yID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiBDb21wYXJhdG9yQ2hhaW4gaXMgImxvY2tlZCIgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUKLSAgICAgKiBjb21wYXJlKE9iamVjdCxPYmplY3QpIGlzIGNhbGxlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTG9ja2VkID0gZmFsc2U7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIEl0ZXJhdG9yQ2hhaW4gd2l0aCBubyBJdGVyYXRvcnMuCi0gICAgICogPHA+Ci0gICAgICogWW91IHdpbGwgbm9ybWFsbHkgdXNlIHtAbGluayAjYWRkSXRlcmF0b3IoSXRlcmF0b3IpfSB0byBhZGQKLSAgICAgKiBzb21lIGl0ZXJhdG9ycyBhZnRlciB1c2luZyB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvckNoYWluKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBJdGVyYXRvckNoYWluIHdpdGggYSBzaW5nbGUgSXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgZmlyc3QgSXRlcmF0b3IgaW4gdGhlIEl0ZXJhdG9yQ2hhaW4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yQ2hhaW4oSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgYWRkSXRlcmF0b3IoaXRlcmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SXRlcmF0b3JDaGFpbjwvY29kZT4gb3ZlciB0aGUgdHdvCi0gICAgICogZ2l2ZW4gaXRlcmF0b3JzLgotICAgICAqCi0gICAgICogQHBhcmFtIGEgIHRoZSBmaXJzdCBjaGlsZCBpdGVyYXRvcgotICAgICAqIEBwYXJhbSBiICB0aGUgc2Vjb25kIGNoaWxkIGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvckNoYWluKEl0ZXJhdG9yIGEsIEl0ZXJhdG9yIGIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgYWRkSXRlcmF0b3IoYSk7Ci0gICAgICAgIGFkZEl0ZXJhdG9yKGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SXRlcmF0b3JDaGFpbjwvY29kZT4gb3ZlciB0aGUgYXJyYXkKLSAgICAgKiBvZiBpdGVyYXRvcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3JzICB0aGUgYXJyYXkgb2YgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgYXJyYXkgaXMgb3IgY29udGFpbnMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvckNoYWluKEl0ZXJhdG9yW10gaXRlcmF0b3JzKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRJdGVyYXRvcihpdGVyYXRvcnNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5JdGVyYXRvckNoYWluPC9jb2RlPiBvdmVyIHRoZSBjb2xsZWN0aW9uCi0gICAgICogb2YgaXRlcmF0b3JzLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9ycyAgdGhlIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBpdGVyYXRvcnMgY29sbGVjdGlvbiBpcyBvciBjb250YWlucyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgaXRlcmF0b3JzIGNvbGxlY3Rpb24gZG9lc24ndCBjb250YWluIGFuIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yQ2hhaW4oQ29sbGVjdGlvbiBpdGVyYXRvcnMpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGl0ZXJhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVtID0gKEl0ZXJhdG9yKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBhZGRJdGVyYXRvcihpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQWRkIGFuIEl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgSXRlcmF0b3IgdG8gYWRkCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgSSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgaXRlcmF0aW5nCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIGNoZWNrTG9ja2VkKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpdGVyYXRvckNoYWluLmFkZChpdGVyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBJdGVyYXRvciBhdCB0aGUgZ2l2ZW4gaW5kZXgKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCAgICAgIGluZGV4IG9mIHRoZSBJdGVyYXRvciB0byByZXBsYWNlCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICAgSXRlcmF0b3IgdG8gcGxhY2UgYXQgdGhlIGdpdmVuIGluZGV4Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4ICZsdDsgMCBvciBpbmRleCAmZ3Q7IHNpemUoKQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIEkndmUgYWxyZWFkeSBzdGFydGVkIGl0ZXJhdGluZwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVyYXRvcihpbnQgaW5kZXgsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTG9ja2VkKCk7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpdGVyYXRvckNoYWluLnNldChpbmRleCwgaXRlcmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBJdGVyYXRvcnMgKHVubW9kaWZpYWJsZSkKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZXJhdG9ycyBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEl0ZXJhdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUxpc3QuZGVjb3JhdGUoaXRlcmF0b3JDaGFpbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTnVtYmVyIG9mIEl0ZXJhdG9ycyBpbiB0aGUgY3VycmVudCBJdGVyYXRvckNoYWluLgotICAgICAqCi0gICAgICogQHJldHVybiBJdGVyYXRvciBjb3VudAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yQ2hhaW4uc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiBtb2RpZmljYXRpb25zIGNhbiBzdGlsbCBiZSBtYWRlIHRvIHRoZSBJdGVyYXRvckNoYWluLgotICAgICAqIEl0ZXJhdG9yQ2hhaW5zIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZXkgaGF2ZSBleGVjdXRlZCBhIG1ldGhvZAotICAgICAqIGZyb20gdGhlIEl0ZXJhdG9yIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBJdGVyYXRvckNoYWluIGNhbm5vdCBiZSBtb2RpZmllZCwgZmFsc2UgaWYgaXQgY2FuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0xvY2tlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgaXRlcmF0b3IgY2hhaW4gaXMgbm93IGxvY2tlZCBhbmQgaW4gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0xvY2tlZCgpIHsKLSAgICAgICAgaWYgKGlzTG9ja2VkID09IHRydWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSXRlcmF0b3JDaGFpbiBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgZmlyc3QgdXNlIG9mIGEgbWV0aG9kIGZyb20gdGhlIEl0ZXJhdG9yIGludGVyZmFjZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9jayB0aGUgY2hhaW4gc28gbm8gbW9yZSBpdGVyYXRvcnMgY2FuIGJlIGFkZGVkLgotICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSBhbGwgSXRlcmF0b3IgaW50ZXJmYWNlIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvY2tDaGFpbigpIHsKLSAgICAgICAgaWYgKGlzTG9ja2VkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpc0xvY2tlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGZpZWxkIHRvIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IEl0ZXJhdG9yCi0gICAgICogaXMgbm90IGV4aGF1c3RlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1cnJlbnRJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXRlcmF0b3JDaGFpbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50SXRlcmF0b3IgPSAoSXRlcmF0b3IpIGl0ZXJhdG9yQ2hhaW4uZ2V0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2V0IGxhc3QgdXNlZCBpdGVyYXRvciBoZXJlLCBpbiBjYXNlIHRoZSB1c2VyIGNhbGxzIHJlbW92ZQotICAgICAgICAgICAgLy8gYmVmb3JlIGNhbGxpbmcgaGFzTmV4dCgpIG9yIG5leHQoKSAoYWx0aG91Z2ggdGhleSBzaG91bGRuJ3QpCi0gICAgICAgICAgICBsYXN0VXNlZEl0ZXJhdG9yID0gY3VycmVudEl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkgPT0gZmFsc2UgJiYgY3VycmVudEl0ZXJhdG9ySW5kZXggPCBpdGVyYXRvckNoYWluLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIGN1cnJlbnRJdGVyYXRvckluZGV4Kys7Ci0gICAgICAgICAgICBjdXJyZW50SXRlcmF0b3IgPSAoSXRlcmF0b3IpIGl0ZXJhdG9yQ2hhaW4uZ2V0KGN1cnJlbnRJdGVyYXRvckluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgSXRlcmF0b3IgaW4gdGhlIEl0ZXJhdG9yQ2hhaW4gaGFzIGEgcmVtYWluaW5nIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudHMgcmVtYWluCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgbG9ja0NoYWluKCk7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRJdGVyYXRvcigpOwotICAgICAgICBsYXN0VXNlZEl0ZXJhdG9yID0gY3VycmVudEl0ZXJhdG9yOwotCi0gICAgICAgIHJldHVybiBjdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgT2JqZWN0IG9mIHRoZSBjdXJyZW50IEl0ZXJhdG9yCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE9iamVjdCBmcm9tIHRoZSBjdXJyZW50IEl0ZXJhdG9yCi0gICAgICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBhbGwgdGhlIEl0ZXJhdG9ycyBhcmUgZXhoYXVzdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBsb2NrQ2hhaW4oKTsKLSAgICAgICAgdXBkYXRlQ3VycmVudEl0ZXJhdG9yKCk7Ci0gICAgICAgIGxhc3RVc2VkSXRlcmF0b3IgPSBjdXJyZW50SXRlcmF0b3I7Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gdGhlIGxhc3QgZWxlbWVudAotICAgICAqIHJldHVybmVkIGJ5IHRoZSBJdGVyYXRvci4gIEFzIHdpdGggbmV4dCgpIGFuZCBoYXNOZXh0KCksCi0gICAgICogdGhpcyBtZXRob2QgY2FsbHMgcmVtb3ZlKCkgb24gdGhlIHVuZGVybHlpbmcgSXRlcmF0b3IuCi0gICAgICogVGhlcmVmb3JlLCB0aGlzIG1ldGhvZCBtYXkgdGhyb3cgYW4KLSAgICAgKiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZwotICAgICAqIEl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICBpZiB0aGUgcmVtb3ZlIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgSXRlcmF0b3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgaWYgdGhlIG5leHQgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkLCBvciB0aGUgcmVtb3ZlIG1ldGhvZCBoYXMKLSAgICAgKiAgIGFscmVhZHkgYmVlbiBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byB0aGUgbmV4dCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBsb2NrQ2hhaW4oKTsKLSAgICAgICAgaWYgKGN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBsYXN0VXNlZEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGViYTAzMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqIAotICogQWRhcHRlciB0byBtYWtlIGFuIHtAbGluayBJdGVyYXRvciBJdGVyYXRvcn0gaW5zdGFuY2UgYXBwZWFyIHRvIGJlCi0gKiBhbiB7QGxpbmsgRW51bWVyYXRpb24gRW51bWVyYXRpb259IGluc3RhbmNlLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDEuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQuICovCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHRoYXQgd2lsbCBub3QgCi0gICAgICogZnVuY3Rpb24gdW50aWwge0BsaW5rICNzZXRJdGVyYXRvcihJdGVyYXRvcikgc2V0SXRlcmF0b3J9IGlzICAKLSAgICAgKiBpbnZva2VkLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SXRlcmF0b3JFbnVtZXJhdGlvbjwvY29kZT4gdGhhdCB3aWxsIHVzZQotICAgICAqIHRoZSBnaXZlbiBpdGVyYXRvci4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb24oIEl0ZXJhdG9yIGl0ZXJhdG9yICkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGhhcyBtb3JlIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBpdGVyYXRvciBoYXMgbW9yZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCi0gICAgICogIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGhhcyBubwotICAgICAqICAgIG1vcmUgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yLgotICAgICAqIAotICAgICAqICBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGl0ZXJhdG9yICB0aGUgbmV3IHVuZGVybHlpbmcgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVyYXRvciggSXRlcmF0b3IgaXRlcmF0b3IgKSB7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xpc3RJdGVyYXRvcldyYXBwZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjI2ZDJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBDb252ZXJ0cyBhbiBpdGVyYXRvciBpbnRvIGEgbGlzdCBpdGVyYXRvciBieSBjYWNoaW5nIHRoZSByZXR1cm5lZCBlbnRyaWVzLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UgaGFzIGFkZGl0aW9uYWwgdXNlZnVsIG1ldGhvZHMKLSAqIGZvciBuYXZpZ2F0aW9uIC0gPGNvZGU+cHJldmlvdXMoKTwvY29kZT4gYW5kIHRoZSBpbmRleCBtZXRob2RzLgotICogVGhpcyBjbGFzcyBhbGxvd3MgYSByZWd1bGFyIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiB0byBiZWhhdmUgYXMgYQotICogPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPi4gSXQgYWNoaWV2ZXMgdGhpcyBieSBidWlsZGluZyBhIGxpc3QgaW50ZXJuYWxseQotICogb2YgYXMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgaXMgdHJhdmVyc2VkLgotICogPHA+Ci0gKiBUaGUgb3B0aW9uYWwgb3BlcmF0aW9ucyBvZiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IGFyZSBub3Qgc3VwcG9ydGVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgUmVzZXR0YWJsZUxpc3RJdGVyYXRvciBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKgotICogQGF1dGhvciBNb3JnYW4gRGVsYWdyYW5nZQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIExpc3RJdGVyYXRvcldyYXBwZXIgaW1wbGVtZW50cyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKiBNZXNzYWdlIHVzZWQgd2hlbiByZW1vdmUsIHNldCBvciBhZGQgYXJlIGNhbGxlZC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfT1BFUkFUSU9OX01FU1NBR0UgPQotICAgICAgICAiTGlzdEl0ZXJhdG9yV3JhcHBlciBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbmFsIG9wZXJhdGlvbnMgb2YgTGlzdEl0ZXJhdG9yLiI7Ci0KLSAgICAvKiogVGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgYmVpbmcgZGVjb3JhdGVkLiAqLwotICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgLyoqIFRoZSBsaXN0IGJlaW5nIHVzZWQgdG8gY2FjaGUgdGhlIGl0ZXJhdG9yLiAqLwotICAgIHByaXZhdGUgZmluYWwgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqIFRoZSBjdXJyZW50IGluZGV4IG9mIHRoaXMgaXRlcmF0b3IuICovCi0gICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4ID0gMDsKLSAgICAvKiogVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIHdyYXBwZWQgaXRlcmF0b3IuICovCi0gICAgcHJpdmF0ZSBpbnQgd3JhcHBlZEl0ZXJhdG9ySW5kZXggPSAwOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkxpc3RJdGVyYXRvcldyYXBwZXI8L2NvZGU+IHRoYXQgd2lsbCB3cmFwCi0gICAgICogdGhlIGdpdmVuIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gd3JhcAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yV3JhcHBlcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJdGVyYXRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8vIExpc3RJdGVyYXRvciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUaHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgdG8gYWRkLCBpZ25vcmVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFVOU1VQUE9SVEVEX09QRVJBVElPTl9NRVNTQUdFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSB3cmFwcGVkSXRlcmF0b3JJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHByZXZpb3VzIGVsZW1lbnRzIGluIHRoZSBpdGVyYXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcHJldmlvdXMgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgd3JhcHBlZEl0ZXJhdG9ySW5kZXgpIHsKLSAgICAgICAgICAgICsrY3VycmVudEluZGV4OwotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KGN1cnJlbnRJbmRleCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHJldHZhbCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgbGlzdC5hZGQocmV0dmFsKTsKLSAgICAgICAgKytjdXJyZW50SW5kZXg7Ci0gICAgICAgICsrd3JhcHBlZEl0ZXJhdG9ySW5kZXg7Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpbiB0aGUgaW5kZXggb2YgdGhlIG5leHQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgcHJldmlvdXMgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gIGlmIHRoZXJlIGFyZSBubyBwcmV2aW91cyBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAtLWN1cnJlbnRJbmRleDsKLSAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KGN1cnJlbnRJbmRleCk7ICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBlbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gY3VycmVudEluZGV4IC0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFVOU1VQUE9SVEVEX09QRVJBVElPTl9NRVNTQUdFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgdG8gc2V0LCBpZ25vcmVkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFVOU1VQUE9SVEVEX09QRVJBVElPTl9NRVNTQUdFKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNldHRhYmxlSXRlcmF0b3IgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoaXMgaXRlcmF0b3IgYmFjayB0byB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGl0ZXJhdG9yCi0gICAgICogd2FzIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpICB7Ci0gICAgICAgIGN1cnJlbnRJbmRleCA9IDA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Mb29waW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFkYmYxZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiBJdGVyYXRvciB0aGF0IHJlc3RhcnRzIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3Igd2lsbCBsb29wIGNvbnRpbnVvdXNseSBhcm91bmQgdGhlIHByb3ZpZGVkIGVsZW1lbnRzLCB1bmxlc3MgCi0gKiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gdG8gYmVnaW4gd2l0aCwgb3IgYWxsIHRoZSBlbGVtZW50cwotICogaGF2ZSBiZWVuIHtAbGluayAjcmVtb3ZlIHJlbW92ZWR9LgotICogPHA+Ci0gKiBDb25jdXJyZW50IG1vZGlmaWNhdGlvbnMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQsIGFuZCBmb3IgbW9zdCBjb2xsZWN0aW9uCi0gKiBpbXBsZW1lbnRhdGlvbnMgd2lsbCB0aHJvdyBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uIAotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86am9uY3Jsc25AdXNlcnMuc2YubmV0Ij5Kb25hdGhhbiBDYXJsc29uPC9hPgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIExvb3BpbmdJdGVyYXRvciBpbXBsZW1lbnRzIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0gICAgCi0gICAgLyoqIFRoZSBjb2xsZWN0aW9uIHRvIGJhc2UgdGhlIGl0ZXJhdG9yIG9uICovCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0gICAgLyoqIFRoZSBjdXJyZW50IGl0ZXJhdG9yICovCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgYSBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byByZXNldCBhbiBJdGVyYXRvciBpbnN0YW5jZSB3aXRob3V0IHJlY3JlYXRpbmcgaXQgZnJvbQotICAgICAqIHRoZSBvcmlnaW5hbCBzb3VyY2UsIHNvIHRoZSBDb2xsZWN0aW9uIG11c3QgYmUgcGFzc2VkIGluLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byB3cmFwCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIExvb3BpbmdJdGVyYXRvcihDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgY29sbGVjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY29sbGVjdGlvbiA9IGNvbGw7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEhhcyB0aGUgaXRlcmF0b3IgYW55IG1vcmUgZWxlbWVudHMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBmYWxzZSBvbmx5IGlmIHRoZSBjb2xsZWN0aW9uIG9yaWdpbmFsbHkgaGFkIHplcm8gZWxlbWVudHMsIG9yCi0gICAgICogYWxsIHRoZSBlbGVtZW50cyBoYXZlIGJlZW4ge0BsaW5rICNyZW1vdmUgcmVtb3ZlZH0uCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiAoY29sbGVjdGlvbi5zaXplKCkgPiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhdCB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLCByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cwotICAgICAqICAgICAgICAgYXQgYWxsLiAgVXNlIHtAbGluayAjaGFzTmV4dH0gdG8gYXZvaWQgdGhpcyBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIGZvciB0aGlzIGl0ZXJhdG9yIHRvIGxvb3Agb24iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSByZXRyaWV2ZWQgaXRlbSBmcm9tIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmZWF0dXJlIGlzIG9ubHkgc3VwcG9ydGVkIGlmIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24ncyAKLSAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbiNpdGVyYXRvciBpdGVyYXRvcn0gbWV0aG9kIHJldHVybnMgYW4gaW1wbGVtZW50YXRpb24gCi0gICAgICogdGhhdCBzdXBwb3J0cyBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgYXQgbGVhc3Qgb25lIHtAbGluayAjbmV4dH0gbWV0aG9kIGNhbGwuCi0gICAgICogQWZ0ZXIgYSByZW1vdmFsLCB0aGUgcmVtb3ZlIG1ldGhvZCBtYXkgbm90IGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCBhbm90aGVyCi0gICAgICogbmV4dCBoYXMgYmVlbiBwZXJmb3JtZWQuIElmIHRoZSB7QGxpbmsgI3Jlc2V0fSBpcyBjYWxsZWQsIHRoZW4gcmVtb3ZlIG1heQotICAgICAqIG5vdCBiZSBjYWxsZWQgdW50aWwge0BsaW5rICNuZXh0fSBpcyBjYWxsZWQgYWdhaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGl0ZXJhdG9yIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uIHVuZGVybHlpbmcgdGhlIGl0ZXJhdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBzaXplCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL0xvb3BpbmdMaXN0SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTG9vcGluZ0xpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjk4YTkyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvTG9vcGluZ0xpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIExpc3RJdGVyYXRvciB0aGF0IHJlc3RhcnRzIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9yIHdoZW4gaXQKLSAqIHJlYWNoZXMgdGhlIGJlZ2lubmluZy4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9yIHdpbGwgbG9vcCBjb250aW51b3VzbHkgYXJvdW5kIHRoZSBwcm92aWRlZCBsaXN0LAotICogdW5sZXNzIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiB0byBiZWdpbiB3aXRoLCBvcgotICogYWxsIG9mIHRoZSBlbGVtZW50cyBoYXZlIGJlZW4ge0BsaW5rICNyZW1vdmUgcmVtb3ZlZH0uCi0gKiA8cD4KLSAqIENvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCwgYW5kIGZvciBtb3N0Ci0gKiBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9ucyB3aWxsIHRocm93IGEKLSAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqCi0gKiBAYXV0aG9yIEVyaWMgQ3JhbXB0b24gPGNjZXNjQGVvbm9taW5lLmNvbT4KLSAqLwotcHVibGljIGNsYXNzIExvb3BpbmdMaXN0SXRlcmF0b3IgaW1wbGVtZW50cyBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKiBUaGUgbGlzdCB0byBiYXNlIHRoZSBpdGVyYXRvciBvbiAqLwotICAgIHByaXZhdGUgTGlzdCBsaXN0OwotICAgIC8qKiBUaGUgY3VycmVudCBsaXN0IGl0ZXJhdG9yICovCi0gICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIGEgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGVyZSBpcyBubyB3YXkgdG8gcmVzZXQgYSBMaXN0SXRlcmF0b3IgaW5zdGFuY2Ugd2l0aG91dAotICAgICAqIHJlY3JlYXRpbmcgaXQgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlLCBzbyB0aGUgTGlzdCBtdXN0IGJlCi0gICAgICogcGFzc2VkIGluIGFuZCBhIHJlZmVyZW5jZSB0byBpdCBoZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gd3JhcAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGxpc3QgaXQgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBMb29waW5nTGlzdEl0ZXJhdG9yKExpc3QgbGlzdCkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBsaXN0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGl0ZXJhdG9yIGhhcyBhbnkgbW9yZSBlbGVtZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgdGhlIGxpc3Qgb3JpZ2luYWxseSBoYWQgemVybyBlbGVtZW50cywgb3IKLSAgICAgKiBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuIHtAbGluayAjcmVtb3ZlIHJlbW92ZWR9LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiAhbGlzdC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogSWYgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBhZnRlciB0aGUgbGFzdCBlbGVtZW50IHJldHVybmVkCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIGZvciB0aGlzIGl0ZXJhdG9yIHRvIGxvb3Agb24iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBhCi0gICAgICogc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjbmV4dH0uCi0gICAgICogPHA+Ci0gICAgICogQXMgd291bGQgYmUgZXhwZWN0ZWQsIGlmIHRoZSBpdGVyYXRvciBpcyBhdCB0aGUgcGh5c2ljYWwgZW5kIG9mCi0gICAgICogdGhlIHVuZGVybHlpbmcgbGlzdCwgMCBpcyByZXR1cm5lZCwgc2lnbmlmeWluZyB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICogdGhlIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGlmIG5leHQoKSB3ZXJlIGNhbGxlZAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIGZvciB0aGlzIGl0ZXJhdG9yIHRvIGxvb3Agb24iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0SW5kZXgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGl0ZXJhdG9yIGhhcyBhbnkgbW9yZSBwcmV2aW91cyBlbGVtZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgdGhlIGxpc3Qgb3JpZ2luYWxseSBoYWQgemVybyBlbGVtZW50cywgb3IKLSAgICAgKiBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuIHtAbGluayAjcmVtb3ZlIHJlbW92ZWR9LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gIWxpc3QuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIG9iamVjdCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LCByZXR1cm4gdGhlIGxhc3QgZWxlbWVudC4gTm90ZQotICAgICAqIHRoYXQgaW4gdGhpcyBjYXNlLCB0cmF2ZXJzYWwgdG8gZmluZCB0aGF0IGVsZW1lbnQgdGFrZXMgbGluZWFyIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYmVmb3JlIHRoZSBsYXN0IGVsZW1lbnQgcmV0dXJuZWQKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIGZvciB0aGlzIGl0ZXJhdG9yIHRvIGxvb3Agb24iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgYQotICAgICAqIHN1YnNlcXVlbnQgY2FsbCB0byB7QGxpbmsgI3ByZXZpb3VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBBcyB3b3VsZCBiZSBleHBlY3RlZCwgaWYgYXQgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZSBwaHlzaWNhbAotICAgICAqIGJlZ2lubmluZyBvZiB0aGUgdW5kZXJseWluZyBsaXN0LCB0aGUgbGlzdCdzIHNpemUgbWludXMgb25lIGlzCi0gICAgICogcmV0dXJuZWQsIHNpZ25pZnlpbmcgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgaWYgcHJldmlvdXMoKSB3ZXJlIGNhbGxlZAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgIGlmIChsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBlbGVtZW50cyBmb3IgdGhpcyBpdGVyYXRvciB0byBsb29wIG9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LnNpemUoKSAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSByZXRyaWV2ZWQgaXRlbSBmcm9tIHRoZSB1bmRlcmx5aW5nIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmZWF0dXJlIGlzIG9ubHkgc3VwcG9ydGVkIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QncwotICAgICAqIHtAbGluayBMaXN0I2l0ZXJhdG9yIGl0ZXJhdG9yfSBtZXRob2QgcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbgotICAgICAqIHRoYXQgc3VwcG9ydHMgaXQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGF0IGxlYXN0IG9uZSB7QGxpbmsgI25leHR9Ci0gICAgICogb3Ige0BsaW5rICNwcmV2aW91c30gbWV0aG9kIGNhbGwuIEFmdGVyIGEgcmVtb3ZhbCwgdGhlIHJlbW92ZQotICAgICAqIG1ldGhvZCBtYXkgbm90IGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCBhbm90aGVyIHtAbGluayAjbmV4dH0gb3IKLSAgICAgKiB7QGxpbmsgI3ByZXZpb3VzfSBoYXMgYmVlbiBwZXJmb3JtZWQuIElmIHRoZSB7QGxpbmsgI3Jlc2V0fSBpcwotICAgICAqIGNhbGxlZCwgdGhlbiByZW1vdmUgbWF5IG5vdCBiZSBjYWxsZWQgdW50aWwge0BsaW5rICNuZXh0fSBvcgotICAgICAqIHtAbGluayAjcHJldmlvdXN9IGlzIGNhbGxlZCBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJlbW92ZSBtZXRob2QgaXMKLSAgICAgKiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZwotICAgICAqIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIHVuZGVybHlpbmcgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZWxlbWVudCBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIG5leHQgZWxlbWVudCB0aGF0IHdvdWxkIGJlCi0gICAgICogcmV0dXJuZWQgYnkge0BsaW5rICNuZXh0fSwgaWYgYW55LCBhbmQgYWZ0ZXIgdGhlIG5leHQgZWxlbWVudAotICAgICAqIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkge0BsaW5rICNwcmV2aW91c30sIGlmIGFueS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZlYXR1cmUgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIHVuZGVybHlpbmcgbGlzdCdzCi0gICAgICoge0BsaW5rIExpc3QjbGlzdEl0ZXJhdG9yfSBtZXRob2QgcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbgotICAgICAqIHRoYXQgc3VwcG9ydHMgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgZWxlbWVudCB0byBpbnNlcnQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBhZGQgbWV0aG9kIGlzIG5vdAotICAgICAqICBzdXBwb3J0ZWQgYnkgdGhlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICBpdGVyYXRvci5hZGQob2JqKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgbGFzdCBlbGVtZW50IHRoYXQgd2FzIHJldHVybmVkIGJ5IHtAbGluayAjbmV4dH0gb3IKLSAgICAgKiB7QGxpbmsgI3ByZXZpb3VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZlYXR1cmUgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIHVuZGVybHlpbmcgbGlzdCdzCi0gICAgICoge0BsaW5rIExpc3QjbGlzdEl0ZXJhdG9yfSBtZXRob2QgcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbgotICAgICAqIHRoYXQgc3VwcG9ydHMgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgZWxlbWVudCB3aXRoIHdoaWNoIHRvIHJlcGxhY2UgdGhlIGxhc3QgZWxlbWVudCByZXR1cm5lZAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHNldCBtZXRob2QgaXMgbm90Ci0gICAgICogIHN1cHBvcnRlZCBieSB0aGUgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGl0ZXJhdG9yLnNldChvYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgaXRlcmF0b3IgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGl0ZXJhdG9yID0gbGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBsaXN0IHVuZGVybHlpbmcgdGhlIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBsaXN0IHNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0LnNpemUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0QXJyYXlJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY4MjQ4YWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9PYmplY3RBcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUl0ZXJhdG9yOwotCi0vKiogCi0gKiBBbiB7QGxpbmsgSXRlcmF0b3J9IG92ZXIgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHtAbGluayAjcmVtb3ZlfSwgYXMgdGhlIG9iamVjdCBhcnJheSBjYW5ub3QgYmUKLSAqIHN0cnVjdHVyYWxseSBtb2RpZmllZC4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9yIGltcGxlbWVudHMgYSB7QGxpbmsgI3Jlc2V0fSBtZXRob2QsIGFsbG93aW5nIHRoZSByZXNldCBvZiB0aGUgaXRlcmF0b3IKLSAqIGJhY2sgdG8gdGhlIHN0YXJ0IGlmIHJlcXVpcmVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEBhdXRob3IgTWF1cmljaW8gUy4gTW91cmEKLSAqIEBhdXRob3IgTWljaGFlbCBBLiBTbWl0aAotICogQGF1dGhvciBOZWlsIE8nVG9vbGUKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBoaWwgU3RlaXR6Ci0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RBcnJheUl0ZXJhdG9yCi0gICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0KLSAgICAvKiogVGhlIGFycmF5ICovCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIGFycmF5ID0gbnVsbDsKLSAgICAvKiogVGhlIHN0YXJ0IGluZGV4IHRvIGxvb3AgZnJvbSAqLwotICAgIHByb3RlY3RlZCBpbnQgc3RhcnRJbmRleCA9IDA7Ci0gICAgLyoqIFRoZSBlbmQgaW5kZXggdG8gbG9vcCB0byAqLwotICAgIHByb3RlY3RlZCBpbnQgZW5kSW5kZXggPSAwOwotICAgIC8qKiBUaGUgY3VycmVudCBpdGVyYXRvciBpbmRleCAqLwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXggPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSB3aXRoIDxjb2RlPnNldEFycmF5PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yLCB0aGUgaXRlcmF0b3IgaXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBpdGVyYXRvcgotICAgICAqIHVudGlsIHtAbGluayAjc2V0QXJyYXl9IGlzICBjYWxsZWQgdG8gZXN0YWJsaXNoIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBPYmplY3RBcnJheUl0ZXJhdG9yIHRoYXQgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHZhbHVlcyBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGl0ZXJhdGUgb3ZlcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YXJyYXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdEFycmF5SXRlcmF0b3IoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIE9iamVjdEFycmF5SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBmcm9tIGEgc3BlY2lmaWMgc3RhcnQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc3RhcnQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RBcnJheUl0ZXJhdG9yKE9iamVjdCBhcnJheVtdLCBpbnQgc3RhcnQpIHsKLSAgICAgICAgdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIE9iamVjdEFycmF5SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHZhbHVlcyAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyCi0gICAgICogQHBhcmFtIHN0YXJ0ICB0aGUgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIGF0Ci0gICAgICogQHBhcmFtIGVuZCAgdGhlIGluZGV4IChleGNsdXNpdmUpIHRvIGZpbmlzaCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHN0YXJ0IG9yIGVuZCBpbmRleCBpcyBvdXQgb2YgYm91bmRzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZW5kIGluZGV4IGlzIGJlZm9yZSB0aGUgc3RhcnQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RBcnJheUl0ZXJhdG9yKE9iamVjdCBhcnJheVtdLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiU3RhcnQgaW5kZXggbXVzdCBub3QgYmUgbGVzcyB0aGFuIHplcm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kID4gYXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJFbmQgaW5kZXggbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBhcnJheSBsZW5ndGgiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhcnQgPiBhcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlN0YXJ0IGluZGV4IG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgYXJyYXkgbGVuZ3RoIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbmQgaW5kZXggbXVzdCBub3QgYmUgbGVzcyB0aGFuIHN0YXJ0IGluZGV4Iik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgICAgICB0aGlzLnN0YXJ0SW5kZXggPSBzdGFydDsKLSAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZDsKLSAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0OwotICAgIH0KLQotICAgIC8vIEl0ZXJhdG9yIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIHRvIHJldHVybiBmcm9tIHRoZSBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgZWxlbWVudCB0byByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gKHRoaXMuaW5kZXggPCB0aGlzLmVuZEluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBhcnJheQotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICAgICAqICAgIGhhdmUgYWxyZWFkeSBiZWVuIHJldHVybmVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBpZiAoaGFzTmV4dCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmFycmF5W3RoaXMuaW5kZXgrK107Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmUoKSBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW4gT2JqZWN0QXJyYXlJdGVyYXRvciIpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IHRoYXQgdGhpcyBpdGVyYXRvciBpcyBpdGVyYXRpbmcgb3Zlci4gCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSB0aGlzIGl0ZXJhdG9yIGl0ZXJhdGVzIG92ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogdGhlIG5vLWFyZyBjb25zdHJ1Y3RvciB3YXMgdXNlZCBhbmQge0BsaW5rICNzZXRBcnJheX0gaGFzIG5ldmVyCi0gICAgICogYmVlbiBjYWxsZWQgd2l0aCBhIHZhbGlkIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJyYXkgdGhhdCB0aGUgQXJyYXlJdGVyYXRvciBzaG91bGQgaXRlcmF0ZSBvdmVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLCBvdGhlcndpc2UgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogd2lsbCBvY2N1ci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUge0BsaW5rICNyZXNldH0gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBpdGVyYXRvciBpZiByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgdGhlIGFycmF5IHRoYXQgdGhlIGl0ZXJhdG9yIHNob3VsZCBpdGVyYXRlIG92ZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+YXJyYXk8L2NvZGU+IHdhcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpZiAodGhpcy5hcnJheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgICAgICB0aGlzLnN0YXJ0SW5kZXggPSAwOwotICAgICAgICB0aGlzLmVuZEluZGV4ID0gYXJyYXkubGVuZ3RoOwotICAgICAgICB0aGlzLmluZGV4ID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzdGFydCBpbmRleCB0byBsb29wIGZyb20uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RhcnQgaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0SW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW5kIGluZGV4IHRvIGxvb3AgdG8uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZW5kIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBzdGFydCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuc3RhcnRJbmRleDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGJjMGE3Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL09iamVjdEFycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IG92ZXIgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHtAbGluayAjYWRkfSBvciB7QGxpbmsgI3JlbW92ZX0sIGFzIHRoZSBvYmplY3QgYXJyYXkgCi0gKiBjYW5ub3QgYmUgc3RydWN0dXJhbGx5IG1vZGlmaWVkLiBUaGUge0BsaW5rICNzZXR9IG1ldGhvZCBpcyBzdXBwb3J0ZWQgaG93ZXZlci4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9yIGltcGxlbWVudHMgYSB7QGxpbmsgI3Jlc2V0fSBtZXRob2QsIGFsbG93aW5nIHRoZSByZXNldCBvZiB0aGUgaXRlcmF0b3IKLSAqIGJhY2sgdG8gdGhlIHN0YXJ0IGlmIHJlcXVpcmVkLgotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5PYmplY3RBcnJheUl0ZXJhdG9yCi0gKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvcgotICogQHNlZSBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBOZWlsIE8nVG9vbGUKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBoaWwgU3RlaXR6Ci0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RBcnJheUxpc3RJdGVyYXRvciBleHRlbmRzIE9iamVjdEFycmF5SXRlcmF0b3IKLQkJaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IsIFJlc2V0dGFibGVMaXN0SXRlcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGl0ZW0gcmV0dXJuZWQgYnkgYSBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4gCi0gICAgICogb3IgPGNvZGU+cHJldmlvdXMoKTwvY29kZT4uIFRoaXMgaXMgc2V0IHRvIDxjb2RlPi0xPC9jb2RlPiBpZiBuZWl0aGVyIG1ldGhvZAotICAgICAqIGhhcyB5ZXQgYmVlbiBpbnZva2VkLiA8Y29kZT5sYXN0SXRlbUluZGV4PC9jb2RlPiBpcyB1c2VkIHRvIHRvIGltcGxlbWVudCB0aGUKLSAgICAgKiB7QGxpbmsgI3NldH0gbWV0aG9kLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbGFzdEl0ZW1JbmRleCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSB3aXRoIDxjb2RlPnNldEFycmF5PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yLCB0aGUgaXRlcmF0b3IgaXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBpdGVyYXRvcgotICAgICAqIHVudGlsIHtAbGluayAjc2V0QXJyYXl9IGlzICBjYWxsZWQgdG8gZXN0YWJsaXNoIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEFycmF5TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hcnJheTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgc3VwZXIoYXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gT2JqZWN0QXJyYXlMaXN0SXRlcmF0b3IgdGhhdCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIHNwZWNpZmllZCBhcnJheSBmcm9tIGEgc3BlY2lmaWMgc3RhcnQgaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmFycmF5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc3RhcnQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RBcnJheUxpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0gICAgICAgIHN1cGVyKGFycmF5LCBzdGFydCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBPYmplY3RBcnJheUxpc3RJdGVyYXRvciB0aGF0IHdpbGwgaXRlcmF0ZSBvdmVyIGEgcmFuZ2Ugb2YgdmFsdWVzIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIKLSAgICAgKiBAcGFyYW0gc3RhcnQgIHRoZSBpbmRleCB0byBzdGFydCBpdGVyYXRpbmcgYXQKLSAgICAgKiBAcGFyYW0gZW5kICB0aGUgaW5kZXggKGV4Y2x1c2l2ZSkgdG8gZmluaXNoIGl0ZXJhdGluZyBhdAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc3RhcnQgb3IgZW5kIGluZGV4IGlzIG91dCBvZiBib3VuZHMKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlbmQgaW5kZXggaXMgYmVmb3JlIHRoZSBzdGFydAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YXJyYXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdEFycmF5TGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgc3VwZXIoYXJyYXksIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIC8vIExpc3RJdGVyYXRvciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgcHJldmlvdXMgZWxlbWVudHMgdG8gcmV0dXJuIGZyb20gdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgZWxlbWVudCB0byByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmluZGV4ID4gdGhpcy5zdGFydEluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBlbGVtZW50IGZyb20gdGhlIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgIGlmIChoYXNQcmV2aW91cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCA9IC0tdGhpcy5pbmRleDsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5pbmRleF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBuZXh0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmIChoYXNOZXh0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sYXN0SXRlbUluZGV4ID0gdGhpcy5pbmRleDsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5pbmRleCsrXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IGluZGV4IHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSByZXRyaWV2ZWQgbmV4dAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAtIHRoaXMuc3RhcnRJbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSByZXRyaWV2ZWQgaWYge0BsaW5rICNwcmV2aW91cygpfSBpcyBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gYmUgcmV0cmlldmVkIG5leHQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluZGV4IC0gdGhpcy5zdGFydEluZGV4IC0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgbW9kaWZpY2F0aW9uIG9mIGl0cyBiYWNraW5nIGFycmF5J3Mgc2l6ZSwgYW5kIHNvIHdpbGwKLSAgICAgKiBhbHdheXMgdGhyb3cgYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSB3aGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzIHRocm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImFkZCgpIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCB1bmRlciB0aGUgY3Vyc29yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCAKLSAgICAgKiB0byB7QGxpbmsgI25leHQoKX0gb2Yge0BsaW5rICNwcmV2aW91cygpfS4gCi0gICAgICogCi0gICAgICogPGI+Tm90ZTo8L2I+IHtAbGluayBMaXN0SXRlcmF0b3J9IGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgPGNvZGU+YWRkKCk8L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBvbmx5IGFsbG93IDxjb2RlPnNldCgpPC9jb2RlPiB0byBiZSBjYWxsZWQgb25jZSBwZXIgY2FsbCAKLSAgICAgKiB0byA8Y29kZT5uZXh0KCk8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzPC9jb2RlPiAoc2VlIHRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfQotICAgICAqIGphdmFkb2MgZm9yIG1vcmUgZGV0YWlscykuIFNpbmNlIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCAKLSAgICAgKiA8Y29kZT5hZGQoKTwvY29kZT4gb3IgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+LCA8Y29kZT5zZXQoKTwvY29kZT4gbWF5IGJlCi0gICAgICogY2FsbGVkIGFzIG9mdGVuIGFzIGRlc2lyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBzZXQgaW50byB0aGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBuZXh0KCkgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQuCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIG9iamVjdCB0eXBlIGlzIHVuc3VpdGFibGUgZm9yIHRoZSBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzLmxhc3RJdGVtSW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm11c3QgY2FsbCBuZXh0KCkgb3IgcHJldmlvdXMoKSBiZWZvcmUgYSBjYWxsIHRvIHNldCgpIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmFycmF5W3RoaXMubGFzdEl0ZW1JbmRleF0gPSBvYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBpdGVyYXRvciBiYWNrIHRvIHRoZSBzdGFydCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgc3VwZXIucmVzZXQoKTsKLSAgICAgICAgdGhpcy5sYXN0SXRlbUluZGV4ID0gLTE7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL09iamVjdEdyYXBoSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0R3JhcGhJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTEzNDIyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvT2JqZWN0R3JhcGhJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5BcnJheVN0YWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBBbiBJdGVyYXRvciB0aGF0IGNhbiB0cmF2ZXJzZSBtdWx0aXBsZSBpdGVyYXRvcnMgZG93biBhbiBvYmplY3QgZ3JhcGguCi0gKiA8cD4KLSAqIFRoaXMgaXRlcmF0b3IgY2FuIGV4dHJhY3QgbXVsdGlwbGUgb2JqZWN0cyBmcm9tIGEgY29tcGxleCB0cmVlLWxpa2Ugb2JqZWN0IGdyYXBoLgotICogVGhlIGl0ZXJhdGlvbiBzdGFydHMgZnJvbSBhIHNpbmdsZSByb290IG9iamVjdC4KLSAqIEl0IHVzZXMgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4gdG8gZXh0cmFjdCB0aGUgaXRlcmF0b3JzIGFuZCBlbGVtZW50cy4KLSAqIEl0cyBtYWluIGJlbmVmaXQgaXMgdGhhdCBubyBpbnRlcm1lZGlhdGUgPGNvZGU+TGlzdDwvY29kZT4gaXMgY3JlYXRlZC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGFuIG9iamVjdCBncmFwaDoKLSAqIDxwcmU+Ci0gKiAgICAgICAgICAgICAgICAgfC0gQnJhbmNoIC0tIExlYWYKLSAqICAgICAgICAgICAgICAgICB8ICAgICAgICAgXC0gTGVhZgotICogICAgICAgICB8LSBUcmVlIHwgICAgICAgICAvLSBMZWFmCi0gKiAgICAgICAgIHwgICAgICAgfC0gQnJhbmNoIC0tIExlYWYKLSAqICBGb3Jlc3QgfCAgICAgICAgICAgICAgICAgXC0gTGVhZgotICogICAgICAgICB8ICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gKiAgICAgICAgIHwgICAgICAgfCAgICAgICAgIFwtIExlYWYKLSAqICAgICAgICAgfC0gVHJlZSB8ICAgICAgICAgLy0gTGVhZgotICogICAgICAgICAgICAgICAgIHwtIEJyYW5jaCAtLSBMZWFmCi0gKiAgICAgICAgICAgICAgICAgfC0gQnJhbmNoIC0tIExlYWY8L3ByZT4KLSAqIFRoZSBmb2xsb3dpbmcgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LCB1c2VkIGluIHRoaXMgY2xhc3MsIHdpbGwgZXh0cmFjdCBhbGwKLSAqIHRoZSBMZWFmIG9iamVjdHMgd2l0aG91dCBjcmVhdGluZyBhIGNvbWJpbmVkIGludGVybWVkaWF0ZSBsaXN0OgotICogPHByZT4KLSAqIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBpbnB1dCkgewotICogICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGb3Jlc3QpIHsKLSAqICAgICByZXR1cm4gKChGb3Jlc3QpIGlucHV0KS50cmVlSXRlcmF0b3IoKTsKLSAqICAgfQotICogICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUcmVlKSB7Ci0gKiAgICAgcmV0dXJuICgoVHJlZSkgaW5wdXQpLmJyYW5jaEl0ZXJhdG9yKCk7Ci0gKiAgIH0KLSAqICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQnJhbmNoKSB7Ci0gKiAgICAgcmV0dXJuICgoQnJhbmNoKSBpbnB1dCkubGVhZkl0ZXJhdG9yKCk7Ci0gKiAgIH0KLSAqICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTGVhZikgewotICogICAgIHJldHVybiBpbnB1dDsKLSAqICAgfQotICogICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0gKiB9PC9wcmU+Ci0gKiA8cD4KLSAqIEludGVybmFsbHksIGl0ZXJhdGlvbiBzdGFydHMgZnJvbSB0aGUgcm9vdCBvYmplY3QuIFdoZW4gbmV4dCBpcyBjYWxsZWQsCi0gKiB0aGUgdHJhbnNmb3JtZXIgaXMgY2FsbGVkIHRvIGV4YW1pbmUgdGhlIG9iamVjdC4gVGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuCi0gKiBlaXRoZXIgYW4gaXRlcmF0b3Igb3IgYW4gb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGlzIGFuIEl0ZXJhdG9yLCB0aGUgbmV4dCBlbGVtZW50Ci0gKiBmcm9tIHRoYXQgaXRlcmF0b3IgaXMgb2J0YWluZWQgYW5kIHRoZSBwcm9jZXNzIHJlcGVhdHMuIElmIHRoZSBlbGVtZW50IGlzIGFuIG9iamVjdAotICogaXQgaXMgcmV0dXJuZWQuCi0gKiA8cD4KLSAqIFVuZGVyIG1hbnkgY2lyY3Vtc3RhbmNlcywgbGlua2luZyBJdGVyYXRvcnMgdG9nZXRoZXIgaW4gdGhpcyBtYW5uZXIgaXMKLSAqIG1vcmUgZWZmaWNpZW50IChhbmQgY29udmVuaWVudCkgdGhhbiB1c2luZyBuZXN0ZWQgZm9yIGxvb3BzIHRvIGV4dHJhY3QgYSBsaXN0LgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0R3JhcGhJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgIC8qKiBUaGUgc3RhY2sgb2YgaXRlcmF0b3JzICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5U3RhY2sgc3RhY2sgPSBuZXcgQXJyYXlTdGFjayg4KTsKLQkvKiogVGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB0cmVlICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCByb290OwotICAgIC8qKiBUaGUgdHJhbnNmb3JtZXIgdG8gdXNlICovCi0gICAgcHJvdGVjdGVkIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotCi0gICAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYW5vdGhlciBlbGVtZW50IGluIHRoZSBpdGVyYXRpb24gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0ID0gZmFsc2U7ICAgIAotICAgIC8qKiBUaGUgY3VycmVudCBpdGVyYXRvciAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjdXJyZW50SXRlcmF0b3I7Ci0gICAgLyoqIFRoZSBjdXJyZW50IHZhbHVlICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50VmFsdWU7Ci0gICAgLyoqIFRoZSBsYXN0IHVzZWQgaXRlcmF0b3IsIG5lZWRlZCBmb3IgcmVtb3ZlKCkgKi8KLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgbGFzdFVzZWRJdGVyYXRvcjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIE9iamVjdEdyYXBoSXRlcmF0b3IgdXNpbmcgYSByb290IG9iamVjdCBhbmQgdHJhbnNmb3JtZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvb3Qgb2JqZWN0IGNhbiBiZSBhbiBpdGVyYXRvciwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5Ci0gICAgICogbG9vcGVkIGFyb3VuZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdCAgdGhlIHJvb3Qgb2JqZWN0LCBudWxsIHdpbGwgcmVzdWx0IGluIGFuIGVtcHR5IGl0ZXJhdG9yCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlLCBudWxsIHdpbGwgdXNlIGEgbm8gZWZmZWN0IHRyYW5zZm9ybWVyCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEdyYXBoSXRlcmF0b3IoT2JqZWN0IHJvb3QsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgSXRlcmF0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZXJhdG9yID0gKEl0ZXJhdG9yKSByb290OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIE9iamVjdEdyYXBoSXRlcmF0b3IgdGhhdCB3aWxsIGhhbmRsZSBhbiBpdGVyYXRvciBvZiBpdGVyYXRvcnMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBleGlzdHMgZm9yIGNvbnZlbmllbmNlIHRvIGVtcGhhc2lzZSB0aGF0IHRoaXMgY2xhc3MgY2FuCi0gICAgICogYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgbmVzdGVkIGl0ZXJhdG9ycy4gVGhhdCBpcyB0byBzYXkgdGhhdCB0aGUgaXRlcmF0b3IKLSAgICAgKiBwYXNzZWQgaW4gaGVyZSBjb250YWlucyBvdGhlciBpdGVyYXRvcnMsIHdoaWNoIG1heSBpbiB0dXJuIGNvbnRhaW4gZnVydGhlcgotICAgICAqIGl0ZXJhdG9ycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdEl0ZXJhdG9yICB0aGUgcm9vdCBpdGVyYXRvciwgbnVsbCB3aWxsIHJlc3VsdCBpbiBhbiBlbXB0eSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yIHJvb3RJdGVyYXRvcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RJdGVyYXRvcjsKLSAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIExvb3BzIGFyb3VuZCB0aGUgaXRlcmF0b3JzIHRvIGZpbmQgdGhlIG5leHQgdmFsdWUgdG8gcmV0dXJuLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1cnJlbnRJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGhhc05leHQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudEl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBoYXNOZXh0IHdpbGwgYmUgZmFsc2UKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZE5leHQocm9vdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZE5leHQodHJhbnNmb3JtZXIudHJhbnNmb3JtKHJvb3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5kTmV4dEJ5SXRlcmF0b3IoY3VycmVudEl0ZXJhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uIGdpdmVuIGFueSBzdGFydCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc3RhcnQgZnJvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmROZXh0KE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvcikgewotICAgICAgICAgICAgLy8gbmVlZCB0byBleGFtaW5lIHRoaXMgaXRlcmF0b3IKLSAgICAgICAgICAgIGZpbmROZXh0QnlJdGVyYXRvcigoSXRlcmF0b3IpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5leHQgdmFsdWUgZm91bmQKLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgaGFzTmV4dCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIG5leHQgb2JqZWN0IGluIHRoZSBpdGVyYXRpb24gZ2l2ZW4gYW4gaXRlcmF0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgZnJvbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmROZXh0QnlJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBpZiAoaXRlcmF0b3IgIT0gY3VycmVudEl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICAvLyByZWN1cnNlIGEgbGV2ZWwKLSAgICAgICAgICAgIGlmIChjdXJyZW50SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goY3VycmVudEl0ZXJhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnRJdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSAmJiBoYXNOZXh0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5leHQgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5kTmV4dChuZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzTmV4dCkgewotICAgICAgICAgICAgLy8gbmV4dCB2YWx1ZSBmb3VuZAotICAgICAgICB9IGVsc2UgaWYgKHN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gYWxsIGl0ZXJhdG9ycyBleGhhdXN0ZWQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0b3IgZXhoYXVzdGVkLCBnbyB1cCBhIGxldmVsCi0gICAgICAgICAgICBjdXJyZW50SXRlcmF0b3IgPSAoSXRlcmF0b3IpIHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgZmluZE5leHRCeUl0ZXJhdG9yKGN1cnJlbnRJdGVyYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3JlIGVsZW1lbnRzIGluIHRoZSBpdGVyYXRpb24gdG8gb2J0YWluLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50cyByZW1haW4gaW4gdGhlIGl0ZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRJdGVyYXRvcigpOwotICAgICAgICByZXR1cm4gaGFzTmV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIGFsbCB0aGUgSXRlcmF0b3JzIGFyZSBleGhhdXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRJdGVyYXRvcigpOwotICAgICAgICBpZiAoaGFzTmV4dCA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk5vIG1vcmUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGxhc3RVc2VkSXRlcmF0b3IgPSBjdXJyZW50SXRlcmF0b3I7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBjdXJyZW50VmFsdWU7Ci0gICAgICAgIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGhhc05leHQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGZyb20gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiB0aGUgbGFzdCBlbGVtZW50IHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHJlbW92ZSgpIG9uIHRoZSB1bmRlcmx5aW5nIEl0ZXJhdG9yIGFuZCBpdCBtYXkKLSAgICAgKiB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBJdGVyYXRvcgotICAgICAqIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgIGlmIHRoZSByZW1vdmUgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBJdGVyYXRvcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICBpZiB0aGUgbmV4dCBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQsIG9yIHRoZSByZW1vdmUgbWV0aG9kIGhhcwotICAgICAqICAgYWxyZWFkeSBiZWVuIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBjYWxsIHRvIHRoZSBuZXh0IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGlmIChsYXN0VXNlZEl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIHJlbW92ZSgpIGNhbm5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFVzZWRJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgbGFzdFVzZWRJdGVyYXRvciA9IG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1Byb3h5SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUHJveHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzI2MzRjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUHJveHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKiogCi0gKiBBIFByb3h5IHtAbGluayBJdGVyYXRvciBJdGVyYXRvcn0gd2hpY2ggZGVsZWdhdGVzIGl0cyBtZXRob2RzIHRvIGEgcHJveHkgaW5zdGFuY2UuCi0gKgotICogQGRlcHJlY2F0ZWQgVXNlIEFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3IuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotICAgIAotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSBpdGVyYXRvci4gKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIAotICAgIC8vIENvbnN0cnVjdG9ycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Qcm94eUl0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgbm90IGZ1bmN0aW9uCi0gICAgICogdW50aWwge0BsaW5rICNzZXRJdGVyYXRvcihJdGVyYXRvcil9IGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJveHlJdGVyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Qcm94eUl0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgdXNlIHRoZQotICAgICAqIGdpdmVuIGl0ZXJhdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgdW5kZXJseWluZyBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBQcm94eUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLyBJdGVyYXRvciBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgaGFzIG1vcmUgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGhhcyBtb3JlIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEl0ZXJhdG9yKCkuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgdW5kZXJseWluZyBpdGVyYXRvci4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgdW5kZXJseWluZyBpdGVyYXRvcgotICAgICAqICBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uICBpZiB0aGUgdW5kZXJseWluZyBpdGVyYXRvciAKLSAgICAgKiAgICByYWlzZXMgaXQgYmVjYXVzZSBpdCBoYXMgbm8gbW9yZSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEl0ZXJhdG9yKCkubmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBSZW1vdmVzIHRoZSBsYXN0IHJldHVybmVkIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiB0aGF0IHNwYXduZWQKLSAgICAgKiAgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBnZXRJdGVyYXRvcigpLnJlbW92ZSgpOwotICAgIH0KLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogR2V0dGVyIGZvciBwcm9wZXJ0eSBpdGVyYXRvci4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgIH0KLSAgICAvKiogU2V0dGVyIGZvciBwcm9wZXJ0eSBpdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1Byb3h5TGlzdEl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1Byb3h5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNjA1OTUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Qcm94eUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIHByb3h5IHtAbGluayBMaXN0SXRlcmF0b3IgTGlzdEl0ZXJhdG9yfSB3aGljaCBkZWxlZ2F0ZXMgaXRzCi0gKiBtZXRob2RzIHRvIGEgcHJveHkgaW5zdGFuY2UuCi0gKgotICogQGRlcHJlY2F0ZWQgVXNlIEFic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjQuMAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBSb2RuZXkgV2FsZGhvZmYKLSAqLwotcHVibGljIGNsYXNzIFByb3h5TGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yIHsKLQotICAgIC8qKiBIb2xkcyB2YWx1ZSBvZiBwcm9wZXJ0eSAiaXRlcmF0b3IiLiAqLwotICAgIHByaXZhdGUgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8gQ29uc3RydWN0b3JzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlByb3h5TGlzdEl0ZXJhdG9yPC9jb2RlPiB0aGF0IHdpbGwgbm90IAotICAgICAqIGZ1bmN0aW9uIHVudGlsIHtAbGluayAjc2V0TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcikgc2V0TGlzdEl0ZXJhdG9yfQotICAgICAqIGlzIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIFByb3h5TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UHJveHlMaXN0SXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCB1c2UgdGhlCi0gICAgICogZ2l2ZW4gbGlzdCBpdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdGhlIGxpc3QgaXRlcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFByb3h5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLy8gTGlzdEl0ZXJhdG9yIGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIExpc3RJdGVyYXRvciNhZGQoT2JqZWN0KX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG8pIHsKLSAgICAgICAgZ2V0TGlzdEl0ZXJhdG9yKCkuYWRkKG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzTmV4dCgpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0SXRlcmF0b3IoKS5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIExpc3RJdGVyYXRvciNoYXNQcmV2aW91cygpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdEl0ZXJhdG9yKCkuaGFzUHJldmlvdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTGlzdEl0ZXJhdG9yI25leHQoKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0SXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0SW5kZXgoKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3RJdGVyYXRvcigpLm5leHRJbmRleCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBMaXN0SXRlcmF0b3IjcHJldmlvdXMoKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdEl0ZXJhdG9yKCkucHJldmlvdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW52b2tlcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzSW5kZXgoKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0SXRlcmF0b3IoKS5wcmV2aW91c0luZGV4KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEludm9rZXMgdGhlIHVuZGVybHlpbmcge0BsaW5rIExpc3RJdGVyYXRvciNyZW1vdmUoKX0gbWV0aG9kLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGdldExpc3RJdGVyYXRvcigpLnJlbW92ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBMaXN0SXRlcmF0b3Ijc2V0KE9iamVjdCl9IG1ldGhvZC4KLSAgICAgKgotICAgICAqICBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUgdW5kZXJseWluZyBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSB7Ci0gICAgICAgIGdldExpc3RJdGVyYXRvcigpLnNldChvKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogCi0gICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBpdGVyYXRvci4KLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgZ2V0TGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwcm9wZXJ0eSBpdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgTmV3IHZhbHVlIG9mIHByb3BlcnR5IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1JldmVyc2VMaXN0SXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUmV2ZXJzZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmMzZmZmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvUmV2ZXJzZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBJdGVyYXRlcyBiYWNrd2FyZHMgdGhyb3VnaCBhIExpc3QsIHN0YXJ0aW5nIHdpdGggdGhlIGxhc3QgZWxlbWVudAotICogYW5kIGNvbnRpbnVpbmcgdG8gdGhlIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbG9vcGluZyBhcm91bmQKLSAqIGEgbGlzdCBpbiByZXZlcnNlIG9yZGVyIHdpdGhvdXQgbmVlZGluZyB0byBhY3R1YWxseSByZXZlcnNlIHRoZSBsaXN0LgotICogPHA+Ci0gKiBUaGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+IHdpbGwgcmV0dXJuIHRoZSBsYXN0IGVsZW1lbnQKLSAqIGZyb20gdGhlIGxpc3QsIGFuZCBzbyBvbi4gVGhlIDxjb2RlPmhhc05leHQoKTwvY29kZT4gbWV0aG9kIHdvcmtzCi0gKiBpbiBjb25jZXJ0IHdpdGggdGhlIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIGFzIGV4cGVjdGVkLgotICogSG93ZXZlciwgdGhlIDxjb2RlPm5leHRJbmRleCgpPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgY29ycmVjdAotICogaW5kZXggaW4gdGhlIGxpc3QsIHRodXMgaXQgc3RhcnRzIGhpZ2ggYW5kIHJlZHVjZXMgYXMgdGhlIGl0ZXJhdGlvbgotICogY29udGludWVzLiBUaGUgcHJldmlvdXMgbWV0aG9kcyB3b3JrIHNpbWlsYXJseS4KLSAqCi0gKiBAYXV0aG9yIFNlcmdlIEtueXN0YXV0YXMKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICovCi1wdWJsaWMgY2xhc3MgUmV2ZXJzZUxpc3RJdGVyYXRvciBpbXBsZW1lbnRzIFJlc2V0dGFibGVMaXN0SXRlcmF0b3IgewotCi0gICAgLyoqIFRoZSBsaXN0IGJlaW5nIHdyYXBwZWQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3Q7Ci0gICAgLyoqIFRoZSBsaXN0IGl0ZXJhdG9yIGJlaW5nIHdyYXBwZWQuICovCi0gICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgLyoqIEZsYWcgdG8gaW5kaWNhdGUgaWYgdXBkYXRpbmcgaXMgcG9zc2libGUgYXQgdGhlIG1vbWVudC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRGb3JVcGRhdGUgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyBhIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gY3JlYXRlIGEgcmV2ZXJzZWQgaXRlcmF0b3IgZm9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIFJldmVyc2VMaXN0SXRlcmF0b3IoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgICAgIGl0ZXJhdG9yID0gbGlzdC5saXN0SXRlcmF0b3IobGlzdC5zaXplKCkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBpcyBhbm90aGVyIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW5vdGhlciBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqIFRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIHByZXZpb3VzIGluIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0gICAgICAgIHZhbGlkRm9yVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBpcyBhIHByZXZpb3VzIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJldmlvdXMgZWxlbWVudC4KLSAgICAgKiBUaGUgbmV4dCBlbGVtZW50IGlzIHRoZSBwcmV2aW91cyBpbiB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmFsaWRGb3JVcGRhdGUgPSB0cnVlOwotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBlbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbGFzdCByZXR1cm5lZCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBpcyB1bm1vZGlmaWFibGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBlbGVtZW50IHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaWYgKHZhbGlkRm9yVXBkYXRlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIGZyb20gbGlzdCB1bnRpbCBuZXh0KCkgb3IgcHJldmlvdXMoKSBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgbGFzdCByZXR1cm5lZCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBzZXQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBsaXN0IGlzIHVubW9kaWZpYWJsZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvciBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHZhbGlkRm9yVXBkYXRlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHRvIGxpc3QgdW50aWwgbmV4dCgpIG9yIHByZXZpb3VzKCkgY2FsbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaXRlcmF0b3Iuc2V0KG9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHRvIHRoZSBsaXN0IGJldHdlZW4gdGhlIG5leHQgYW5kIHByZXZpb3VzIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBsaXN0IGlzIHVubW9kaWZpYWJsZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvciBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvYmopIHsKLSAgICAgICAgLy8gdGhlIHZhbGlkRm9yVXBkYXRlIGZsYWcgaXMgbmVlZGVkIGFzIHRoZSBuZWNlc3NhcnkgcHJldmlvdXMoKQotICAgICAgICAvLyBtZXRob2QgY2FsbCByZS1lbmFibGVzIHJlbW92ZSBhbmQgYWRkCi0gICAgICAgIGlmICh2YWxpZEZvclVwZGF0ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGFkZCB0byBsaXN0IHVudGlsIG5leHQoKSBvciBwcmV2aW91cygpIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHZhbGlkRm9yVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgIGl0ZXJhdG9yLmFkZChvYmopOwotICAgICAgICBpdGVyYXRvci5wcmV2aW91cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgaXRlcmF0b3IgYmFjayB0byB0aGUgc3RhcnQgKHdoaWNoIGlzIHRoZQotICAgICAqIGVuZCBvZiB0aGUgbGlzdCBhcyB0aGlzIGlzIGEgcmV2ZXJzZWQgaXRlcmF0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGl0ZXJhdG9yID0gbGlzdC5saXN0SXRlcmF0b3IobGlzdC5zaXplKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9TaW5nbGV0b25JdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9TaW5nbGV0b25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGVmNjc3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvU2luZ2xldG9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5SZXNldHRhYmxlSXRlcmF0b3I7Ci0KLS8qKiAKLSAqIDxjb2RlPlNpbmdsZXRvbkl0ZXJhdG9yPC9jb2RlPiBpcyBhbiB7QGxpbmsgSXRlcmF0b3J9IG92ZXIgYSBzaW5nbGUgCi0gKiBvYmplY3QgaW5zdGFuY2UuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMi4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI3ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUm9kbmV5IFdhbGRob2ZmCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGV0b25JdGVyYXRvcgotCQlpbXBsZW1lbnRzIEl0ZXJhdG9yLCBSZXNldHRhYmxlSXRlcmF0b3IgewotCi0gICAgLyoqIFdoZXRoZXIgcmVtb3ZlIGlzIGFsbG93ZWQgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVtb3ZlQWxsb3dlZDsKLSAgICAvKiogSXMgdGhlIGN1cnNvciBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYmVmb3JlRmlyc3QgPSB0cnVlOwotICAgIC8qKiBIYXMgdGhlIGVsZW1lbnQgYmVlbiByZW1vdmVkICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLSAgICAvKiogVGhlIG9iamVjdCAqLwotICAgIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+U2luZ2xldG9uSXRlcmF0b3I8L2NvZGU+IHdoZXJlIDxjb2RlPnJlbW92ZTwvY29kZT4KLSAgICAgKiBpcyBhIHBlcm1pdHRlZCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgc2luZ2xlIG9iamVjdCB0byByZXR1cm4gZnJvbSB0aGUgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xldG9uSXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aGlzKG9iamVjdCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5TaW5nbGV0b25JdGVyYXRvcjwvY29kZT4gb3B0aW9uYWxseSBjaG9vc2luZyBpZgotICAgICAqIDxjb2RlPnJlbW92ZTwvY29kZT4gaXMgYSBwZXJtaXR0ZWQgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgdGhlIHNpbmdsZSBvYmplY3QgdG8gcmV0dXJuIGZyb20gdGhlIGl0ZXJhdG9yCi0gICAgICogQHBhcmFtIHJlbW92ZUFsbG93ZWQgIHRydWUgaWYgcmVtb3ZlIGlzIGFsbG93ZWQKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xldG9uSXRlcmF0b3IoT2JqZWN0IG9iamVjdCwgYm9vbGVhbiByZW1vdmVBbGxvd2VkKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgICAgICB0aGlzLnJlbW92ZUFsbG93ZWQgPSByZW1vdmVBbGxvd2VkOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBJcyBhbm90aGVyIG9iamVjdCBhdmFpbGFibGUgZnJvbSB0aGUgaXRlcmF0b3I/Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHNpbmdsZSBvYmplY3QgaGFzbid0IGJlZW4gcmV0dXJuZWQgeWV0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2luZ2xlIG9iamVjdCBoYXNuJ3QgYmVlbiByZXR1cm5lZCB5ZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gKGJlZm9yZUZpcnN0ICYmICFyZW1vdmVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgc2luZ2xlIG9iamVjdCBpZiBpdCBoYXNuJ3QgYmVlbiByZXR1cm5lZCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGUgb2JqZWN0Ci0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBzaW5nbGUgb2JqZWN0IGhhcyBhbHJlYWR5IAotICAgICAqICAgIGJlZW4gcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmICghYmVmb3JlRmlyc3QgfHwgcmVtb3ZlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBiZWZvcmVGaXJzdCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhpcyBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPHR0Pm5leHQ8L3R0PiBtZXRob2QgaGFzIG5vdAotICAgICAqICAgICAgICB5ZXQgYmVlbiBjYWxsZWQsIG9yIHRoZSA8dHQ+cmVtb3ZlPC90dD4gbWV0aG9kIGhhcyBhbHJlYWR5Ci0gICAgICogICAgICAgIGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGNhbGwgdG8gdGhlIDx0dD5uZXh0PC90dD4KLSAgICAgKiAgICAgICAgbWV0aG9kLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGlmIChyZW1vdmVBbGxvd2VkKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlZCB8fCBiZWZvcmVGaXJzdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBpdGVyYXRvciB0byB0aGUgc3RhcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGJlZm9yZUZpcnN0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1NpbmdsZXRvbkxpc3RJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9TaW5nbGV0b25MaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTZiN2Y1MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1NpbmdsZXRvbkxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5SZXNldHRhYmxlTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIDxjb2RlPlNpbmdsZXRvbkl0ZXJhdG9yPC9jb2RlPiBpcyBhbiB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBvdmVyIGEgc2luZ2xlIAotICogb2JqZWN0IGluc3RhbmNlLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDIuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFJvZG5leSBXYWxkaG9mZgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xldG9uTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yLCBSZXNldHRhYmxlTGlzdEl0ZXJhdG9yIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBiZWZvcmVGaXJzdCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5leHRDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+U2luZ2xldG9uTGlzdEl0ZXJhdG9yPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBzaW5nbGUgb2JqZWN0IHRvIHJldHVybiBmcm9tIHRoZSBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBTaW5nbGV0b25MaXN0SXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyBhbm90aGVyIG9iamVjdCBhdmFpbGFibGUgZnJvbSB0aGUgaXRlcmF0b3I/Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHNpbmdsZSBvYmplY3QgaGFzbid0IGJlZW4gcmV0dXJuZWQgeWV0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2luZ2xlIG9iamVjdCBoYXNuJ3QgYmVlbiByZXR1cm5lZCB5ZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gYmVmb3JlRmlyc3QgJiYgIXJlbW92ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgYSBwcmV2aW91cyBvYmplY3QgYXZhaWxhYmxlIGZyb20gdGhlIGl0ZXJhdG9yPwotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBzaW5nbGUgb2JqZWN0IGhhcyBiZWVuIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2luZ2xlIG9iamVjdCBoYXMgYmVlbiByZXR1cm5lZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gIWJlZm9yZUZpcnN0ICYmICFyZW1vdmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgYSBzdWJzZXF1ZW50Ci0gICAgICogY2FsbCB0byA8dHQ+bmV4dDwvdHQ+LgotICAgICAqCi0gICAgICogQHJldHVybiAwIG9yIDEgZGVwZW5kaW5nIG9uIGN1cnJlbnQgc3RhdGUuIAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotICAgICAgICByZXR1cm4gKGJlZm9yZUZpcnN0ID8gMCA6IDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgYSBzdWJzZXF1ZW50Ci0gICAgICogY2FsbCB0byA8dHQ+cHJldmlvdXM8L3R0Pi4gQSByZXR1cm4gdmFsdWUgb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGl0ZXJhdG9yIGlzIGN1cnJlbnRseSBhdAotICAgICAqIHRoZSBzdGFydC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gMCBvciAtMSBkZXBlbmRpbmcgb24gY3VycmVudCBzdGF0ZS4gCi0gICAgICovCi0gICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gKGJlZm9yZUZpcnN0ID8gLTEgOiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIGl0ZXJhdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgc2luZ2xlIG9iamVjdCBpZiBpdCBoYXNuJ3QgYmVlbiByZXR1cm5lZCB5ZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGUgb2JqZWN0Ci0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBzaW5nbGUgb2JqZWN0IGhhcyBhbHJlYWR5IAotICAgICAqICAgIGJlZW4gcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIGlmICghYmVmb3JlRmlyc3QgfHwgcmVtb3ZlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBiZWZvcmVGaXJzdCA9IGZhbHNlOwotICAgICAgICBuZXh0Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByZXZpb3VzIG9iamVjdCBmcm9tIHRoZSBpdGVyYXRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIHNpbmdsZSBvYmplY3QgaWYgaXQgaGFzIGJlZW4gcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW5nbGUgb2JqZWN0Ci0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBzaW5nbGUgb2JqZWN0IGhhcyBub3QgYWxyZWFkeSAKLSAgICAgKiAgICBiZWVuIHJldHVybmVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgaWYgKGJlZm9yZUZpcnN0IHx8IHJlbW92ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYmVmb3JlRmlyc3QgPSB0cnVlOwotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhpcyBpdGVyYXRvci4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPHR0Pm5leHQ8L3R0PiBvciA8dHQ+cHJldmlvdXM8L3R0PiAKLSAgICAgKiAgICAgICAgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkLCBvciB0aGUgPHR0PnJlbW92ZTwvdHQ+IG1ldGhvZCAKLSAgICAgKiAgICAgICAgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byA8dHQ+bmV4dDwvdHQ+Ci0gICAgICogICAgICAgIG9yIDx0dD5wcmV2aW91czwvdHQ+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgaWYoIW5leHRDYWxsZWQgfHwgcmVtb3ZlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhbHdheXMgdGhyb3dzIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiYWRkKCkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGl0ZXJhdG9yIik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2luZ2xldG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBzZXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8dHQ+bmV4dDwvdHQ+IGhhcyBub3QgYmVlbiBjYWxsZWQgCi0gICAgICogICAgICAgICAgb3IgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCFuZXh0Q2FsbGVkIHx8IHJlbW92ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iajsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIGl0ZXJhdG9yIGJhY2sgdG8gdGhlIHN0YXJ0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBiZWZvcmVGaXJzdCA9IHRydWU7Ci0gICAgICAgIG5leHRDYWxsZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1RyYW5zZm9ybUl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1RyYW5zZm9ybUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkZTI2ZmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9UcmFuc2Zvcm1JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKiogCi0gKiBEZWNvcmF0ZXMgYW4gaXRlcmF0b3Igc3VjaCB0aGF0IGVhY2ggZWxlbWVudCByZXR1cm5lZCBpcyB0cmFuc2Zvcm1lZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAxLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdG9yIGJlaW5nIHVzZWQgKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgIC8qKiBUaGUgdHJhbnNmb3JtZXIgYmVpbmcgdXNlZCAqLwotICAgIHByaXZhdGUgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXI7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5UcmFuc2Zvcm1JdGVyYXRvcjwvY29kZT4gdGhhdCB3aWxsIG5vdCBmdW5jdGlvbgotICAgICAqIHVudGlsIHRoZSB7QGxpbmsgI3NldEl0ZXJhdG9yKEl0ZXJhdG9yKSBzZXRJdGVyYXRvcn0gbWV0aG9kIGlzIAotICAgICAqIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybUl0ZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+VHJhbnNmb3JtSXRlcmF0b3I8L2NvZGU+IHRoYXQgd29uJ3QgdHJhbnNmb3JtCi0gICAgICogZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gaXRlcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNmb3JtSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+VHJhbnNmb3JtSXRlcmF0b3I8L2NvZGU+IHRoYXQgd2lsbCB1c2UgdGhlCi0gICAgICogZ2l2ZW4gaXRlcmF0b3IgYW5kIHRyYW5zZm9ybWVyLiAgSWYgdGhlIGdpdmVuIHRyYW5zZm9ybWVyIGlzIG51bGwsCi0gICAgICogdGhlbiBvYmplY3RzIHdpbGwgbm90IGJlIHRyYW5zZm9ybWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zZm9ybUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIHRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBpdGVyYXRpb24sIHRyYW5zZm9ybWluZyBpdCB1c2luZyB0aGUKLSAgICAgKiBjdXJyZW50IHRyYW5zZm9ybWVyLiBJZiB0aGUgdHJhbnNmb3JtZXIgaXMgbnVsbCwgbm8gdHJhbnNmb3JtYXRpb24KLSAgICAgKiBvY2N1cnMgYW5kIHRoZSBvYmplY3QgZnJvbSB0aGUgaXRlcmF0b3IgaXMgcmV0dXJuZWQgZGlyZWN0bHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICByZXR1cm4gdHJhbnNmb3JtKGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIAotICAgICAqIEdldHMgdGhlIGl0ZXJhdG9yIHRoaXMgaXRlcmF0b3IgaXMgdXNpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIGl0ZXJhdG9yIGZvciB0aGlzIGl0ZXJhdG9yIHRvIHVzZS4KLSAgICAgKiBJZiBpdGVyYXRpb24gaGFzIHN0YXJ0ZWQsIHRoaXMgZWZmZWN0aXZlbHkgcmVzZXRzIHRoZSBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKiAKLSAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1lciB0aGlzIGl0ZXJhdG9yIGlzIHVzaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyLgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc2Zvcm1lciBnZXRUcmFuc2Zvcm1lcigpIHsKLSAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1lciB0aGlzIHRoZSBpdGVyYXRvciB0byB1c2UuCi0gICAgICogQSBudWxsIHRyYW5zZm9ybWVyIGlzIGEgbm8tb3AgdHJhbnNmb3JtZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIHRyYW5zZm9ybWVyLgotICAgICAqIElmIHRoZSB0cmFuc2Zvcm1lciBpcyBudWxsLCB0aGUgb3JpZ2luYWwgb2JqZWN0IGlzIHJldHVybmVkIGFzLWlzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSAgdGhlIG9iamVjdCB0byB0cmFuc2Zvcm0KLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBvYmplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybShPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIGlmICh0cmFuc2Zvcm1lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VuaXF1ZUZpbHRlckl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VuaXF1ZUZpbHRlckl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYTAxNWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9VbmlxdWVGaWx0ZXJJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuVW5pcXVlUHJlZGljYXRlOwotCi0vKiogCi0gKiBBIEZpbHRlckl0ZXJhdG9yIHdoaWNoIG9ubHkgcmV0dXJucyAidW5pcXVlIiBPYmplY3RzLiAgSW50ZXJuYWxseSwKLSAqIHRoZSBJdGVyYXRvciBtYWludGFpbnMgYSBTZXQgb2Ygb2JqZWN0cyBpdCBoYXMgYWxyZWFkeSBlbmNvdW50ZXJlZCwKLSAqIGFuZCBkdXBsaWNhdGUgT2JqZWN0cyBhcmUgc2tpcHBlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAyLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIE1vcmdhbiBEZWxhZ3JhbmdlCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIEZpbHRlckl0ZXJhdG9yIHsKLSAgICAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5VbmlxdWVGaWx0ZXJJdGVyYXRvcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFVuaXF1ZUZpbHRlckl0ZXJhdG9yKCBJdGVyYXRvciBpdGVyYXRvciApIHsKLSAgICAgICAgc3VwZXIoaXRlcmF0b3IsIFVuaXF1ZVByZWRpY2F0ZS5nZXRJbnN0YW5jZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Q3YWIzOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci0KLS8qKiAKLSAqIERlY29yYXRlcyBhbiBpdGVyYXRvciBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yLCBVbm1vZGlmaWFibGUgewotCi0gICAgLyoqIFRoZSBpdGVyYXRvciBiZWluZyBkZWNvcmF0ZWQgKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHN1Y2ggdGhhdCBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGl0ZXJhdG9yIGlzIGFscmVhZHkgdW5tb2RpZmlhYmxlIGl0IGlzIHJldHVybmVkIGRpcmVjdGx5LgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZGVjb3JhdGUoSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUl0ZXJhdG9yKGl0ZXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OGVjNjA5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZTsKLQotLyoqIAotICogRGVjb3JhdGVzIGEgbGlzdCBpdGVyYXRvciBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVMaXN0SXRlcmF0b3IgaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IsIFVubW9kaWZpYWJsZSB7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdG9yIGJlaW5nIGRlY29yYXRlZCAqLwotICAgIHByaXZhdGUgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHN1Y2ggdGhhdCBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0SXRlcmF0b3IgZGVjb3JhdGUoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0SXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVyYXRvciBpbnN0YW5jZW9mIFVubW9kaWZpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yKGl0ZXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHRJbmRleCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNldCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImFkZCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU2NzlhNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU1hcEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAxOTk5LTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotCi0vKiogCi0gKiBEZWNvcmF0ZXMgYSBtYXAgaXRlcmF0b3Igc3VjaCB0aGF0IGl0IGNhbm5vdCBiZSBtb2RpZmllZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjcgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciwgVW5tb2RpZmlhYmxlIHsKLQotICAgIC8qKiBUaGUgaXRlcmF0b3IgYmVpbmcgZGVjb3JhdGVkICovCi0gICAgcHJpdmF0ZSBNYXBJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBEZWNvcmF0ZXMgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0b3IgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwSXRlcmF0b3IgZGVjb3JhdGUoTWFwSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcEl0ZXJhdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlcmF0b3IgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yKGl0ZXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yKE1hcEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNldFZhbHVlKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU9yZGVyZWRNYXBJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2l0ZXJhdG9ycy9Vbm1vZGlmaWFibGVPcmRlcmVkTWFwSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJlMDg2Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL1VubW9kaWZpYWJsZU9yZGVyZWRNYXBJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci0KLS8qKiAKLSAqIERlY29yYXRlcyBhbiBvcmRlcmVkIG1hcCBpdGVyYXRvciBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyNyAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVPcmRlcmVkTWFwSXRlcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkTWFwSXRlcmF0b3IsIFVubW9kaWZpYWJsZSB7Ci0KLSAgICAvKiogVGhlIGl0ZXJhdG9yIGJlaW5nIGRlY29yYXRlZCAqLwotICAgIHByaXZhdGUgT3JkZXJlZE1hcEl0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHN1Y2ggdGhhdCBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgIHRoZSBpdGVyYXRvciB0byBkZWNvcmF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRvciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcmRlcmVkTWFwSXRlcmF0b3IgZGVjb3JhdGUoT3JkZXJlZE1hcEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcmRlcmVkTWFwSXRlcmF0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVyYXRvciBpbnN0YW5jZW9mIFVubW9kaWZpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlT3JkZXJlZE1hcEl0ZXJhdG9yKGl0ZXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICB0aGUgaXRlcmF0b3IgdG8gZGVjb3JhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZU9yZGVyZWRNYXBJdGVyYXRvcihPcmRlcmVkTWFwSXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gaXRlcmF0b3IuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNldFZhbHVlKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvaXRlcmF0b3JzL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYWIwOTA0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9pdGVyYXRvcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuMSAyMDA5LzA1LzI3IDIyOjE2OjI3IG1wYXJrZXIgRXhwICQgLS0+Ci0gPCEtLQotICAgQ29weXJpZ2h0IDIwMDItMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08Ym9keT4KLTxwPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLXtAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgSXRlcmF0b3J9IGludGVyZmFjZS4KLTxwPgotWW91IG1heSBhbHNvIGNvbnNpZGVyIHVzaW5nIAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5JdGVyYXRvclV0aWxzIEl0ZXJhdG9yVXRpbHN9LAotd2hpY2ggaXMgYSBzaW5nbGUgY2xhc3MgdGhhdCB1c2VzIHN0YXRpYyBtZXRob2RzIHRvIGNvbnN0cnVjdCBpbnN0YW5jZXMKLW9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZS4KLTwvYm9keT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdEtleVZhbHVlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RLZXlWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTNhYzNmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdEtleVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmtleXZhbHVlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLktleVZhbHVlOwotCi0vKioKLSAqIEFic3RyYWN0IHBhaXIgY2xhc3MgdG8gYXNzaXN0IHdpdGggY3JlYXRpbmcgPGNvZGU+S2V5VmFsdWU8L2NvZGU+Ci0gKiBhbmQge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgTWFwLkVudHJ5fSBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI4ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0S2V5VmFsdWUgaW1wbGVtZW50cyBLZXlWYWx1ZSB7Ci0KLSAgICAvKiogVGhlIGtleSAqLwotICAgIHByb3RlY3RlZCBPYmplY3Qga2V5OwotICAgIC8qKiBUaGUgdmFsdWUgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBwYWlyIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIGdpdmVuIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSBmb3IgdGhlIGVudHJ5LCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIGZvciB0aGUgZW50cnksIG1heSBiZSBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0S2V5VmFsdWUoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUga2V5IGZyb20gdGhlIHBhaXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgcGFpci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBkZWJ1Z2dpbmcgU3RyaW5nIHZpZXcgb2YgdGhlIHBhaXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIFN0cmluZyB2aWV3IG9mIHRoZSBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgIC5hcHBlbmQoZ2V0S2V5KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCc9JykKLSAgICAgICAgICAgIC5hcHBlbmQoZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0TWFwRW50cnkuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9BYnN0cmFjdE1hcEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2YmFhYTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0TWFwRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFic3RyYWN0IFBhaXIgY2xhc3MgdG8gYXNzaXN0IHdpdGggY3JlYXRpbmcgY29ycmVjdAotICoge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgTWFwLkVudHJ5fSBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwRW50cnkgZXh0ZW5kcyBBYnN0cmFjdEtleVZhbHVlIGltcGxlbWVudHMgTWFwLkVudHJ5IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBnaXZlbiB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgZm9yIHRoZSBlbnRyeSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSBmb3IgdGhlIGVudHJ5LCBtYXkgYmUgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdE1hcEVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlcihrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBNYXAuRW50cnkgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIAotICAgICAqIFNldHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGlzIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyA8Y29kZT5NYXAuRW50cnk8L2NvZGU+IGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBNYXAsIHNvIG9ubHkgdGhlCi0gICAgICogbG9jYWwgZGF0YSBpcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgbmV3IHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBPYmplY3QgYW5zd2VyID0gdGhpcy52YWx1ZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgPGNvZGU+TWFwLkVudHJ5PC9jb2RlPiB3aXRoIGFub3RoZXIgPGNvZGU+TWFwLkVudHJ5PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRlZCBwZXIgQVBJIGRvY3VtZW50YXRpb24gb2Yge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkjZXF1YWxzKE9iamVjdCl9Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIGtleSBhbmQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNYXAuRW50cnkgb3RoZXIgPSAoTWFwLkVudHJ5KSBvYmo7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgKGdldEtleSgpID09IG51bGwgPyBvdGhlci5nZXRLZXkoKSA9PSBudWxsIDogZ2V0S2V5KCkuZXF1YWxzKG90aGVyLmdldEtleSgpKSkgJiYKLSAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG51bGwgPyBvdGhlci5nZXRWYWx1ZSgpID09IG51bGwgOiBnZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGhhc2hDb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgZXF1YWxzIG1ldGhvZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRlZCBwZXIgQVBJIGRvY3VtZW50YXRpb24gb2Yge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkjaGFzaENvZGUoKX0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3VpdGFibGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRLZXkoKSA9PSBudWxsID8gMCA6IGdldEtleSgpLmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG51bGwgPyAwIDogZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKTsgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0Fic3RyYWN0TWFwRW50cnlEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI2OGM0MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuS2V5VmFsdWU7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBiYXNlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gYmUKLSAqIGFkZGVkIHRvIGEge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgTWFwLkVudHJ5fS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjggJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXBFbnRyeURlY29yYXRvciBpbXBsZW1lbnRzIE1hcC5FbnRyeSwgS2V5VmFsdWUgewotICAgIAotICAgIC8qKiBUaGUgPGNvZGU+TWFwLkVudHJ5PC9jb2RlPiB0byBkZWNvcmF0ZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBNYXAuRW50cnkgZW50cnk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0TWFwRW50cnlEZWNvcmF0b3IoTWFwLkVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYXAgRW50cnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwLkVudHJ5IGdldE1hcEVudHJ5KCkgewotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBlbnRyeS5zZXRWYWx1ZShvYmplY3QpOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmVxdWFscyhvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBlbnRyeS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBlbnRyeS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0RlZmF1bHRLZXlWYWx1ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0RlZmF1bHRLZXlWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmE0ZmU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9EZWZhdWx0S2V5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmtleXZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5LZXlWYWx1ZTsKLQotLyoqCi0gKiBBIG11dGFibGUgPGNvZGU+S2V5VmFsdWU8L2NvZGU+IHBhaXIgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQKLSAqIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IE1hcC5FbnRyeX0uCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCBhIDxjb2RlPkRlZmF1bHRLZXlWYWx1ZTwvY29kZT4gaW5zdGFuY2UgbWF5IG5vdCBjb250YWluCi0gKiBpdHNlbGYgYXMgYSBrZXkgb3IgdmFsdWUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRLZXlWYWx1ZSBleHRlbmRzIEFic3RyYWN0S2V5VmFsdWUgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBwYWlyIHdpdGggYSBudWxsIGtleSBhbmQgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdEtleVZhbHVlKCkgewotICAgICAgICBzdXBlcihudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgZ2l2ZW4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IGZvciB0aGUgZW50cnksIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgZm9yIHRoZSBlbnRyeSwgbWF5IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdEtleVZhbHVlKGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlcihrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhaXIgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPktleVZhbHVlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWlyICB0aGUgcGFpciB0byBjb3B5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0S2V5VmFsdWUoZmluYWwgS2V5VmFsdWUgcGFpcikgewotICAgICAgICBzdXBlcihwYWlyLmdldEtleSgpLCBwYWlyLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgcGFpciBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+TWFwLkVudHJ5PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIGNvcHksIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBlbnRyeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRLZXlWYWx1ZShmaW5hbCBNYXAuRW50cnkgZW50cnkpIHsKLSAgICAgICAgc3VwZXIoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUgbmV3IGtleQotICAgICAqIEByZXR1cm4gdGhlIG9sZCBrZXkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBrZXkgaXMgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldEtleShmaW5hbCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gdGhpcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGVmYXVsdEtleVZhbHVlIG1heSBub3QgY29udGFpbiBpdHNlbGYgYXMgYSBrZXkuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBPYmplY3Qgb2xkID0gdGhpcy5rZXk7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgdmFsdWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHZhbHVlIGlzIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IHRoaXMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRlZmF1bHRLZXlWYWx1ZSBtYXkgbm90IGNvbnRhaW4gaXRzZWxmIGFzIGEgdmFsdWUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gb2JqZWN0IHdpdGgga2V5IGFuZCB2YWx1ZSBmcm9tIHRoaXMgcGFpci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgTWFwRW50cnkgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwLkVudHJ5IHRvTWFwRW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdE1hcEVudHJ5KHRoaXMpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gd2l0aCBhbm90aGVyIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wYXJlZCBvYmplY3QgaXMgYWxzbyBhIDxjb2RlPkRlZmF1bHRLZXlWYWx1ZTwvY29kZT4sCi0gICAgICogYW5kIGl0cyBrZXkgYW5kIHZhbHVlIGFyZSBlcXVhbCB0byB0aGlzIG9iamVjdCdzIGtleSBhbmQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIGtleSBhbmQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEZWZhdWx0S2V5VmFsdWUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIERlZmF1bHRLZXlWYWx1ZSBvdGhlciA9IChEZWZhdWx0S2V5VmFsdWUpIG9iajsKLSAgICAgICAgcmV0dXJuIAotICAgICAgICAgICAgKGdldEtleSgpID09IG51bGwgPyBvdGhlci5nZXRLZXkoKSA9PSBudWxsIDogZ2V0S2V5KCkuZXF1YWxzKG90aGVyLmdldEtleSgpKSkgJiYKLSAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG51bGwgPyBvdGhlci5nZXRWYWx1ZSgpID09IG51bGwgOiBnZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGhhc2hDb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgZXF1YWxzIG1ldGhvZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbXBsZW1lbnRlZCBwZXIgQVBJIGRvY3VtZW50YXRpb24gb2Yge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkjaGFzaENvZGUoKX0sCi0gICAgICogaG93ZXZlciBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdWl0YWJsZSBoYXNoIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gKGdldEtleSgpID09IG51bGwgPyAwIDogZ2V0S2V5KCkuaGFzaENvZGUoKSkgXgotICAgICAgICAgICAgICAgKGdldFZhbHVlKCkgPT0gbnVsbCA/IDAgOiBnZXRWYWx1ZSgpLmhhc2hDb2RlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0RlZmF1bHRNYXBFbnRyeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL0RlZmF1bHRNYXBFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzc0ODljLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9EZWZhdWx0TWFwRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLktleVZhbHVlOwotCi0vKioKLSAqIEEgcmVzdHJpY3RlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeX0gdGhhdCBwcmV2ZW50cwotICogdGhlIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gY29udHJhY3QgZnJvbSBiZWluZyBicm9rZW4uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI4ICQKLSAqIAotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQGF1dGhvciBNaWNoYWVsIEEuIFNtaXRoCi0gKiBAYXV0aG9yIE5laWwgTydUb29sZQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHRNYXBFbnRyeSBleHRlbmRzIEFic3RyYWN0TWFwRW50cnkgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBnaXZlbiB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgZm9yIHRoZSBlbnRyeSwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSBmb3IgdGhlIGVudHJ5LCBtYXkgYmUgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0TWFwRW50cnkoZmluYWwgT2JqZWN0IGtleSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPktleVZhbHVlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWlyICB0aGUgcGFpciB0byBjb3B5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0TWFwRW50cnkoZmluYWwgS2V5VmFsdWUgcGFpcikgewotICAgICAgICBzdXBlcihwYWlyLmdldEtleSgpLCBwYWlyLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBjb3B5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0TWFwRW50cnkoZmluYWwgTWFwLkVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIHN1cGVyKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9NdWx0aUtleS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL011bHRpS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmODAwODYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL011bHRpS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKiAKLSAqIEEgPGNvZGU+TXVsdGlLZXk8L2NvZGU+IGFsbG93cyBtdWx0aXBsZSBtYXAga2V5cyB0byBiZSBtZXJnZWQgdG9nZXRoZXIuCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gd3JpdGUgY29kZSB0byBoYW5kbGUKLSAqIG1hcHMgb2YgbWFwcy4gQW4gZXhhbXBsZSBtaWdodCBiZSB0aGUgbmVlZCB0byBsb29rdXAgYSBmaWxlbmFtZSBieSAKLSAqIGtleSBhbmQgbG9jYWxlLiBUaGUgdHlwaWNhbCBzb2x1dGlvbiBtaWdodCBiZSBuZXN0ZWQgbWFwcy4gVGhpcyBjbGFzcwotICogY2FuIGJlIHVzZWQgaW5zdGVhZCBieSBjcmVhdGluZyBhbiBpbnN0YW5jZSBwYXNzaW5nIGluIHRoZSBrZXkgYW5kIGxvY2FsZS4KLSAqIDxwPgotICogRXhhbXBsZSB1c2FnZToKLSAqIDxwcmU+Ci0gKiAvLyBwb3B1bGF0ZSBtYXAgd2l0aCBkYXRhIG1hcHBpbmcga2V5K2xvY2FsZSB0byBsb2NhbGl6ZWRUZXh0Ci0gKiBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAqIE11bHRpS2V5IG11bHRpS2V5ID0gbmV3IE11bHRpS2V5KGtleSwgbG9jYWxlKTsKLSAqIG1hcC5wdXQobXVsdGlLZXksIGxvY2FsaXplZFRleHQpOwotICoKLSAqIC8vIGxhdGVyIHJldGlyZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotICogTXVsdGlLZXkgbXVsdGlLZXkgPSBuZXcgTXVsdGlLZXkoa2V5LCBsb2NhbGUpOwotICogU3RyaW5nIGxvY2FsaXplZFRleHQgPSAoU3RyaW5nKSBtYXAuZ2V0KG11bHRpS2V5KTsKLSAqIDwvcHJlPgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjkgJAotICogCi0gKiBAYXV0aG9yIEhvd2FyZCBMZXdpcyBTaGlwCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlLZXkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIC8vIFRoaXMgY2xhc3MgY291bGQgaW1wbGVtZW50IExpc3QsIGJ1dCB0aGF0IHdvdWxkIGNvbmZ1c2UgaXQncyBwdXJwb3NlCi0KLSAgICAvKiogU2VyaWFsaXNhdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDQ2NTQ0ODYwNzQxNTc4ODgwNUw7Ci0KLSAgICAvKiogVGhlIGluZGl2aWR1YWwga2V5cyAqLwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10ga2V5czsKLSAgICAvKiogVGhlIGNhY2hlZCBoYXNoQ29kZSAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGhhc2hDb2RlOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRha2luZyB0d28ga2V5cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUga2V5cyBzaG91bGQgYmUgaW1tdXRhYmxlCi0gICAgICogSWYgdGhleSBhcmUgbm90IHRoZW4gdGhleSBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGFkZGluZyB0byB0aGUgTXVsdGlLZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlLZXkoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyKSB7Ci0gICAgICAgIHRoaXMobmV3IE9iamVjdFtdIHtrZXkxLCBrZXkyfSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgdGhyZWUga2V5cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUga2V5cyBzaG91bGQgYmUgaW1tdXRhYmxlCi0gICAgICogSWYgdGhleSBhcmUgbm90IHRoZW4gdGhleSBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGFkZGluZyB0byB0aGUgTXVsdGlLZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aUtleShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzKSB7Ci0gICAgICAgIHRoaXMobmV3IE9iamVjdFtdIHtrZXkxLCBrZXkyLCBrZXkzfSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgZm91ciBrZXlzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBrZXlzIHNob3VsZCBiZSBpbW11dGFibGUKLSAgICAgKiBJZiB0aGV5IGFyZSBub3QgdGhlbiB0aGV5IG11c3Qgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgYWRkaW5nIHRvIHRoZSBNdWx0aUtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICovCi0gICAgcHVibGljIE11bHRpS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMsIE9iamVjdCBrZXk0KSB7Ci0gICAgICAgIHRoaXMobmV3IE9iamVjdFtdIHtrZXkxLCBrZXkyLCBrZXkzLCBrZXk0fSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgZml2ZSBrZXlzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBrZXlzIHNob3VsZCBiZSBpbW11dGFibGUKLSAgICAgKiBJZiB0aGV5IGFyZSBub3QgdGhlbiB0aGV5IG11c3Qgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgYWRkaW5nIHRvIHRoZSBNdWx0aUtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHBhcmFtIGtleTUgIHRoZSBmaWZ0aCBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlLZXkoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQsIE9iamVjdCBrZXk1KSB7Ci0gICAgICAgIHRoaXMobmV3IE9iamVjdFtdIHtrZXkxLCBrZXkyLCBrZXkzLCBrZXk0LCBrZXk1fSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYW4gYXJyYXkgb2Yga2V5cyB3aGljaCBpcyBjbG9uZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGtleXMgc2hvdWxkIGJlIGltbXV0YWJsZQotICAgICAqIElmIHRoZXkgYXJlIG5vdCB0aGVuIHRoZXkgbXVzdCBub3QgYmUgY2hhbmdlZCBhZnRlciBhZGRpbmcgdG8gdGhlIE11bHRpS2V5LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byA8Y29kZT5uZXcgTXVsdGlLZXkoa2V5cywgdHJ1ZSk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleXMgIHRoZSBhcnJheSBvZiBrZXlzLCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBrZXkgYXJyYXkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aUtleShPYmplY3RbXSBrZXlzKSB7Ci0gICAgICAgIHRoaXMoa2V5cywgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRha2luZyBhbiBhcnJheSBvZiBrZXlzLCBvcHRpb25hbGx5IGNob29zaW5nIHdoZXRoZXIgdG8gY2xvbmUuCi0gICAgICogPHA+Ci0gICAgICogPGI+SWYgdGhlIGFycmF5IGlzIG5vdCBjbG9uZWQsIHRoZW4gaXQgbXVzdCBub3QgYmUgbW9kaWZpZWQuPC9iPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHB1YmxpYyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBvbmx5LCB0byBhdm9pZCBhIGNsb25lLgotICAgICAqIFRoZSBoYXNoY29kZSBpcyBjYWxjdWxhdGVkIG9uY2UgaGVyZSBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiBUaGVyZWZvcmUsIGNoYW5naW5nIHRoZSBhcnJheSBwYXNzZWQgaW4gd291bGQgbm90IGNoYW5nZSB0aGUgaGFzaGNvZGUgYnV0Ci0gICAgICogd291bGQgY2hhbmdlIHRoZSBlcXVhbHMgbWV0aG9kLCB3aGljaCBpcyBhIGJ1Zy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHRoZSBvbmx5IGZ1bGx5IHNhZmUgdXNhZ2Ugb2YgdGhpcyBjb25zdHJ1Y3RvciwgYXMgdGhlIG9iamVjdCBhcnJheQotICAgICAqIGlzIG5ldmVyIG1hZGUgYXZhaWxhYmxlIGluIGEgdmFyaWFibGU6Ci0gICAgICogPHByZT4KLSAgICAgKiBuZXcgTXVsdGlLZXkobmV3IE9iamVjdFtdIHsuLi59LCBmYWxzZSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGtleXMgc2hvdWxkIGJlIGltbXV0YWJsZQotICAgICAqIElmIHRoZXkgYXJlIG5vdCB0aGVuIHRoZXkgbXVzdCBub3QgYmUgY2hhbmdlZCBhZnRlciBhZGRpbmcgdG8gdGhlIE11bHRpS2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleXMgIHRoZSBhcnJheSBvZiBrZXlzLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBtYWtlQ2xvbmUgIHRydWUgdG8gY2xvbmUgdGhlIGFycmF5LCBmYWxzZSB0byBhc3NpZ24gaXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUga2V5IGFycmF5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlLZXkoT2JqZWN0W10ga2V5cywgYm9vbGVhbiBtYWtlQ2xvbmUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFycmF5IG9mIGtleXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWtlQ2xvbmUpIHsKLSAgICAgICAgICAgIHRoaXMua2V5cyA9IChPYmplY3RbXSkga2V5cy5jbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5rZXlzID0ga2V5czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoa2V5c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG90YWwgXj0ga2V5c1tpXS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGhhc2hDb2RlID0gdG90YWw7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY2xvbmUgb2YgdGhlIGFycmF5IG9mIGtleXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGtleXMgc2hvdWxkIGJlIGltbXV0YWJsZQotICAgICAqIElmIHRoZXkgYXJlIG5vdCB0aGVuIHRoZXkgbXVzdCBub3QgYmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRpdmlkdWFsIGtleXMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0S2V5cygpIHsKLSAgICAgICAgcmV0dXJuIChPYmplY3RbXSkga2V5cy5jbG9uZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUga2V5IHNob3VsZCBiZSBpbW11dGFibGUuCi0gICAgICogSWYgaXQgaXMgbm90IHRoZW4gaXQgbXVzdCBub3QgYmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIGtleSBhdCB0aGUgaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGtleXNbaW5kZXhdOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBsaXN0IG9mIGtleXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGlzdCBvZiBrZXlzCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byBhbm90aGVyLgotICAgICAqIDxwPgotICAgICAqIFRvIGJlIGVxdWFsLCB0aGUgb3RoZXIgb2JqZWN0IG11c3QgYmUgYSA8Y29kZT5NdWx0aUtleTwvY29kZT4gd2l0aCB0aGUKLSAgICAgKiBzYW1lIG51bWJlciBvZiBrZXlzIHdoaWNoIGFyZSBhbHNvIGVxdWFsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdGhlciAgdGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgTXVsdGlLZXkpIHsKLSAgICAgICAgICAgIE11bHRpS2V5IG90aGVyTXVsdGkgPSAoTXVsdGlLZXkpIG90aGVyOwotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoa2V5cywgb3RoZXJNdWx0aS5rZXlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29tYmluZWQgaGFzaCBjb2RlIHRoYXQgaXMgY29tcHV0ZWQgZnJvbSBhbGwgdGhlIGtleXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBvbmNlIGFuZCB0aGVuIGNhY2hlZCwgc28gZWxlbWVudHMgc2hvdWxkIG5vdAotICAgICAqIGNoYW5nZSB0aGVpciBoYXNoIGNvZGVzIG9uY2UgY3JlYXRlZCAobm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgCi0gICAgICogY29uc3RyYWludCB0aGF0IHdvdWxkIGJlIHVzZWQgaWYgdGhlIGluZGl2aWR1YWwga2V5cyBlbGVtZW50cyB3ZXJlCi0gICAgICogdGhlbXNlbHZlcyB7QGxpbmsgamF2YS51dGlsLk1hcCBNYXB9IGtleXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBkZWJ1Z2dpbmcgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGtleS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgZGVidWdnaW5nIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiTXVsdGlLZXkiICsgQXJyYXlzLmFzTGlzdChrZXlzKS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL1RpZWRNYXBFbnRyeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL1RpZWRNYXBFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzczYmQ0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9UaWVkTWFwRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmtleXZhbHVlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5LZXlWYWx1ZTsKLQotLyoqCi0gKiBBIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IE1hcC5FbnRyeX0gdGllZCB0byBhIG1hcCB1bmRlcm5lYXRoLgotICogPHA+Ci0gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBhIG1hcCBlbnRyeSB0byBtYWtlIGNoYW5nZXMgb24gdGhlIHVuZGVybHlpbmcKLSAqIG1hcCwgaG93ZXZlciB0aGlzIHdpbGwgcHJvYmFibHkgbWVzcyB1cCBhbnkgaXRlcmF0b3JzLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWVkTWFwRW50cnkgaW1wbGVtZW50cyBNYXAuRW50cnksIEtleVZhbHVlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLyAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODQ1Mzg2OTM2MTM3MzgzMTIwNUw7Ci0KLSAgICAvKiogVGhlIG1hcCB1bmRlcmx5aW5nIHRoZSBlbnRyeS9pdGVyYXRvciAqLyAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcCBtYXA7Ci0gICAgLyoqIFRoZSBrZXkgKi8KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBrZXk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5IHdpdGggdGhlIGdpdmVuIE1hcCBhbmQga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgVGllZE1hcEVudHJ5KE1hcCBtYXAsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5tYXAgPSBtYXA7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIC8vIE1hcC5FbnRyeSBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkgb2YgdGhpcyBlbnRyeQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoaXMgZW50cnkgZGlyZWN0IGZyb20gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgZGlyZWN0IG9udG8gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgc2V0IHRvIHRoaXMgbWFwIGVudHJ5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IHRoaXMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzZXQgdmFsdWUgdG8gdGhpcyBtYXAgZW50cnkiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4gd2l0aCBhbm90aGVyIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogSW1wbGVtZW50ZWQgcGVyIEFQSSBkb2N1bWVudGF0aW9uIG9mIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5I2VxdWFscyhPYmplY3QpfQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0bwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCBrZXkgYW5kIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwLkVudHJ5IG90aGVyID0gKE1hcC5FbnRyeSkgb2JqOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChrZXkgPT0gbnVsbCA/IG90aGVyLmdldEtleSgpID09IG51bGwgOiBrZXkuZXF1YWxzKG90aGVyLmdldEtleSgpKSkgJiYKLSAgICAgICAgICAgICh2YWx1ZSA9PSBudWxsID8gb3RoZXIuZ2V0VmFsdWUoKSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKG90aGVyLmdldFZhbHVlKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgaGFzaENvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBlcXVhbHMgbWV0aG9kLgotICAgICAqIDxwPgotICAgICAqIEltcGxlbWVudGVkIHBlciBBUEkgZG9jdW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSNoYXNoQ29kZSgpfQotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdWl0YWJsZSBoYXNoIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gKGdldEtleSgpID09IG51bGwgPyAwIDogZ2V0S2V5KCkuaGFzaENvZGUoKSkgXgotICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZW50cnkuCi0gICAgICogCi0gICAgICogQHJldHVybiBlbnRyeSBhcyBhIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKSArICI9IiArIGdldFZhbHVlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMva2V5dmFsdWUvVW5tb2RpZmlhYmxlTWFwRW50cnkuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9Vbm1vZGlmaWFibGVNYXBFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMzk5ZTBiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9Vbm1vZGlmaWFibGVNYXBFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuS2V5VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZTsKLQotLyoqCi0gKiBBIHtAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IE1hcC5FbnRyeX0gdGhhdCB0aHJvd3MKLSAqIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHdoZW4gPGNvZGU+c2V0VmFsdWU8L2NvZGU+IGlzIGNhbGxlZC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjggJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlTWFwRW50cnkgZXh0ZW5kcyBBYnN0cmFjdE1hcEVudHJ5IGltcGxlbWVudHMgVW5tb2RpZmlhYmxlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgZ2l2ZW4gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IGZvciB0aGUgZW50cnksIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgZm9yIHRoZSBlbnRyeSwgbWF5IGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5tb2RpZmlhYmxlTWFwRW50cnkoZmluYWwgT2JqZWN0IGtleSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW50cnkgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPktleVZhbHVlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWlyICB0aGUgcGFpciB0byBjb3B5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBVbm1vZGlmaWFibGVNYXBFbnRyeShmaW5hbCBLZXlWYWx1ZSBwYWlyKSB7Ci0gICAgICAgIHN1cGVyKHBhaXIuZ2V0S2V5KCksIHBhaXIuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbnRyeSBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+TWFwLkVudHJ5PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIGNvcHksIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBlbnRyeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIFVubW9kaWZpYWJsZU1hcEVudHJ5KGZpbmFsIE1hcC5FbnRyeSBlbnRyeSkgewotICAgICAgICBzdXBlcihlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIG5ldyB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNldFZhbHVlKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9rZXl2YWx1ZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMjE4YWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2tleXZhbHVlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0gJElkOiBwYWNrYWdlLmh0bWwsdiAxLjEgMjAwOS8wNS8yNyAyMjoxNjoyOSBtcGFya2VyIEV4cCAkIC0tPgotIDwhLS0KLSAgIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPEJPRFk+Ci08cD4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY29sbGVjdGlvbiBhbmQgbWFwIHJlbGF0ZWQga2V5L3ZhbHVlIGNsYXNzZXMuCi1UaGVzZSBhcmUgdXN1YWxseSB1c2VkIGluIG1hcHMsIGhvd2V2ZXIgdGhleSBjYW4gYmUgdXNlZCBhcyBkYXRhIGhvbGRlcnMgaW4gYW55IGNvbGxlY3Rpb24uCi08cD4KLVRoZSBmb2xsb3dpbmcga2V5L3ZhbHVlIGRlc2lnbnMgYXJlIGluY2x1ZGVkOgotPHVsPgotPGxpPk1hcCBFbnRyeSAtIHZhcmlvdXMgbWFwIGVudHJ5IGltcGxlbWVudGF0aW9ucwotPGxpPktleVZhbHVlIC0gYSBrZXkgYW5kIHZhbHVlIHBhaXIsIHdpdGhvdXQgbWFwIGVudHJ5IHNlbWFudGljcwotPGxpPk11bHRpS2V5IC0gYSBob2xkZXIgb2YgbXVsdGlwbGUga2V5cyB0aWVkIHRvZ2V0aGVyCi08L3VsPgotPC9wcmU+Ci08L0JPRFk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9BYnN0cmFjdExpbmtlZExpc3QuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlua2VkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2FhOGFmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlua2VkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkSXRlcmF0b3I7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBsaW5rZWQgbGlzdCB3aGljaCBwcm92aWRlcyBudW1lcm91cyBwb2ludHMgZm9yCi0gKiBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlLgotICogPHA+Ci0gKiBPdmVycmlkYWJsZSBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIHN0b3JhZ2Ugbm9kZSBhbmQgdG8gY2hhbmdlIGhvdwotICogbm9kZXMgYXJlIGFkZGVkIHRvIGFuZCByZW1vdmVkLiBIb3BlZnVsbHksIGFsbCB5b3UgbmVlZCBmb3IgdW51c3VhbCBzdWJjbGFzc2VzCi0gKiBpcyBoZXJlLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICoKLSAqIEBhdXRob3IgUmljaCBEb3VnaGVydHkKLSAqIEBhdXRob3IgUGhpbCBTdGVpdHoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpbmtlZExpc3QgaW1wbGVtZW50cyBMaXN0IHsKLQotICAgIC8qCi0gICAgICogSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0gICAgICogLSBhIHN0YW5kYXJkIGNpcmN1bGFyIGRvdWJseS1saW5rZWQgbGlzdAotICAgICAqIC0gYSBtYXJrZXIgbm9kZSBpcyBzdG9yZWQgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgICAgKiAtIG5vZGUgY3JlYXRpb24gYW5kIHJlbW92YWwgYWx3YXlzIG9jY3VycyB0aHJvdWdoIGNyZWF0ZU5vZGUoKSBhbmQKLSAgICAgKiAgIHJlbW92ZU5vZGUoKS4KLSAgICAgKiAtIGEgbW9kaWZpY2F0aW9uIGNvdW50IGlzIGtlcHQsIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzCi0gICAgICoge0BsaW5rIGphdmEudXRpbC5MaW5rZWRMaXN0fS4KLSAgICAgKiAtIHJlc3BlY3RzIHtAbGluayBBYnN0cmFjdExpc3QjbW9kQ291bnR9Ci0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBBIHtAbGluayBOb2RlfSB3aGljaCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGxpc3QgYW5kIGRvZXMgbm90Ci0gICAgICogaG9sZCBhIHZhbHVlLiBUaGUgdmFsdWUgb2YgPGNvZGU+bmV4dDwvY29kZT4gaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlCi0gICAgICogbGlzdC4gVGhlIHZhbHVlIG9mIG9mIDxjb2RlPnByZXZpb3VzPC9jb2RlPiBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTm9kZSBoZWFkZXI7Ci0gICAgLyoqIFRoZSBzaXplIG9mIHRoZSBsaXN0ICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgc2l6ZTsKLSAgICAvKiogTW9kaWZpY2F0aW9uIGNvdW50IGZvciBpdGVyYXRvcnMgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBtb2RDb3VudDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3RoaW5nIGludGVuZGVkIGZvciBkZXNlcmlhbGl6YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IGEgc2VyaWFsaXphYmxlIHN1YmNsYXNzIHRoZW4gdGhlIGluaXQoKQotICAgICAqIG1ldGhvZCBtdXN0IGJlIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMaW5rZWRMaXN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBsaXN0IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gY29weQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdExpbmtlZExpc3QoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgYWRkQWxsKGNvbGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBlcXVpdmFsZW50IG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYnJva2VuIG91dCBzbyBpdCBjYW4gYmUgY2FsbGVkCi0gICAgICogYnkgYW55IGNvbnN0cnVjdG9yIGFuZCBieSA8Y29kZT5yZWFkT2JqZWN0PC9jb2RlPi4KLSAgICAgKiBTdWJjbGFzc2VzIHdoaWNoIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHNob3VsZCBtYWtlIHN1cmUgdGhleSBjYWxsIHN1cGVyLAotICAgICAqIHNvIHRoZSBsaXN0IGlzIGluaXRpYWxpc2VkIHByb3Blcmx5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGhlYWRlciA9IGNyZWF0ZUhlYWRlck5vZGUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gKHNpemUoKSA9PSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShpbmRleCwgZmFsc2UpOwotICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0SXRlcmF0b3IodGhpcywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGZyb21JbmRleCkgewotICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3RJdGVyYXRvcih0aGlzLCBmcm9tSW5kZXgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChOb2RlIG5vZGUgPSBoZWFkZXIubmV4dDsgbm9kZSAhPSBoZWFkZXI7IG5vZGUgPSBub2RlLm5leHQpIHsKLSAgICAgICAgICAgIGlmIChpc0VxdWFsVmFsdWUobm9kZS5nZXRWYWx1ZSgpLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW50IGkgPSBzaXplIC0gMTsKLSAgICAgICAgZm9yIChOb2RlIG5vZGUgPSBoZWFkZXIucHJldmlvdXM7IG5vZGUgIT0gaGVhZGVyOyBub2RlID0gbm9kZS5wcmV2aW91cykgewotICAgICAgICAgICAgaWYgKGlzRXF1YWxWYWx1ZShub2RlLmdldFZhbHVlKCksIHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4T2YodmFsdWUpICE9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKGNvbnRhaW5zKGl0Lm5leHQoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIHRvQXJyYXkobmV3IE9iamVjdFtzaXplXSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgLy8gRXh0ZW5kIHRoZSBhcnJheSBpZiBuZWVkZWQKLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA8IHNpemUpIHsKLSAgICAgICAgICAgIENsYXNzIGNvbXBvbmVudFR5cGUgPSBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDb3B5IHRoZSB2YWx1ZXMgaW50byB0aGUgYXJyYXkKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGhlYWRlci5uZXh0OyBub2RlICE9IGhlYWRlcjsgbm9kZSA9IG5vZGUubmV4dCwgaSsrKSB7Ci0gICAgICAgICAgICBhcnJheVtpXSA9IG5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgdGhlIHZhbHVlIGFmdGVyIHRoZSBsYXN0IHZhbHVlIHRvIG51bGwKLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgIGFycmF5W3NpemVdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN1Ymxpc3Qgb2YgdGhlIG1haW4gbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbUluZGV4SW5jbHVzaXZlICB0aGUgaW5kZXggdG8gc3RhcnQgZnJvbQotICAgICAqIEBwYXJhbSB0b0luZGV4RXhjbHVzaXZlICB0aGUgaW5kZXggdG8gZW5kIGF0Ci0gICAgICogQHJldHVybiB0aGUgbmV3IHN1Ymxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXhJbmNsdXNpdmUsIGludCB0b0luZGV4RXhjbHVzaXZlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlua2VkU3ViTGlzdCh0aGlzLCBmcm9tSW5kZXhJbmNsdXNpdmUsIHRvSW5kZXhFeGNsdXNpdmUpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBhZGRMYXN0KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKGluZGV4LCB0cnVlKTsKLSAgICAgICAgYWRkTm9kZUJlZm9yZShub2RlLCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIGFkZEFsbChzaXplLCBjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShpbmRleCwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gY29sbC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGFkZE5vZGVCZWZvcmUobm9kZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZShpbmRleCwgZmFsc2UpOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBub2RlLmdldFZhbHVlKCk7Ci0gICAgICAgIHJlbW92ZU5vZGUobm9kZSk7Ci0gICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGZvciAoTm9kZSBub2RlID0gaGVhZGVyLm5leHQ7IG5vZGUgIT0gaGVhZGVyOyBub2RlID0gbm9kZS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoaXNFcXVhbFZhbHVlKG5vZGUuZ2V0VmFsdWUoKSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShub2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKGNvbGwuY29udGFpbnMoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChjb2xsLmNvbnRhaW5zKGl0Lm5leHQoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGlmaWVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoaW5kZXgsIGZhbHNlKTsKLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICB1cGRhdGVOb2RlKG5vZGUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICByZW1vdmVBbGxOb2RlcygpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXRGaXJzdCgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gaGVhZGVyLm5leHQ7Ci0gICAgICAgIGlmIChub2RlID09IGhlYWRlcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdCgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gaGVhZGVyLnByZXZpb3VzOwotICAgICAgICBpZiAobm9kZSA9PSBoZWFkZXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRGaXJzdChPYmplY3QgbykgewotICAgICAgICBhZGROb2RlQWZ0ZXIoaGVhZGVyLCBvKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkTGFzdChPYmplY3QgbykgewotICAgICAgICBhZGROb2RlQmVmb3JlKGhlYWRlciwgbyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlRmlyc3QoKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGhlYWRlci5uZXh0OwotICAgICAgICBpZiAobm9kZSA9PSBoZWFkZXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICByZW1vdmVOb2RlKG5vZGUpOwotICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmVMYXN0KCkgewotICAgICAgICBOb2RlIG5vZGUgPSBoZWFkZXIucHJldmlvdXM7Ci0gICAgICAgIGlmIChub2RlID09IGhlYWRlcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBub2RlLmdldFZhbHVlKCk7Ci0gICAgICAgIHJlbW92ZU5vZGUobm9kZSk7Ci0gICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIExpc3Qgb3RoZXIgPSAoTGlzdCkgb2JqOwotICAgICAgICBpZiAob3RoZXIuc2l6ZSgpICE9IHNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIExpc3RJdGVyYXRvciBpdDEgPSBsaXN0SXRlcmF0b3IoKTsKLSAgICAgICAgTGlzdEl0ZXJhdG9yIGl0MiA9IG90aGVyLmxpc3RJdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSAmJiBpdDIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbzEgPSBpdDEubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IG8yID0gaXQyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghKG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhKGl0MS5oYXNOZXh0KCkgfHwgaXQyLmhhc05leHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gMTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgKG9iaiA9PSBudWxsID8gMCA6IG9iai5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKHNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIltdIjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigxNiAqIHNpemUoKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlsiKTsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzTmV4dCA9IGl0Lmhhc05leHQoKTsKLSAgICAgICAgd2hpbGUgKGhhc05leHQpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUgPT0gdGhpcyA/ICIodGhpcyBDb2xsZWN0aW9uKSIgOiB2YWx1ZSk7Ci0gICAgICAgICAgICBoYXNOZXh0ID0gaXQuaGFzTmV4dCgpOwotICAgICAgICAgICAgaWYgKGhhc05leHQpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gdmFsdWVzIGZvciBlcXVhbHMuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBlcXVhbHMgbWV0aG9kLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gbWF0Y2ggZGlmZmVyZW50bHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlMSAgdGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlMiAgdGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlLCBtYXkgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxWYWx1ZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0gICAgICAgIHJldHVybiAodmFsdWUxID09IHZhbHVlMiB8fCAodmFsdWUxID09IG51bGwgPyBmYWxzZSA6IHZhbHVlMS5lcXVhbHModmFsdWUyKSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBub2RlIHdpdGggYSBuZXcgdmFsdWUuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSB2YWx1ZSBvbiB0aGUgbm9kZS4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHJlY29yZCB0aGUgY2hhbmdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlICBub2RlIHRvIHVwZGF0ZQotICAgICAqIEBwYXJhbSB2YWx1ZSAgbmV3IHZhbHVlIG9mIHRoZSBub2RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTm9kZShOb2RlIG5vZGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBub2RlLnNldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG5vZGUgd2l0aCBwcmV2aW91cywgbmV4dCBhbmQgZWxlbWVudCBhbGwgc2V0IHRvIG51bGwuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEgbmV3IGVtcHR5IE5vZGUuCi0gICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgYSBkaWZmZXJlbnQgY2xhc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiAgbmV3bHkgY3JlYXRlZCBub2RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGUgY3JlYXRlSGVhZGVyTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIG5ldyBOb2RlIHdpdGggZGF0YS4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGNyZWF0ZSBhIGRpZmZlcmVudCBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHZhbHVlIG9mIHRoZSBuZXcgbm9kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBOb2RlIGNyZWF0ZU5vZGUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXMgaXRzIAotICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPiBhbmQgaW5zZXJ0cyBpdCBiZWZvcmUgPGNvZGU+bm9kZTwvY29kZT4uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHtAbGluayAjY3JlYXRlTm9kZShPYmplY3QpfSBhbmQKLSAgICAgKiB7QGxpbmsgI2FkZE5vZGUoQWJzdHJhY3RMaW5rZWRMaXN0Lk5vZGUsQWJzdHJhY3RMaW5rZWRMaXN0Lk5vZGUpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlICBub2RlIHRvIGluc2VydCBiZWZvcmUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHZhbHVlIG9mIHRoZSBuZXdseSBhZGRlZCBub2RlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5ub2RlPC9jb2RlPiBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUJlZm9yZShOb2RlIG5vZGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBOb2RlIG5ld05vZGUgPSBjcmVhdGVOb2RlKHZhbHVlKTsKLSAgICAgICAgYWRkTm9kZShuZXdOb2RlLCBub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcyBpdHMgCi0gICAgICogPGNvZGU+dmFsdWU8L2NvZGU+IGFuZCBpbnNlcnRzIGl0IGFmdGVyIDxjb2RlPm5vZGU8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB7QGxpbmsgI2NyZWF0ZU5vZGUoT2JqZWN0KX0gYW5kCi0gICAgICoge0BsaW5rICNhZGROb2RlKEFic3RyYWN0TGlua2VkTGlzdC5Ob2RlLEFic3RyYWN0TGlua2VkTGlzdC5Ob2RlKX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUgIG5vZGUgdG8gaW5zZXJ0IGFmdGVyCi0gICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSBvZiB0aGUgbmV3bHkgYWRkZWQgbm9kZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZE5vZGVBZnRlcihOb2RlIG5vZGUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBOb2RlIG5ld05vZGUgPSBjcmVhdGVOb2RlKHZhbHVlKTsKLSAgICAgICAgYWRkTm9kZShuZXdOb2RlLCBub2RlLm5leHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgYSBuZXcgbm9kZSBpbnRvIHRoZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGVUb0luc2VydCAgbmV3IG5vZGUgdG8gaW5zZXJ0Ci0gICAgICogQHBhcmFtIGluc2VydEJlZm9yZU5vZGUgIG5vZGUgdG8gaW5zZXJ0IGJlZm9yZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIG5vZGUgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZE5vZGUoTm9kZSBub2RlVG9JbnNlcnQsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSkgewotICAgICAgICBub2RlVG9JbnNlcnQubmV4dCA9IGluc2VydEJlZm9yZU5vZGU7Ci0gICAgICAgIG5vZGVUb0luc2VydC5wcmV2aW91cyA9IGluc2VydEJlZm9yZU5vZGUucHJldmlvdXM7Ci0gICAgICAgIGluc2VydEJlZm9yZU5vZGUucHJldmlvdXMubmV4dCA9IG5vZGVUb0luc2VydDsKLSAgICAgICAgaW5zZXJ0QmVmb3JlTm9kZS5wcmV2aW91cyA9IG5vZGVUb0luc2VydDsKLSAgICAgICAgc2l6ZSsrOwotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gdGhlIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSAgdGhlIG5vZGUgdG8gcmVtb3ZlCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5ub2RlPC9jb2RlPiBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZShOb2RlIG5vZGUpIHsKLSAgICAgICAgbm9kZS5wcmV2aW91cy5uZXh0ID0gbm9kZS5uZXh0OwotICAgICAgICBub2RlLm5leHQucHJldmlvdXMgPSBub2RlLnByZXZpb3VzOwotICAgICAgICBzaXplLS07Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbm9kZXMgYnkgcmVzZXR0aW5nIHRoZSBjaXJjdWxhciBsaXN0IG1hcmtlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxOb2RlcygpIHsKLSAgICAgICAgaGVhZGVyLm5leHQgPSBoZWFkZXI7Ci0gICAgICAgIGhlYWRlci5wcmV2aW91cyA9IGhlYWRlcjsKLSAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbm9kZSBhdCBhIHBhcnRpY3VsYXIgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXgsIHN0YXJ0aW5nIGZyb20gMAotICAgICAqIEBwYXJhbSBlbmRNYXJrZXJBbGxvd2VkICB3aGV0aGVyIG9yIG5vdCB0aGUgZW5kIG1hcmtlciBjYW4gYmUgcmV0dXJuZWQgaWYKLSAgICAgKiBzdGFydEluZGV4IGlzIHNldCB0byB0aGUgbGlzdCdzIHNpemUKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGxlc3MgdGhhbiAwOyBlcXVhbCB0bwotICAgICAqIHRoZSBzaXplIG9mIHRoZSBsaXN0IGFuZCBlbmRNYWtlckFsbG93ZWQgaXMgZmFsc2U7IG9yIGdyZWF0ZXIgdGhhbiB0aGUKLSAgICAgKiBzaXplIG9mIHRoZSBsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZShpbnQgaW5kZXgsIGJvb2xlYW4gZW5kTWFya2VyQWxsb3dlZCkgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewotICAgICAgICAvLyBDaGVjayB0aGUgaW5kZXggaXMgd2l0aGluIHRoZSBib3VuZHMKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkNvdWxkbid0IGdldCB0aGUgbm9kZTogIiArCi0gICAgICAgICAgICAgICAgICAgICJpbmRleCAoIiArIGluZGV4ICsgIikgbGVzcyB0aGFuIHplcm8uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFlbmRNYXJrZXJBbGxvd2VkICYmIGluZGV4ID09IHNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJDb3VsZG4ndCBnZXQgdGhlIG5vZGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAiaW5kZXggKCIgKyBpbmRleCArICIpIGlzIHRoZSBzaXplIG9mIHRoZSBsaXN0LiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA+IHNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJDb3VsZG4ndCBnZXQgdGhlIG5vZGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAiaW5kZXggKCIgKyBpbmRleCArICIpIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJsaXN0ICgiICsgc2l6ZSArICIpLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNlYXJjaCB0aGUgbGlzdCBhbmQgZ2V0IHRoZSBub2RlCi0gICAgICAgIE5vZGUgbm9kZTsKLSAgICAgICAgaWYgKGluZGV4IDwgKHNpemUgLyAyKSkgewotICAgICAgICAgICAgLy8gU2VhcmNoIGZvcndhcmRzCi0gICAgICAgICAgICBub2RlID0gaGVhZGVyLm5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBjdXJyZW50SW5kZXggPSAwOyBjdXJyZW50SW5kZXggPCBpbmRleDsgY3VycmVudEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2VhcmNoIGJhY2t3YXJkcwotICAgICAgICAgICAgbm9kZSA9IGhlYWRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGN1cnJlbnRJbmRleCA9IHNpemU7IGN1cnJlbnRJbmRleCA+IGluZGV4OyBjdXJyZW50SW5kZXgtLSkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGl0ZXJhdG9yIGZvciB0aGUgc3VibGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ViTGlzdCAgdGhlIHN1Ymxpc3QgdG8gZ2V0IGFuIGl0ZXJhdG9yIGZvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVTdWJMaXN0SXRlcmF0b3IoTGlua2VkU3ViTGlzdCBzdWJMaXN0KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTdWJMaXN0TGlzdEl0ZXJhdG9yKHN1Ykxpc3QsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3VibGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ViTGlzdCAgdGhlIHN1Ymxpc3QgdG8gZ2V0IGFuIGl0ZXJhdG9yIGZvcgotICAgICAqIEBwYXJhbSBmcm9tSW5kZXggIHRoZSBpbmRleCB0byBzdGFydCBmcm9tLCByZWxhdGl2ZSB0byB0aGUgc3VibGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0SXRlcmF0b3IgY3JlYXRlU3ViTGlzdExpc3RJdGVyYXRvcihMaW5rZWRTdWJMaXN0IHN1Ykxpc3QsIGludCBmcm9tSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRTdWJMaXN0SXRlcmF0b3Ioc3ViTGlzdCwgZnJvbUluZGV4KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyB0aGUgZGF0YSBoZWxkIGluIHRoaXMgb2JqZWN0IHRvIHRoZSBzdHJlYW0gc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBmaXJzdCBzZXJpYWxpemFibGUgc3ViY2xhc3MgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGZyb20KLSAgICAgKiA8Y29kZT53cml0ZU9iamVjdDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Xcml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBXcml0ZSB0aGUgc2l6ZSBzbyB3ZSBrbm93IGhvdyBtYW55IG5vZGVzIHRvIHJlYWQgYmFjawotICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGVJbnQoc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBpdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KGl0ci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBkYXRhIGhlbGQgaW4gdGhpcyBvYmplY3QgdG8gdGhlIHN0cmVhbSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZpcnN0IHNlcmlhbGl6YWJsZSBzdWJjbGFzcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgZnJvbQotICAgICAqIDxjb2RlPnJlYWRPYmplY3Q8L2NvZGU+LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvUmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBpbnQgc2l6ZSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGFkZChpbnB1dFN0cmVhbS5yZWFkT2JqZWN0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEEgbm9kZSB3aXRoaW4gdGhlIGxpbmtlZCBsaXN0LgotICAgICAqIDxwPgotICAgICAqIEZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEsIGFsbCBhY2Nlc3MgdG8gdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBwcm9wZXJ0eQotICAgICAqIGlzIHZpYSB0aGUgbWV0aG9kcyBvbiB0aGlzIGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTm9kZSB7Ci0KLSAgICAgICAgLyoqIEEgcG9pbnRlciB0byB0aGUgbm9kZSBiZWZvcmUgdGhpcyBub2RlICovCi0gICAgICAgIHByb3RlY3RlZCBOb2RlIHByZXZpb3VzOwotICAgICAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBub2RlIGFmdGVyIHRoaXMgbm9kZSAqLwotICAgICAgICBwcm90ZWN0ZWQgTm9kZSBuZXh0OwotICAgICAgICAvKiogVGhlIG9iamVjdCBjb250YWluZWQgd2l0aGluIHRoaXMgbm9kZSAqLwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGhlYWRlciBub2RlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIE5vZGUoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgcHJldmlvdXMgPSB0aGlzOwotICAgICAgICAgICAgbmV4dCA9IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc3RvcmUKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBOb2RlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwcmV2aW91cyAgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIGxpc3QKLSAgICAgICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IG5vZGUgaW4gdGhlIGxpc3QKLSAgICAgICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc3RvcmUKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBOb2RlKE5vZGUgcHJldmlvdXMsIE5vZGUgbmV4dCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwotICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICAgICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5vZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZQotICAgICAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJldmlvdXMgbm9kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIG5vZGUKLSAgICAgICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwcmV2aW91cyBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHByZXZpb3VzICB0aGUgcHJldmlvdXMgbm9kZQotICAgICAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFByZXZpb3VzTm9kZShOb2RlIHByZXZpb3VzKSB7Ci0gICAgICAgICAgICB0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBuZXh0IG5vZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IG5vZGUKLSAgICAgICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgTm9kZSBnZXROZXh0Tm9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbmV4dCBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IG5vZGUKLSAgICAgICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXROZXh0Tm9kZShOb2RlIG5leHQpIHsKLSAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQSBsaXN0IGl0ZXJhdG9yIG92ZXIgdGhlIGxpbmtlZCBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTGlua2VkTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yLCBPcmRlcmVkSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbGlzdCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RMaW5rZWRMaXN0IHBhcmVudDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5vZGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayAjbmV4dCgpfS4gSWYgdGhpcyBpcyBlcXVhbAotICAgICAgICAgKiB0byB7QGxpbmsgQWJzdHJhY3RMaW5rZWRMaXN0I2hlYWRlcn0gdGhlbiB0aGVyZSBhcmUgbm8gbW9yZSB2YWx1ZXMgdG8gcmV0dXJuLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIE5vZGUgbmV4dDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGluZGV4IG9mIHtAbGluayAjbmV4dH0uCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgaW50IG5leHRJbmRleDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyByZXR1cm5lZCBieSB7QGxpbmsgI25leHQoKX0gb3Ige0BsaW5rCi0gICAgICAgICAqICNwcmV2aW91cygpfS4gU2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IGlmIHtAbGluayAjbmV4dCgpfSBvciB7QGxpbmsKLSAgICAgICAgICogI3ByZXZpb3VzKCl9IGhhdmVuJ3QgYmVlbiBjYWxsZWQsIG9yIGlmIHRoZSBub2RlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAgICAgICogd2l0aCB7QGxpbmsgI3JlbW92ZSgpfSBvciBhIG5ldyBub2RlIGFkZGVkIHdpdGgge0BsaW5rICNhZGQoT2JqZWN0KX0uCi0gICAgICAgICAqIFNob3VsZCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHtAbGluayAjZ2V0TGFzdE5vZGVSZXR1cm5lZCgpfSB0byBlbmZvcmNlCi0gICAgICAgICAqIHRoaXMgYmVoYXZpb3VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIE5vZGUgY3VycmVudDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1vZGlmaWNhdGlvbiBjb3VudCB0aGF0IHRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGhhdmUuIElmIHRoZSBsaXN0Ci0gICAgICAgICAqIGRvZXNuJ3QgaGF2ZSB0aGlzIGNvdW50LCB0aGVuIGEKLSAgICAgICAgICoge0BsaW5rIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufSBtYXkgYmUgdGhyb3duIGJ5Ci0gICAgICAgICAqIHRoZSBvcGVyYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCBleHBlY3RlZE1vZENvdW50OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYSBMaXN0SXRlcmF0b3IgZm9yIGEgbGlzdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgbGlzdAotICAgICAgICAgKiBAcGFyYW0gZnJvbUluZGV4ICB0aGUgaW5kZXggdG8gc3RhcnQgYXQKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0SXRlcmF0b3IoQWJzdHJhY3RMaW5rZWRMaXN0IHBhcmVudCwgaW50IGZyb21JbmRleCkgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgdGhpcy5leHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICAgICAgdGhpcy5uZXh0ID0gcGFyZW50LmdldE5vZGUoZnJvbUluZGV4LCB0cnVlKTsKLSAgICAgICAgICAgIHRoaXMubmV4dEluZGV4ID0gZnJvbUluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrcyB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IG9mIHRoZSBsaXN0IGlzIHRoZSB2YWx1ZSB0aGF0IHRoaXMKLSAgICAgICAgICogb2JqZWN0IGV4cGVjdHMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gSWYgdGhlIGxpc3QncyBtb2RpZmljYXRpb24KLSAgICAgICAgICogY291bnQgaXNuJ3QgdGhlIHZhbHVlIHRoYXQgd2FzIGV4cGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2RDb3VudCgpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgbGFzdCBub2RlIHJldHVybmVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYge0BsaW5rICNuZXh0KCl9IG9yCi0gICAgICAgICAqIHtAbGluayAjcHJldmlvdXMoKX0gaGF2ZW4ndCBiZWVuIGNhbGxlZCwgb3IgaWYgdGhlIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZAotICAgICAgICAgKiB3aXRoIHtAbGluayAjcmVtb3ZlKCl9IG9yIGEgbmV3IG5vZGUgYWRkZWQgd2l0aCB7QGxpbmsgI2FkZChPYmplY3QpfS4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBOb2RlIGdldExhc3ROb2RlUmV0dXJuZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBwYXJlbnQuaGVhZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiTm8gZWxlbWVudCBhdCBpbmRleCAiICsgbmV4dEluZGV4ICsgIi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5leHQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKLSAgICAgICAgICAgIG5leHRJbmRleCsrOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dC5wcmV2aW91cyAhPSBwYXJlbnQuaGVhZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIGlmICghaGFzUHJldmlvdXMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJBbHJlYWR5IGF0IHN0YXJ0IG9mIGxpc3QuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0ID0gbmV4dC5wcmV2aW91czsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5leHQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgbmV4dEluZGV4LS07Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0gICAgICAgICAgICAvLyBub3Qgbm9ybWFsbHkgb3ZlcnJpZGRlbiwgYXMgcmVsYXRpdmUgdG8gbmV4dEluZGV4KCkKLSAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXgoKSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja01vZENvdW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlKCkgZm9sbG93aW5nIHByZXZpb3VzKCkKLSAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwotICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVOb2RlKGdldExhc3ROb2RlUmV0dXJuZWQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSgpIGZvbGxvd2luZyBuZXh0KCkKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlTm9kZShnZXRMYXN0Tm9kZVJldHVybmVkKCkpOwotICAgICAgICAgICAgICAgIG5leHRJbmRleC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG51bGw7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgZ2V0TGFzdE5vZGVSZXR1cm5lZCgpLnNldFZhbHVlKG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgcGFyZW50LmFkZE5vZGVCZWZvcmUobmV4dCwgb2JqKTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBudWxsOwotICAgICAgICAgICAgbmV4dEluZGV4Kys7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50Kys7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBIGxpc3QgaXRlcmF0b3Igb3ZlciB0aGUgbGlua2VkIHN1YiBsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTGlua2VkU3ViTGlzdEl0ZXJhdG9yIGV4dGVuZHMgTGlua2VkTGlzdEl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IGxpc3QgKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIExpbmtlZFN1Ykxpc3Qgc3ViOwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIExpbmtlZFN1Ykxpc3RJdGVyYXRvcihMaW5rZWRTdWJMaXN0IHN1YiwgaW50IHN0YXJ0SW5kZXgpIHsKLSAgICAgICAgICAgIHN1cGVyKHN1Yi5wYXJlbnQsIHN0YXJ0SW5kZXggKyBzdWIub2Zmc2V0KTsKLSAgICAgICAgICAgIHRoaXMuc3ViID0gc3ViOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEluZGV4KCkgPCBzdWIuc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiAocHJldmlvdXNJbmRleCgpID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHN1cGVyLm5leHRJbmRleCgpIC0gc3ViLm9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgc3VwZXIuYWRkKG9iaik7Ci0gICAgICAgICAgICBzdWIuZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgICAgIHN1Yi5zaXplKys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHN1cGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgc3ViLmV4cGVjdGVkTW9kQ291bnQgPSBwYXJlbnQubW9kQ291bnQ7Ci0gICAgICAgICAgICBzdWIuc2l6ZS0tOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUaGUgc3VibGlzdCBpbXBsZW1lbnRhdGlvbiBmb3IgQWJzdHJhY3RMaW5rZWRMaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTGlua2VkU3ViTGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdCB7Ci0gICAgICAgIC8qKiBUaGUgbWFpbiBsaXN0ICovCi0gICAgICAgIEFic3RyYWN0TGlua2VkTGlzdCBwYXJlbnQ7Ci0gICAgICAgIC8qKiBPZmZzZXQgZnJvbSB0aGUgbWFpbiBsaXN0ICovCi0gICAgICAgIGludCBvZmZzZXQ7Ci0gICAgICAgIC8qKiBTdWJsaXN0IHNpemUgKi8KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIC8qKiBTdWJsaXN0IG1vZENvdW50ICovCi0gICAgICAgIGludCBleHBlY3RlZE1vZENvdW50OwotCi0gICAgICAgIHByb3RlY3RlZCBMaW5rZWRTdWJMaXN0KEFic3RyYWN0TGlua2VkTGlzdCBwYXJlbnQsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0gICAgICAgICAgICBpZiAoZnJvbUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJmcm9tSW5kZXggPSAiICsgZnJvbUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0b0luZGV4ID4gcGFyZW50LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJ0b0luZGV4ID0gIiArIHRvSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZyb21JbmRleCA+IHRvSW5kZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9tSW5kZXgoIiArIGZyb21JbmRleCArICIpID4gdG9JbmRleCgiICsgdG9JbmRleCArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZnJvbUluZGV4OwotICAgICAgICAgICAgdGhpcy5zaXplID0gdG9JbmRleCAtIGZyb21JbmRleDsKLSAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByYW5nZUNoZWNrKGluZGV4LCBzaXplKTsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0KGluZGV4ICsgb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJhbmdlQ2hlY2soaW5kZXgsIHNpemUgKyAxKTsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHBhcmVudC5hZGQoaW5kZXggKyBvZmZzZXQsIG9iaik7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICAgICAgc2l6ZSsrOwotICAgICAgICAgICAgTGlua2VkU3ViTGlzdC50aGlzLm1vZENvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJhbmdlQ2hlY2soaW5kZXgsIHNpemUpOwotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHBhcmVudC5yZW1vdmUoaW5kZXggKyBvZmZzZXQpOwotICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgICAgIHNpemUtLTsKLSAgICAgICAgICAgIExpbmtlZFN1Ykxpc3QudGhpcy5tb2RDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRBbGwoc2l6ZSwgY29sbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgICAgIHJhbmdlQ2hlY2soaW5kZXgsIHNpemUgKyAxKTsKLSAgICAgICAgICAgIGludCBjU2l6ZSA9IGNvbGwuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKGNTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHBhcmVudC5hZGRBbGwob2Zmc2V0ICsgaW5kZXgsIGNvbGwpOwotICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgICAgIHNpemUgKz0gY1NpemU7Ci0gICAgICAgICAgICBMaW5rZWRTdWJMaXN0LnRoaXMubW9kQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICByYW5nZUNoZWNrKGluZGV4LCBzaXplKTsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc2V0KGluZGV4ICsgb2Zmc2V0LCBvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBjaGVja01vZENvdW50KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jcmVhdGVTdWJMaXN0SXRlcmF0b3IodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJhbmdlQ2hlY2soaW5kZXgsIHNpemUgKyAxKTsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlU3ViTGlzdExpc3RJdGVyYXRvcih0aGlzLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXhJbmNsdXNpdmUsIGludCB0b0luZGV4RXhjbHVzaXZlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpbmtlZFN1Ykxpc3QocGFyZW50LCBmcm9tSW5kZXhJbmNsdXNpdmUgKyBvZmZzZXQsIHRvSW5kZXhFeGNsdXNpdmUgKyBvZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmFuZ2VDaGVjayhpbnQgaW5kZXgsIGludCBiZXlvbmQpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYmV5b25kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4ICciICsgaW5kZXggKyAiJyBvdXQgb2YgYm91bmRzIGZvciBzaXplICciICsgc2l6ZSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01vZENvdW50KCkgewotICAgICAgICAgICAgaWYgKHBhcmVudC5tb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0TGlzdERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaXN0RGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxODczODcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RMaXN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLkFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5MaXN0PC9jb2RlPiB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBsaXN0LgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3REZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50cyBMaXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIG9ubHkgdXNlZCBpbiBkZXNlcmlhbGl6YXRpb24sIGRvIG5vdCB1c2Ugb3RoZXJ3aXNlLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdExpc3REZWNvcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TGlzdERlY29yYXRvcihMaXN0IGxpc3QpIHsKLSAgICAgICAgc3VwZXIobGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIGxpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRMaXN0KCkgewotICAgICAgICByZXR1cm4gKExpc3QpIGdldENvbGxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBnZXRMaXN0KCkuYWRkKGluZGV4LCBvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmFkZEFsbChpbmRleCwgY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmluZGV4T2Yob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5sYXN0SW5kZXhPZihvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcihpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5zZXQoaW5kZXgsIG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0Fic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiY2NmNTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFNlcmlhbGl6YWJsZSBzdWJjbGFzcyBvZiBBYnN0cmFjdExpc3REZWNvcmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvcgotICAgICAgICBleHRlbmRzIEFic3RyYWN0TGlzdERlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjY4NDk1OTE5Njc0NzQ5NjI5OUw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yKExpc3QgbGlzdCkgewotICAgICAgICBzdXBlcihsaXN0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGxpc3Qgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGxpc3QgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQ3Vyc29yYWJsZUxpbmtlZExpc3QuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0N1cnNvcmFibGVMaW5rZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlMTkwNTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvQ3Vyc29yYWJsZUxpbmtlZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5MaXN0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPiB0aGF0Ci0gKiBhbGxvd3MgY29uY3VycmVudCBtb2RpZmljYXRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIGxpc3QuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYWxsIG9mIHRoZSBvcHRpb25hbCB7QGxpbmsgTGlzdH0gb3BlcmF0aW9ucy4KLSAqIEl0IGV4dGVuZHMgPGNvZGU+QWJzdHJhY3RMaW5rZWRMaXN0PC9jb2RlPiBhbmQgdGh1cyBwcm92aWRlcyB0aGUKLSAqIHN0YWNrL3F1ZXVlL2RlcXVldWUgb3BlcmF0aW9ucyBhdmFpbGFibGUgaW4ge0BsaW5rIGphdmEudXRpbC5MaW5rZWRMaXN0fS4KLSAqIDxwPgotICogVGhlIG1haW4gZmVhdHVyZSBvZiB0aGlzIGNsYXNzIGlzIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSB0aGUgbGlzdCBhbmQgdGhlCi0gKiBpdGVyYXRvciBhdCB0aGUgc2FtZSB0aW1lLiBCb3RoIHRoZSB7QGxpbmsgI2xpc3RJdGVyYXRvcigpfSBhbmQge0BsaW5rICNjdXJzb3IoKX0KLSAqIG1ldGhvZHMgcHJvdmlkZXMgYWNjZXNzIHRvIGEgPGNvZGU+Q3Vyc29yPC9jb2RlPiBpbnN0YW5jZSB3aGljaCBleHRlbmRzCi0gKiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+LiBUaGUgY3Vyc29yIGFsbG93cyBjaGFuZ2VzIHRvIHRoZSBsaXN0IGNvbmN1cnJlbnQKLSAqIHdpdGggY2hhbmdlcyB0byB0aGUgaXRlcmF0b3IuIE5vdGUgdGhhdCB0aGUge0BsaW5rICNpdGVyYXRvcigpfSBtZXRob2QgYW5kCi0gKiBzdWJsaXN0cyBkbyA8Yj5ub3Q8L2I+IHByb3ZpZGUgdGhpcyBjdXJzb3IgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+Q3Vyc29yPC9jb2RlPiBjbGFzcyBpcyBwcm92aWRlZCBwYXJ0bHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKiBhbmQgcGFydGx5IGJlY2F1c2UgaXQgYWxsb3dzIHRoZSBjdXJzb3IgdG8gYmUgZGlyZWN0bHkgY2xvc2VkLiBDbG9zaW5nIHRoZQotICogY3Vyc29yIGlzIG9wdGlvbmFsIGJlY2F1c2UgcmVmZXJlbmNlcyBhcmUgaGVsZCB2aWEgYSA8Y29kZT5XZWFrUmVmZXJlbmNlPC9jb2RlPi4KLSAqIEZvciBtb3N0IHB1cnBvc2VzLCBzaW1wbHkgbW9kaWZ5IHRoZSBpdGVyYXRvciBhbmQgbGlzdCBhdCB3aWxsLCBhbmQgdGhlbiBsZXQKLSAqIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byB0aGUgcmVzdC4KLSAqIDxwPgotICogPGI+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L2I+Ci0gKgotICogQHNlZSBqYXZhLnV0aWwuTGlua2VkTGlzdAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMS4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBSb2RuZXkgV2FsZGhvZmYKLSAqIEBhdXRob3IgSmFuZWsgQm9ndWNraQotICogQGF1dGhvciBTaW1vbiBLaXRjaGluZwotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIEN1cnNvcmFibGVMaW5rZWRMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaW5rZWRMaXN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBFbnN1cmUgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODgzNjM5MzA5ODUxOTQxMTM5M0w7Ci0KLSAgICAvKiogQSBsaXN0IG9mIHRoZSBjdXJzb3IgY3VycmVudGx5IG9wZW4gb24gdGhpcyBsaXN0ICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0IGN1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBjcmVhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBDdXJzb3JhYmxlTGlua2VkTGlzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5pdCgpOyAvLyBtdXN0IGNhbGwgaW5pdCgpIGFzIHVzZSBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgY29waWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBjb3B5Ci0gICAgICovCi0gICAgcHVibGljIEN1cnNvcmFibGVMaW5rZWRMaXN0KENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzdXBlcihjb2xsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXF1aXZhbGVudCBvZiBhIGRlZmF1bHQgY29uc3RydWN0b3IgY2FsbGVkCi0gICAgICogYnkgYW55IGNvbnN0cnVjdG9yIGFuZCBieSA8Y29kZT5yZWFkT2JqZWN0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgIGN1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBkb2VzIDxiPm5vdDwvYj4gc3VwcG9ydCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdW5kZXJseWluZyBsaXN0IGlzIG1vZGlmaWVkIHdoaWxlIGl0ZXJhdGluZyB1c2luZyB0aGlzIGl0ZXJhdG9yCi0gICAgICogYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIHdpbGwgb2NjdXIuCi0gICAgICogVGhlIGN1cnNvciBiZWhhdmlvdXIgaXMgYXZhaWxhYmxlIHZpYSB7QGxpbmsgI2xpc3RJdGVyYXRvcigpfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIHRoYXQgZG9lcyA8Yj5ub3Q8L2I+IHN1cHBvcnQgY29uY3VycmVudCBtb2RpZmljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5saXN0SXRlcmF0b3IoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGN1cnNvciBpdGVyYXRvciB0aGF0IGFsbG93cyBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGxpc3QgaW4gcGFyYWxsZWwuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGN1cnNvciBlbmFibGVzIGl0ZXJhdGlvbiBhbmQgbGlzdCBjaGFuZ2VzIHRvIG9jY3VyIGluIGFueSBvcmRlciB3aXRob3V0Ci0gICAgICogaW52YWxpZGF0aW5nIHRoZSBpdGVyYXRvciAoZnJvbSBvbmUgdGhyZWFkKS4gV2hlbiBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlCi0gICAgICogbGlzdCwgYW4gZXZlbnQgaXMgZmlyZWQgdG8gYWxsIGFjdGl2ZSBjdXJzb3JzIGVuYWJsaW5nIHRoZW0gdG8gYWRqdXN0IHRvIHRoZQotICAgICAqIGNoYW5nZSBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoZSAiY3VycmVudCIgKGkuZS4sIGxhc3QgcmV0dXJuZWQgYnkge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0fQotICAgICAqIG9yIHtAbGluayBMaXN0SXRlcmF0b3IjcHJldmlvdXN9KSBlbGVtZW50IG9mIHRoZSBsaXN0IGlzIHJlbW92ZWQsCi0gICAgICogdGhlIGN1cnNvciBhdXRvbWF0aWNhbGx5IGFkanVzdHMgdG8gdGhlIGNoYW5nZSAoaW52YWxpZGF0aW5nIHRoZQotICAgICAqIGxhc3QgcmV0dXJuZWQgdmFsdWUgc3VjaCB0aGF0IGl0IGNhbm5vdCBiZSByZW1vdmVkKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGN1cnNvciBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gY3Vyc29yKDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjdXJzb3IgaXRlcmF0b3IgdGhhdCBhbGxvd3MgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBsaXN0IGluIHBhcmFsbGVsLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjdXJzb3IgZW5hYmxlcyBpdGVyYXRpb24gYW5kIGxpc3QgY2hhbmdlcyB0byBvY2N1ciBpbiBhbnkgb3JkZXIgd2l0aG91dAotICAgICAqIGludmFsaWRhdGluZyB0aGUgaXRlcmF0b3IgKGZyb20gb25lIHRocmVhZCkuIFdoZW4gZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZQotICAgICAqIGxpc3QsIGFuIGV2ZW50IGlzIGZpcmVkIHRvIGFsbCBhY3RpdmUgY3Vyc29ycyBlbmFibGluZyB0aGVtIHRvIGFkanVzdCB0byB0aGUKLSAgICAgKiBjaGFuZ2UgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUgImN1cnJlbnQiIChpLmUuLCBsYXN0IHJldHVybmVkIGJ5IHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dH0KLSAgICAgKiBvciB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzfSkgZWxlbWVudCBvZiB0aGUgbGlzdCBpcyByZW1vdmVkLAotICAgICAqIHRoZSBjdXJzb3IgYXV0b21hdGljYWxseSBhZGp1c3RzIHRvIHRoZSBjaGFuZ2UgKGludmFsaWRhdGluZyB0aGUKLSAgICAgKiBsYXN0IHJldHVybmVkIHZhbHVlIHN1Y2ggdGhhdCBpdCBjYW5ub3QgYmUgcmVtb3ZlZCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21JbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20KLSAgICAgKiBAcmV0dXJuIGEgbmV3IGN1cnNvciBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBmcm9tSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnNvcihmcm9tSW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfSBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIDxjb2RlPkN1cnNvcjwvY29kZT4gaXMgYSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IHdpdGggYW4gYWRkaXRpb25hbAotICAgICAqIDxjb2RlPmNsb3NlKCk8L2NvZGU+IG1ldGhvZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBpbW1lZGlhdGVseSBkaXNjYXJkcyB0aGUKLSAgICAgKiByZWZlcmVuY2VzIHRvIHRoZSBjdXJzb3IuIElmIGl0IGlzIG5vdCBjYWxsZWQsIHRoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yCi0gICAgICogd2lsbCBzdGlsbCByZW1vdmUgdGhlIHJlZmVyZW5jZSBhcyBpdCBpcyBoZWxkIHZpYSBhIDxjb2RlPldlYWtSZWZlcmVuY2U8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIFRoZSBjdXJzb3IgZW5hYmxlcyBpdGVyYXRpb24gYW5kIGxpc3QgY2hhbmdlcyB0byBvY2N1ciBpbiBhbnkgb3JkZXIgd2l0aG91dAotICAgICAqIGludmFsaWRhdGluZyB0aGUgaXRlcmF0b3IgKGZyb20gb25lIHRocmVhZCkuIFdoZW4gZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZQotICAgICAqIGxpc3QsIGFuIGV2ZW50IGlzIGZpcmVkIHRvIGFsbCBhY3RpdmUgY3Vyc29ycyBlbmFibGluZyB0aGVtIHRvIGFkanVzdCB0byB0aGUKLSAgICAgKiBjaGFuZ2UgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGUgImN1cnJlbnQiIChpLmUuLCBsYXN0IHJldHVybmVkIGJ5IHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dH0KLSAgICAgKiBvciB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzfSkgZWxlbWVudCBvZiB0aGUgbGlzdCBpcyByZW1vdmVkLAotICAgICAqIHRoZSBjdXJzb3IgYXV0b21hdGljYWxseSBhZGp1c3RzIHRvIHRoZSBjaGFuZ2UgKGludmFsaWRhdGluZyB0aGUKLSAgICAgKiBsYXN0IHJldHVybmVkIHZhbHVlIHN1Y2ggdGhhdCBpdCBjYW5ub3QgYmUgcmVtb3ZlZCkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIGFzIHRoaXMgbWV0aG9kLCBhbmQgY2FuCi0gICAgICogYmUgY2FzdCB0byBhIDxjb2RlPkN1cnNvcjwvY29kZT4gaWYgdGhlIDxjb2RlPmNsb3NlPC9jb2RlPiBtZXRob2QgaXMgcmVxdWlyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGN1cnNvciBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBDdXJzb3JhYmxlTGlua2VkTGlzdC5DdXJzb3IgY3Vyc29yKCkgewotICAgICAgICByZXR1cm4gY3Vyc29yKDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfSBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdAotICAgICAqIHN0YXJ0aW5nIGZyb20gYSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogPHA+Ci0gICAgICogQSA8Y29kZT5DdXJzb3I8L2NvZGU+IGlzIGEgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPiB3aXRoIGFuIGFkZGl0aW9uYWwKLSAgICAgKiA8Y29kZT5jbG9zZSgpPC9jb2RlPiBtZXRob2QuIENhbGxpbmcgdGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgZGlzY2FyZHMgdGhlCi0gICAgICogcmVmZXJlbmNlcyB0byB0aGUgY3Vyc29yLiBJZiBpdCBpcyBub3QgY2FsbGVkLCB0aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgotICAgICAqIHdpbGwgc3RpbGwgcmVtb3ZlIHRoZSByZWZlcmVuY2UgYXMgaXQgaXMgaGVsZCB2aWEgYSA8Y29kZT5XZWFrUmVmZXJlbmNlPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY3Vyc29yIGVuYWJsZXMgaXRlcmF0aW9uIGFuZCBsaXN0IGNoYW5nZXMgdG8gb2NjdXIgaW4gYW55IG9yZGVyIHdpdGhvdXQKLSAgICAgKiBpbnZhbGlkYXRpbmcgdGhlIGl0ZXJhdG9yIChmcm9tIG9uZSB0aHJlYWQpLiBXaGVuIGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUKLSAgICAgKiBsaXN0LCBhbiBldmVudCBpcyBmaXJlZCB0byBhbGwgYWN0aXZlIGN1cnNvcnMgZW5hYmxpbmcgdGhlbSB0byBhZGp1c3QgdG8gdGhlCi0gICAgICogY2hhbmdlIGluIHRoZSBsaXN0LgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhlICJjdXJyZW50IiAoaS5lLiwgbGFzdCByZXR1cm5lZCBieSB7QGxpbmsgTGlzdEl0ZXJhdG9yI25leHR9Ci0gICAgICogb3Ige0BsaW5rIExpc3RJdGVyYXRvciNwcmV2aW91c30pIGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgcmVtb3ZlZCwKLSAgICAgKiB0aGUgY3Vyc29yIGF1dG9tYXRpY2FsbHkgYWRqdXN0cyB0byB0aGUgY2hhbmdlIChpbnZhbGlkYXRpbmcgdGhlCi0gICAgICogbGFzdCByZXR1cm5lZCB2YWx1ZSBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIHJlbW92ZWQpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB7QGxpbmsgI2xpc3RJdGVyYXRvcihpbnQpfSBtZXRob2QgcmV0dXJucyB0aGUgc2FtZSBhcyB0aGlzIG1ldGhvZCwgYW5kIGNhbgotICAgICAqIGJlIGNhc3QgdG8gYSA8Y29kZT5DdXJzb3I8L2NvZGU+IGlmIHRoZSA8Y29kZT5jbG9zZTwvY29kZT4gbWV0aG9kIGlzIHJlcXVpcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyb21JbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20KLSAgICAgKiBAcmV0dXJuIGEgbmV3IGN1cnNvciBpdGVyYXRvcgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAgICogICAgICAoaW5kZXggJmx0OyAwIHx8IGluZGV4ICZndDsgc2l6ZSgpKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ3Vyc29yYWJsZUxpbmtlZExpc3QuQ3Vyc29yIGN1cnNvcihpbnQgZnJvbUluZGV4KSB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKHRoaXMsIGZyb21JbmRleCk7Ci0gICAgICAgIHJlZ2lzdGVyQ3Vyc29yKGN1cnNvcik7Ci0gICAgICAgIHJldHVybiBjdXJzb3I7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIG5vZGUgd2l0aCBhIG5ldyB2YWx1ZS4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNldHMgdGhlIHZhbHVlIG9uIHRoZSBub2RlLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmVjb3JkIHRoZSBjaGFuZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUgIG5vZGUgdG8gdXBkYXRlCi0gICAgICogQHBhcmFtIHZhbHVlICBuZXcgdmFsdWUgb2YgdGhlIG5vZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOb2RlKE5vZGUgbm9kZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZU5vZGUobm9kZSwgdmFsdWUpOwotICAgICAgICBicm9hZGNhc3ROb2RlQ2hhbmdlZChub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbmV3IG5vZGUgaW50byB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlVG9JbnNlcnQgIG5ldyBub2RlIHRvIGluc2VydAotICAgICAqIEBwYXJhbSBpbnNlcnRCZWZvcmVOb2RlICBub2RlIHRvIGluc2VydCBiZWZvcmUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBub2RlIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKE5vZGUgbm9kZVRvSW5zZXJ0LCBOb2RlIGluc2VydEJlZm9yZU5vZGUpIHsKLSAgICAgICAgc3VwZXIuYWRkTm9kZShub2RlVG9JbnNlcnQsIGluc2VydEJlZm9yZU5vZGUpOwotICAgICAgICBicm9hZGNhc3ROb2RlSW5zZXJ0ZWQobm9kZVRvSW5zZXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0byByZW1vdmUKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPm5vZGU8L2NvZGU+IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlKE5vZGUgbm9kZSkgewotICAgICAgICBzdXBlci5yZW1vdmVOb2RlKG5vZGUpOwotICAgICAgICBicm9hZGNhc3ROb2RlUmVtb3ZlZChub2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBub2RlcyBieSBpdGVyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsTm9kZXMoKSB7Ci0gICAgICAgIGlmIChzaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uIHdvdWxkIGJyZWFrIGFsbCB0aGUgaXRlcmF0b3JzCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGN1cnNvciB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3Vyc29yICB0aGUgY3Vyc29yIHRvIHJlZ2lzdGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewotICAgICAgICAvLyBXZSB0YWtlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdGhlIGN1cnNvcnMgbGlzdAotICAgICAgICAvLyBvZiBXZWFrUmVmZXJlbmNlIG9iamVjdHMgdG8gZ2FyYmFnZS1jb2xsZWN0ZWQgY3Vyc29ycy4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGN1cnNvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSAoV2Vha1JlZmVyZW5jZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlZi5nZXQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY3Vyc29ycy5hZGQobmV3IFdlYWtSZWZlcmVuY2UoY3Vyc29yKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVyZWdpc3RlcnMgYSBjdXJzb3IgZnJvbSB0aGUgbGlzdCB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjdXJzb3IgIHRoZSBjdXJzb3IgdG8gZGVyZWdpc3RlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY3Vyc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHJlZiA9IChXZWFrUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBDdXJzb3IgY3VyID0gKEN1cnNvcikgcmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGN1ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciB1bnJlbGF0ZWQgY3Vyc29yIG9iamVjdCBoYXMgYmVlbiAKLSAgICAgICAgICAgICAgICAvLyBnYXJiYWdlLWNvbGxlY3RlZDsgbGV0J3MgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8KLSAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgY3Vyc29ycyBsaXN0IGFueXdheS4uCi0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09IGN1cnNvcikgewotICAgICAgICAgICAgICAgIHJlZi5jbGVhcigpOwotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEluZm9ybXMgYWxsIG9mIG15IHJlZ2lzdGVyZWQgY3Vyc29ycyB0aGF0IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBlbGVtZW50IHdhcyBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0aGF0IHdhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Tm9kZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gY3Vyc29ycy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHJlZiA9IChXZWFrUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gKEN1cnNvcikgcmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7IC8vIGNsZWFuIHVwIGxpc3QKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLm5vZGVDaGFuZ2VkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtcyBhbGwgb2YgbXkgcmVnaXN0ZXJlZCBjdXJzb3JzIHRoYXQgdGhlIHNwZWNpZmllZAotICAgICAqIGVsZW1lbnQgd2FzIGp1c3QgcmVtb3ZlZCBmcm9tIG15IGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUgIHRoZSBub2RlIHRoYXQgd2FzIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBicm9hZGNhc3ROb2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjdXJzb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFdlYWtSZWZlcmVuY2UgcmVmID0gKFdlYWtSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSAoQ3Vyc29yKSByZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsgLy8gY2xlYW4gdXAgbGlzdAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJzb3Iubm9kZVJlbW92ZWQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIGFsbCBvZiBteSByZWdpc3RlcmVkIGN1cnNvcnMgdGhhdCB0aGUgc3BlY2lmaWVkCi0gICAgICogZWxlbWVudCB3YXMganVzdCBhZGRlZCB0byBteSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0aGF0IHdhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Tm9kZUluc2VydGVkKE5vZGUgbm9kZSkgewotICAgICAgICBJdGVyYXRvciBpdCA9IGN1cnNvcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSAoV2Vha1JlZmVyZW5jZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IChDdXJzb3IpIHJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOyAvLyBjbGVhbiB1cCBsaXN0Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGN1cnNvci5ub2RlSW5zZXJ0ZWQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyB0aGUgZGF0YSBoZWxkIGluIHRoaXMgb2JqZWN0IHRvIHRoZSBzdHJlYW0gc3BlY2lmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIGRvV3JpdGVPYmplY3Qob3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGRhdGEgaGVsZCBpbiB0aGlzIG9iamVjdCB0byB0aGUgc3RyZWFtIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgZG9SZWFkT2JqZWN0KGluKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzdWJsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdWJMaXN0ICB0aGUgc3VibGlzdCB0byBnZXQgYW4gaXRlcmF0b3IgZm9yCi0gICAgICogQHBhcmFtIGZyb21JbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20sIHJlbGF0aXZlIHRvIHRoZSBzdWJsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RJdGVyYXRvciBjcmVhdGVTdWJMaXN0TGlzdEl0ZXJhdG9yKExpbmtlZFN1Ykxpc3Qgc3ViTGlzdCwgaW50IGZyb21JbmRleCkgewotICAgICAgICBTdWJDdXJzb3IgY3Vyc29yID0gbmV3IFN1YkN1cnNvcihzdWJMaXN0LCBmcm9tSW5kZXgpOwotICAgICAgICByZWdpc3RlckN1cnNvcihjdXJzb3IpOwotICAgICAgICByZXR1cm4gY3Vyc29yOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBbiBleHRlbmRlZCA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IHRoYXQgYWxsb3dzIGNvbmN1cnJlbnQgY2hhbmdlcyB0bwotICAgICAqIHRoZSB1bmRlcmx5aW5nIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdExpbmtlZExpc3QuTGlua2VkTGlzdEl0ZXJhdG9yIHsKLSAgICAgICAgLyoqIElzIHRoZSBjdXJzb3IgdmFsaWQgKG5vdCBjbG9zZWQpICovCi0gICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOwotICAgICAgICAvKiogSXMgdGhlIG5leHQgaW5kZXggdmFsaWQgKi8KLSAgICAgICAgYm9vbGVhbiBuZXh0SW5kZXhWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8qKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgd2FzIHJlbW92ZWQgYnkgYW5vdGhlciBvYmplY3QuICovCi0gICAgICAgIGJvb2xlYW4gY3VycmVudFJlbW92ZWRCeUFub3RoZXIgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1cnNvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBDdXJzb3IoQ3Vyc29yYWJsZUxpbmtlZExpc3QgcGFyZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgaW5kZXgpOwotICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gbGFzdCByZXR1cm5lZCBieSB0aGlzIGl0ZXJhdG9yLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlcmUgbWF5IGhhdmUgYmVlbiBzdWJzZXF1ZW50IGFsdGVyYXRpb25zIHRvIHRoZSBsaXN0Ci0gICAgICAgICAqIHNpbmNlIHlvdSBvYnRhaW5lZCB0aGlzIGl0ZW0sIGhvd2V2ZXIgeW91IGNhbiBzdGlsbCByZW1vdmUgaXQuCi0gICAgICAgICAqIFlvdSBjYW4gZXZlbiByZW1vdmUgaXQgaWYgdGhlIGl0ZW0gaXMgbm8gbG9uZ2VyIGluIHRoZSBtYWluIGxpc3QuCi0gICAgICAgICAqIEhvd2V2ZXIsIHlvdSBjYW4ndCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoZSBzYW1lIGl0ZXJhdG9yIG1vcmUKLSAgICAgICAgICogdGhhbiBvbmNlIHdpdGhvdXQgY2FsbGluZyBuZXh0KCkgb3IgcHJldmlvdXMoKS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gaXRlbSB0byByZW1vdmUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIC8vIG92ZXJyaWRkZW4sIGFzIHRoZSBub2RlUmVtb3ZlZCgpIG1ldGhvZCB1cGRhdGVzIHRoZSBpdGVyYXRvcgotICAgICAgICAgICAgLy8gc3RhdGUgaW4gdGhlIHBhcmVudC5yZW1vdmVOb2RlKCkgY2FsbCBiZWxvdwotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCAmJiBjdXJyZW50UmVtb3ZlZEJ5QW5vdGhlcikgewotICAgICAgICAgICAgICAgIC8vIHF1aWV0bHkgaWdub3JlLCBhcyB0aGUgbGFzdCByZXR1cm5lZCBub2RlIHdhcyByZW1vdmVkCi0gICAgICAgICAgICAgICAgLy8gYnkgdGhlIGxpc3Qgb3Igc29tZSBvdGhlciBpdGVyYXRvcgotICAgICAgICAgICAgICAgIC8vIGJ5IGlnbm9yaW5nIGl0LCB3ZSBrZWVwIHRoaXMgaXRlcmF0b3IgaW5kZXBlbmRlbnQgZnJvbQotICAgICAgICAgICAgICAgIC8vIG90aGVyIGNoYW5nZXMgYXMgbXVjaCBhcyBwb3NzaWJsZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGVja01vZENvdW50KCk7Ci0gICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZU5vZGUoZ2V0TGFzdE5vZGVSZXR1cm5lZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnRSZW1vdmVkQnlBbm90aGVyID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGxpc3QuCi0gICAgICAgICAqIFRoZSBvYmplY3QgYWRkZWQgaGVyZSB3aWxsIGJlIHRoZSBuZXcgJ3ByZXZpb3VzJyBpbiB0aGUgaXRlcmF0b3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIC8vIG92ZXJyaWRkZW4sIGFzIHRoZSBub2RlSW5zZXJ0ZWQoKSBtZXRob2QgdXBkYXRlcyB0aGUgaXRlcmF0b3Igc3RhdGUKLSAgICAgICAgICAgIHN1cGVyLmFkZChvYmopOwotICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgKG5leHQucHJldmlvdXMgPT0gbm9kZSkgY2xhdXNlIGluIG5vZGVJbnNlcnRlZCgpCi0gICAgICAgICAgICAvLyB0aHVzIG5leHQgZ2V0cyBjaGFuZ2VkIC0gcmVzZXQgaXQgYWdhaW4gaGVyZQotICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2V0IGlzIG5vdCBvdmVycmlkZGVuLCBhcyBpdCB3b3JrcyBvawotICAgICAgICAvLyBub3RlIHRoYXQgd2Ugd2FudCBpdCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgYmVpbmcKLSAgICAgICAgLy8gc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVhbCBsaXN0IChjb21wYXJlIHRoaXMgd2l0aCB0aGUKLSAgICAgICAgLy8gcmVtb3ZlIG1ldGhvZCB3aGVyZSB3ZSBzaWxlbnRseSBpZ25vcmUgdGhpcyBjYXNlKQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHJldHVybmVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbmV4dCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgICAgICBpZiAobmV4dEluZGV4VmFsaWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBwYXJlbnQuaGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IHBhcmVudC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGUgdGVtcCA9IHBhcmVudC5oZWFkZXIubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAgIT0gbmV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IHBvczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dEluZGV4VmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIYW5kbGUgZXZlbnQgZnJvbSB0aGUgbGlzdCB3aGVuIGEgbm9kZSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0aGF0IGNoYW5nZWQKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZSBldmVudCBmcm9tIHRoZSBsaXN0IHdoZW4gYSBub2RlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbm9kZSAgdGhlIG5vZGUgdGhhdCB3YXMgcmVtb3ZlZAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBuZXh0ICYmIG5vZGUgPT0gY3VycmVudCkgewotICAgICAgICAgICAgICAgIC8vIHN0YXRlIHdoZXJlIG5leHQoKSBmb2xsb3dlZCBieSBwcmV2aW91cygpCi0gICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUubmV4dDsKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVtb3ZlZEJ5QW5vdGhlciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgPT0gbmV4dCkgewotICAgICAgICAgICAgICAgIC8vIHN0YXRlIHdoZXJlIG5leHQoKSBub3QgZm9sbG93ZWQgYnkgcHJldmlvdXMoKQotICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgbWF0Y2hpbmcgbmV4dCBub2RlCi0gICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUubmV4dDsKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVtb3ZlZEJ5QW5vdGhlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlID09IGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBzdGF0ZSB3aGVyZSBuZXh0KCkgbm90IGZvbGxvd2VkIGJ5IHByZXZpb3VzKCkKLSAgICAgICAgICAgICAgICAvLyBhbmQgd2UgYXJlIG1hdGNoaW5nIGN1cnJlbnQgKGxhc3QgcmV0dXJuZWQpIG5vZGUKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVtb3ZlZEJ5QW5vdGhlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbmV4dEluZGV4LS07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5leHRJbmRleFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY3VycmVudFJlbW92ZWRCeUFub3RoZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIYW5kbGUgZXZlbnQgZnJvbSB0aGUgbGlzdCB3aGVuIGEgbm9kZSBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgbm9kZUluc2VydGVkKE5vZGUgbm9kZSkgewotICAgICAgICAgICAgaWYgKG5vZGUucHJldmlvdXMgPT0gY3VycmVudCkgewotICAgICAgICAgICAgICAgIG5leHQgPSBub2RlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0LnByZXZpb3VzID09IG5vZGUpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gbm9kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV4dEluZGV4VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdmVycmlkZSBzdXBlcmNsYXNzIG1vZENvdW50IGNoZWNrLCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciB2YWxpZCBmbGFnLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2RDb3VudCgpIHsKLSAgICAgICAgICAgIGlmICghdmFsaWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigiQ3Vyc29yIGNsb3NlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1hcmsgdGhpcyBjdXJzb3IgYXMgbm8gbG9uZ2VyIGJlaW5nIG5lZWRlZC4gQW55IHJlc291cmNlcwotICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3IgYXJlIGltbWVkaWF0ZWx5IHJlbGVhc2VkLgotICAgICAgICAgKiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNsYXNzLCBpdCB3YXMgbWFuZGF0b3J5IHRvIGNsb3NlCi0gICAgICAgICAqIGFsbCBjdXJzb3Igb2JqZWN0cyB0byBhdm9pZCBtZW1vcnkgbGVha3MuIEl0IGlzIDxpPm5vIGxvbmdlcjwvaT4KLSAgICAgICAgICogbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBjbG9zZSBtZXRob2Q7IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgICogY2FuIG5vdyBiZSB0cmVhdGVkIGV4YWN0bHkgbGlrZSBhIG5vcm1hbCBpdGVyYXRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgKChDdXJzb3JhYmxlTGlua2VkTGlzdCkgcGFyZW50KS51bnJlZ2lzdGVyQ3Vyc29yKHRoaXMpOwotICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQSBjdXJzb3IgZm9yIHRoZSBzdWJsaXN0IGJhc2VkIG9uIExpbmtlZFN1Ykxpc3RJdGVyYXRvci4KLSAgICAgKgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU3ViQ3Vyc29yIGV4dGVuZHMgQ3Vyc29yIHsKLQotICAgICAgICAvKiogVGhlIHBhcmVudCBsaXN0ICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBMaW5rZWRTdWJMaXN0IHN1YjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBjdXJzb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBzdGFydCBmcm9tCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgU3ViQ3Vyc29yKExpbmtlZFN1Ykxpc3Qgc3ViLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHN1cGVyKChDdXJzb3JhYmxlTGlua2VkTGlzdCkgc3ViLnBhcmVudCwgaW5kZXggKyBzdWIub2Zmc2V0KTsKLSAgICAgICAgICAgIHRoaXMuc3ViID0gc3ViOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEluZGV4KCkgPCBzdWIuc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiAocHJldmlvdXNJbmRleCgpID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHN1cGVyLm5leHRJbmRleCgpIC0gc3ViLm9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgc3VwZXIuYWRkKG9iaik7Ci0gICAgICAgICAgICBzdWIuZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgICAgIHN1Yi5zaXplKys7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTsKLSAgICAgICAgICAgIHN1Yi5leHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICAgICAgc3ViLnNpemUtLTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvRml4ZWRTaXplTGlzdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvRml4ZWRTaXplTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTRkYzNjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0ZpeGVkU2l6ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Cb3VuZGVkQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkFic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+TGlzdDwvY29kZT4gdG8gZml4IHRoZSBzaXplIHByZXZlbnRpbmcgYWRkL3JlbW92ZS4KLSAqIDxwPgotICogVGhlIGFkZCwgcmVtb3ZlLCBjbGVhciBhbmQgcmV0YWluIG9wZXJhdGlvbnMgYXJlIHVuc3VwcG9ydGVkLgotICogVGhlIHNldCBtZXRob2QgaXMgYWxsb3dlZCAoYXMgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIGxpc3Qgc2l6ZSkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBGaXhlZFNpemVMaXN0Ci0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgQm91bmRlZENvbGxlY3Rpb24gewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjE4MDEwNjczNjExMTYwMzE5TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGZpeGVkIHNpemUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZGVjb3JhdGUoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRml4ZWRTaXplTGlzdChsaXN0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpeGVkU2l6ZUxpc3QoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHN1cGVyKGxpc3QpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkxpc3QgaXMgZml4ZWQgc2l6ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJMaXN0IGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTGlzdCBpcyBmaXhlZCBzaXplIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTGlzdCBpcyBmaXhlZCBzaXplIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTGlzdCBpcyBmaXhlZCBzaXplIik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmluZGV4T2Yob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVJdGVyYXRvci5kZWNvcmF0ZShnZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVMaXN0SXRlcmF0b3IoZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcigwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRml4ZWRTaXplTGlzdEl0ZXJhdG9yKGdldExpc3QoKS5saXN0SXRlcmF0b3IoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJMaXN0IGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkxpc3QgaXMgZml4ZWQgc2l6ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJMaXN0IGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTGlzdCBpcyBmaXhlZCBzaXplIik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuc2V0KGluZGV4LCBvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLSAgICAgICAgTGlzdCBzdWIgPSBnZXRMaXN0KCkuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZUxpc3Qoc3ViKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGl0ZXJhdG9yIHRoYXQgb25seSBwZXJtaXRzIGNoYW5nZXMgdmlhIHNldCgpCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIEZpeGVkU2l6ZUxpc3RJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yIHsKLSAgICAgICAgcHJvdGVjdGVkIEZpeGVkU2l6ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgICAgIHN1cGVyKGl0ZXJhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkxpc3QgaXMgZml4ZWQgc2l6ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkxpc3QgaXMgZml4ZWQgc2l6ZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBzaXplKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9Hcm93dGhMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9Hcm93dGhMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0ZWI4YjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvR3Jvd3RoTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDUtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIG1ha2UgaXQgc2VhbWxlc3NseSBncm93IHdoZW4KLSAqIGluZGljZXMgbGFyZ2VyIHRoYW4gdGhlIGxpc3Qgc2l6ZSBhcmUgdXNlZCBvbiBhZGQgYW5kIHNldCwKLSAqIGF2b2lkaW5nIG1vc3QgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgYXZvaWRzIGVycm9ycyBieSBncm93aW5nIHdoZW4gYSBzZXQgb3IgYWRkIG1ldGhvZCB3b3VsZAotICogbm9ybWFsbHkgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4KLSAqIE5vdGUgdGhhdCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIElTIHJldHVybmVkIGZvciBpbnZhbGlkIG5lZ2F0aXZlIGluZGljZXMuCi0gKiA8cD4KLSAqIFRyeWluZyB0byBzZXQgb3IgYWRkIHRvIGFuIGluZGV4IGxhcmdlciB0aGFuIHRoZSBzaXplIHdpbGwgY2F1c2UgdGhlIGxpc3QKLSAqIHRvIGdyb3cgKHVzaW5nIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzKS4gQ2xlYXJseSwgY2FyZSBtdXN0IGJlIHRha2VuCi0gKiBub3QgdG8gdXNlIGV4Y2Vzc2l2ZWx5IGxhcmdlIGluZGljZXMsIGFzIHRoZSBpbnRlcm5hbCBsaXN0IHdpbGwgZ3JvdyB0bwotICogbWF0Y2guCi0gKiA8cD4KLSAqIFRyeWluZyB0byB1c2UgYW55IG1ldGhvZCBvdGhlciB0aGFuIGFkZCBvciBzZXQgd2l0aCBhbiBpbnZhbGlkIGluZGV4IHdpbGwKLSAqIGNhbGwgdGhlIHVuZGVybHlpbmcgbGlzdCBhbmQgcHJvYmFibHkgcmVzdWx0IGluIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uCi0gKiA8cD4KLSAqIFRha2UgY2FyZSB3aGVuIHVzaW5nIHRoaXMgbGlzdCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcywgYXMKLSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhZGRlZCB3aGVuIGdyb3dpbmcgdGhlIGxpc3QuCi0gKiA8cD4KLSAqIEFsbCBzdWItbGlzdHMgd2lsbCBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgbGlzdCBkaXJlY3RseSwgYW5kIHdpbGwgdGhyb3cKLSAqIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25zLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRpZmZlcnMgZnJvbSB7QGxpbmsgTGF6eUxpc3R9IGJlY2F1c2UgaGVyZSBncm93dGggb2NjdXJzIG9uCi0gKiBzZXQgYW5kIGFkZCwgd2hlcmUgPGNvZGU+TGF6eUxpc3Q8L2NvZGU+IGdyb3dzIG9uIGdldC4gSG93ZXZlciwgdGhleQotICogY2FuIGJlIHVzZWQgdG9nZXRoZXIgYnkgZGVjb3JhdGluZyB0d2ljZS4KLSAqCi0gKiBAc2VlIExhenlMaXN0Ci0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBhdWwgTGVnYXRvCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm93dGhMaXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzYyMDAwMTg4MTY3Mkw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBncm93dGggbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3QgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBkZWNvcmF0ZShMaXN0IGxpc3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcm93dGhMaXN0KGxpc3QpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHVzZXMgYW4gQXJyYXlMaXN0IGludGVybmFsbHkuCi0gICAgICovCi0gICAgcHVibGljIEdyb3d0aExpc3QoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB1c2VzIGFuIEFycmF5TGlzdCBpbnRlcm5hbGx5LgotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxTaXplICB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBBcnJheUxpc3QKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsIHNpemUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBHcm93dGhMaXN0KGludCBpbml0aWFsU2l6ZSkgewotICAgICAgICBzdXBlcihuZXcgQXJyYXlMaXN0KGluaXRpYWxTaXplKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgR3Jvd3RoTGlzdChMaXN0IGxpc3QpIHsKLSAgICAgICAgc3VwZXIobGlzdCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlIHRoZSBhZGQgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGdyb3d0aCBiZWhhdmlvdXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJlcXVlc3RlZCBpbmRleCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIGxpc3Qgd2lsbAotICAgICAqIGdyb3cgdG8gdGhlIG5ldyBzaXplLiBJbmRpY2VzIGJldHdlZW4gdGhlIG9sZCBzaXplIGFuZCB0aGUgcmVxdWVzdGVkCi0gICAgICogc2l6ZSB3aWxsIGJlIGZpbGxlZCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbmRleCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8KLSAgICAgKiB0aGUgdW5kZXJseWluZyBsaXN0IGRpcmVjdGx5LgotICAgICAqIElmIHRoZSBpbmRleCBpcyBsZXNzIHRoYW4gemVybywgdGhlIHVuZGVybHlpbmcgbGlzdCBpcyBjYWxsZWQsIHdoaWNoCi0gICAgICogd2lsbCBwcm9iYWJseSB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gYWRkIGF0Ci0gICAgICogQHBhcmFtIGVsZW1lbnQgIHRoZSBvYmplY3QgdG8gYWRkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QgZG9lc24ndCBpbXBsZW1lbnQgc2V0Ci0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgbGlzdCByZWplY3RzIHRoZSBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgbGlzdCByZWplY3RzIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaW50IHNpemUgPSBnZXRMaXN0KCkuc2l6ZSgpOwotICAgICAgICBpZiAoaW5kZXggPiBzaXplKSB7Ci0gICAgICAgICAgICBnZXRMaXN0KCkuYWRkQWxsKENvbGxlY3Rpb25zLm5Db3BpZXMoaW5kZXggLSBzaXplLCBudWxsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0TGlzdCgpLmFkZChpbmRleCwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlIHRoZSBhZGRBbGwgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGdyb3d0aCBiZWhhdmlvdXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJlcXVlc3RlZCBpbmRleCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIGxpc3Qgd2lsbAotICAgICAqIGdyb3cgdG8gdGhlIG5ldyBzaXplLiBJbmRpY2VzIGJldHdlZW4gdGhlIG9sZCBzaXplIGFuZCB0aGUgcmVxdWVzdGVkCi0gICAgICogc2l6ZSB3aWxsIGJlIGZpbGxlZCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbmRleCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvCi0gICAgICogdGhlIHVuZGVybHlpbmcgbGlzdCBkaXJlY3RseS4KLSAgICAgKiBJZiB0aGUgaW5kZXggaXMgbGVzcyB0aGFuIHplcm8sIHRoZSB1bmRlcmx5aW5nIGxpc3QgaXMgY2FsbGVkLCB3aGljaAotICAgICAqIHdpbGwgcHJvYmFibHkgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGFkZCBhdAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBhZGQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdCBjaGFuZ2VkCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBsaXN0IGRvZXNuJ3QgaW1wbGVtZW50IHNldAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QgcmVqZWN0cyB0aGUgZWxlbWVudAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QgcmVqZWN0cyB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBpbnQgc2l6ZSA9IGdldExpc3QoKS5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChpbmRleCA+IHNpemUpIHsKLSAgICAgICAgICAgIGdldExpc3QoKS5hZGRBbGwoQ29sbGVjdGlvbnMubkNvcGllcyhpbmRleCAtIHNpemUsIG51bGwpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChnZXRMaXN0KCkuYWRkQWxsKGluZGV4LCBjb2xsKSB8IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlIHRoZSBzZXQgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGdyb3d0aCBiZWhhdmlvdXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJlcXVlc3RlZCBpbmRleCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIGxpc3Qgd2lsbAotICAgICAqIGdyb3cgdG8gdGhlIG5ldyBzaXplLiBJbmRpY2VzIGJldHdlZW4gdGhlIG9sZCBzaXplIGFuZCB0aGUgcmVxdWVzdGVkCi0gICAgICogc2l6ZSB3aWxsIGJlIGZpbGxlZCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBpbmRleCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IG9udG8KLSAgICAgKiB0aGUgdW5kZXJseWluZyBsaXN0IGRpcmVjdGx5LgotICAgICAqIElmIHRoZSBpbmRleCBpcyBsZXNzIHRoYW4gemVybywgdGhlIHVuZGVybHlpbmcgbGlzdCBpcyBjYWxsZWQsIHdoaWNoCi0gICAgICogd2lsbCBwcm9iYWJseSB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gc2V0Ci0gICAgICogQHBhcmFtIGVsZW1lbnQgIHRoZSBvYmplY3QgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcHJldmlvdXNseSBhdCB0aGF0IGluZGV4Ci0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBsaXN0IGRvZXNuJ3QgaW1wbGVtZW50IHNldAotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QgcmVqZWN0cyB0aGUgZWxlbWVudAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGxpc3QgcmVqZWN0cyB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaW50IHNpemUgPSBnZXRMaXN0KCkuc2l6ZSgpOwotICAgICAgICBpZiAoaW5kZXggPj0gc2l6ZSkgewotICAgICAgICAgICAgZ2V0TGlzdCgpLmFkZEFsbChDb2xsZWN0aW9ucy5uQ29waWVzKChpbmRleCAtIHNpemUpICsgMSwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0xhenlMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9MYXp5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzk1MTY0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L0xhenlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRmFjdG9yeTsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5MaXN0PC9jb2RlPiB0byBjcmVhdGUgb2JqZWN0cyBpbiB0aGUgbGlzdCBvbiBkZW1hbmQuCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHtAbGluayAjZ2V0KGludCl9IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhbiBpbmRleCBncmVhdGVyIHRoYW4KLSAqIHRoZSBzaXplIG9mIHRoZSBsaXN0LCB0aGUgbGlzdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ3JvdyBpbiBzaXplIGFuZCByZXR1cm4KLSAqIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgZmFjdG9yeS4gVGhlIGdhcHMgd2lsbCBiZSBmaWxsZWQgYnkgbnVsbC4KLSAqIElmIGEgZ2V0IG1ldGhvZCBjYWxsIGVuY291bnRlcnMgYSBudWxsLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKLSAqIG9iamVjdCBmcm9tIHRoZSBmYWN0b3J5LiBUaHVzIHRoaXMgbGlzdCBpcyB1bnN1aXRhYmxlIGZvciBzdG9yaW5nIG51bGwKLSAqIG9iamVjdHMuCi0gKiA8cD4KLSAqIEZvciBpbnN0YW5jZToKLSAqCi0gKiA8cHJlPgotICogRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKSB7Ci0gKiAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB7Ci0gKiAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOwotICogICAgIH0KLSAqIH0KLSAqIExpc3QgbGF6eSA9IExhenlMaXN0LmRlY29yYXRlKG5ldyBBcnJheUxpc3QoKSwgZmFjdG9yeSk7Ci0gKiBPYmplY3Qgb2JqID0gbGF6eS5nZXQoMyk7Ci0gKiA8L3ByZT4KLSAqCi0gKiBBZnRlciB0aGUgYWJvdmUgY29kZSBpcyBleGVjdXRlZCwgPGNvZGU+b2JqPC9jb2RlPiB3aWxsIGNvbnRhaW4KLSAqIGEgbmV3IDxjb2RlPkRhdGU8L2NvZGU+IGluc3RhbmNlLiAgRnVydGhlcm1vcmUsIHRoYXQgPGNvZGU+RGF0ZTwvY29kZT4KLSAqIGluc3RhbmNlIGlzIHRoZSBmb3VydGggZWxlbWVudCBpbiB0aGUgbGlzdC4gIFRoZSBmaXJzdCwgc2Vjb25kLCAKLSAqIGFuZCB0aGlyZCBlbGVtZW50IGFyZSBhbGwgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRpZmZlcnMgZnJvbSB7QGxpbmsgR3Jvd3RoTGlzdH0gYmVjYXVzZSBoZXJlIGdyb3d0aCBvY2N1cnMgb24KLSAqIGdldCwgd2hlcmUgPGNvZGU+R3Jvd3RoTGlzdDwvY29kZT4gZ3Jvd3Mgb24gc2V0IGFuZCBhZGQuIEhvd2V2ZXIsIHRoZXkKLSAqIGNvdWxkIGVhc2lseSBiZSB1c2VkIHRvZ2V0aGVyIGJ5IGRlY29yYXRpbmcgdHdpY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNlZSBHcm93dGhMaXN0Ci0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBBcnJvbiBCYXRlcwotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIExhenlMaXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTcwODM4ODAxNzE2MDY5NDU0Mkw7Ci0KLSAgICAvKiogVGhlIGZhY3RvcnkgdG8gdXNlIHRvIGxhemlseSBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0cyAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBsYXppbHkgaW5zdGFudGlhdGluZyBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBvciBmYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZGVjb3JhdGUoTGlzdCBsaXN0LCBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYXp5TGlzdChsaXN0LCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBvciBmYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGF6eUxpc3QoTGlzdCBsaXN0LCBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIobGlzdCk7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIERlY29yYXRlIHRoZSBnZXQgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGxhenkgYmVoYXZpb3VyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByZXF1ZXN0ZWQgaW5kZXggaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHNpemUsIHRoZSBsaXN0IHdpbGwgCi0gICAgICogZ3JvdyB0byB0aGUgbmV3IHNpemUgYW5kIGEgbmV3IG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGZhY3RvcnkuCi0gICAgICogSW5kZXhlcyBpbi1iZXR3ZWVuIHRoZSBvbGQgc2l6ZSBhbmQgdGhlIHJlcXVlc3RlZCBzaXplIGFyZSBsZWZ0IHdpdGggYSAKLSAgICAgKiBwbGFjZWhvbGRlciB0aGF0IGlzIHJlcGxhY2VkIHdpdGggYSBmYWN0b3J5IG9iamVjdCB3aGVuIHJlcXVlc3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byByZXRyaWV2ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICBpbnQgc2l6ZSA9IGdldExpc3QoKS5zaXplKCk7Ci0gICAgICAgIGlmIChpbmRleCA8IHNpemUpIHsKLSAgICAgICAgICAgIC8vIHdpdGhpbiBib3VuZHMsIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0TGlzdCgpLmdldChpbmRleCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpdGVtIGlzIGEgcGxhY2UgaG9sZGVyLCBjcmVhdGUgbmV3IG9uZSwgc2V0IGFuZCByZXR1cm4KLSAgICAgICAgICAgICAgICBvYmplY3QgPSBmYWN0b3J5LmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGdldExpc3QoKS5zZXQoaW5kZXgsIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZ29vZCBhbmQgcmVhZHkgdG8gZ28KLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBncm93IHRoZSBsaXN0Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gc2l6ZTsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRMaXN0KCkuYWRkKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY3JlYXRlIG91ciBsYXN0IG9iamVjdCwgc2V0IGFuZCByZXR1cm4KLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBmYWN0b3J5LmNyZWF0ZSgpOwotICAgICAgICAgICAgZ2V0TGlzdCgpLmFkZChvYmplY3QpOwotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotICAgICAgICBMaXN0IHN1YiA9IGdldExpc3QoKS5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0gICAgICAgIHJldHVybiBuZXcgTGF6eUxpc3Qoc3ViLCBmYWN0b3J5KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L05vZGVDYWNoaW5nTGlua2VkTGlzdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvTm9kZUNhY2hpbmdMaW5rZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkYTEyZWYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvTm9kZUNhY2hpbmdMaW5rZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEEgPGNvZGU+TGlzdDwvY29kZT4gaW1wbGVtZW50YXRpb24gdGhhdCBzdG9yZXMgYSBjYWNoZSBvZiBpbnRlcm5hbCBOb2RlIG9iamVjdHMKLSAqIGluIGFuIGVmZm9ydCB0byByZWR1Y2Ugd2FzdGVmdWwgb2JqZWN0IGNyZWF0aW9uLgotICogPHA+Ci0gKiBBIGxpbmtlZCBsaXN0IGNyZWF0ZXMgb25lIE5vZGUgZm9yIGVhY2ggaXRlbSBvZiBkYXRhIGFkZGVkLiBUaGlzIGNhbiByZXN1bHQgaW4KLSAqIGEgbG90IG9mIG9iamVjdCBjcmVhdGlvbiBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHNlZWtzIHRvCi0gKiBhdm9pZCB0aGF0IGJ5IG1haW50YWluaW5nIGEgc3RvcmUgb2YgY2FjaGVkIG5vZGVzLgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1aXRhYmxlIGZvciBsb25nLWxpdmVkIGxpc3RzIHdoZXJlIGJvdGggYWRkIGFuZCByZW1vdmUKLSAqIGFyZSB1c2VkLiBTaG9ydC1saXZlZCBsaXN0cywgb3IgbGlzdHMgd2hpY2ggb25seSBncm93IHdpbGwgaGF2ZSB3b3JzZSBwZXJmb3JtYW5jZQotICogdXNpbmcgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogPGI+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L2I+Ci0gKiAKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMSAkCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBWYXJzemVnaQotICogQGF1dGhvciBSaWNoIERvdWdoZXJ0eQotICogQGF1dGhvciBQaGlsIFN0ZWl0egotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDYWNoaW5nTGlua2VkTGlzdCBleHRlbmRzIEFic3RyYWN0TGlua2VkTGlzdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg5Nzc4OTE3ODU2MjIzMjA3M0w7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3Ige0BsaW5rICNtYXhpbXVtQ2FjaGVTaXplfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWElNVU1fQ0FDSEVfU0laRSA9IDIwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpcnN0IGNhY2hlZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBub2RlcyBhcmUgY2FjaGVkLgotICAgICAqIENhY2hlZCBub2RlcyBhcmUgc3RvcmVkIGluIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGgKLSAgICAgKiA8Y29kZT5uZXh0PC9jb2RlPiBwb2ludGluZyB0byB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTm9kZSBmaXJzdENhY2hlZE5vZGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IGNhY2hlU2l6ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgbWF4aW11bUNhY2hlU2l6ZTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGNyZWF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIE5vZGVDYWNoaW5nTGlua2VkTGlzdCgpIHsKLSAgICAgICAgdGhpcyhERUZBVUxUX01BWElNVU1fQ0FDSEVfU0laRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBjb3BpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUNhY2hpbmdMaW5rZWRMaXN0KENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzdXBlcihjb2xsKTsKLSAgICAgICAgdGhpcy5tYXhpbXVtQ2FjaGVTaXplID0gREVGQVVMVF9NQVhJTVVNX0NBQ0hFX1NJWkU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgc3BlY2llcyB0aGUgbWF4aW11bSBjYWNoZSBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIG1heGltdW1DYWNoZVNpemUgIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUNhY2hpbmdMaW5rZWRMaXN0KGludCBtYXhpbXVtQ2FjaGVTaXplKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWF4aW11bUNhY2hlU2l6ZSA9IG1heGltdW1DYWNoZVNpemU7Ci0gICAgICAgIGluaXQoKTsgIC8vIG11c3QgY2FsbCBpbml0KCkgYXMgdXNlIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBjYWNoZSBzaXplCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRNYXhpbXVtQ2FjaGVTaXplKCkgewotICAgICAgICByZXR1cm4gbWF4aW11bUNhY2hlU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXhpbXVtQ2FjaGVTaXplICB0aGUgbmV3IG1heGltdW0gY2FjaGUgc2l6ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1heGltdW1DYWNoZVNpemUoaW50IG1heGltdW1DYWNoZVNpemUpIHsKLSAgICAgICAgdGhpcy5tYXhpbXVtQ2FjaGVTaXplID0gbWF4aW11bUNhY2hlU2l6ZTsKLSAgICAgICAgc2hyaW5rQ2FjaGVUb01heGltdW1TaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVkdWNlIHRoZSBzaXplIG9mIHRoZSBjYWNoZSB0byB0aGUgbWF4aW11bSwgaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNocmlua0NhY2hlVG9NYXhpbXVtU2l6ZSgpIHsKLSAgICAgICAgLy8gUmljaCBEb3VnaGVydHk6IFRoaXMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQuCi0gICAgICAgIHdoaWxlIChjYWNoZVNpemUgPiBtYXhpbXVtQ2FjaGVTaXplKSB7Ci0gICAgICAgICAgICBnZXROb2RlRnJvbUNhY2hlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5vZGUgZnJvbSB0aGUgY2FjaGUuIElmIGEgbm9kZSBpcyByZXR1cm5lZCwgdGhlbiB0aGUgdmFsdWUgb2YKLSAgICAgKiB7QGxpbmsgI2NhY2hlU2l6ZX0gaXMgZGVjcmVhc2VkIGFjY29yZGluZ2x5LiBUaGUgbm9kZSB0aGF0IGlzIHJldHVybmVkCi0gICAgICogd2lsbCBoYXZlIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcyBmb3IgbmV4dCwgcHJldmlvdXMgYW5kIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG5vZGVzIGluIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZSBnZXROb2RlRnJvbUNhY2hlKCkgewotICAgICAgICBpZiAoY2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgY2FjaGVkTm9kZSA9IGZpcnN0Q2FjaGVkTm9kZTsKLSAgICAgICAgZmlyc3RDYWNoZWROb2RlID0gY2FjaGVkTm9kZS5uZXh0OwotICAgICAgICBjYWNoZWROb2RlLm5leHQgPSBudWxsOyAvLyBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIGFueXdheSwgYnV0IGRlZmVuc2l2ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpdCB0byBudWxsLiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNhY2hlU2l6ZS0tOwotICAgICAgICByZXR1cm4gY2FjaGVkTm9kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhY2hlIGlzIGZ1bGwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWNoZSBpcyBmdWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDYWNoZUZ1bGwoKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZVNpemUgPj0gbWF4aW11bUNhY2hlU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5vZGUgdG8gdGhlIGNhY2hlLCBpZiB0aGUgY2FjaGUgaXNuJ3QgZnVsbC4KLSAgICAgKiBUaGUgbm9kZSdzIGNvbnRlbnRzIGFyZSBjbGVhcmVkIHRvIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlICB0aGUgbm9kZSB0byBhZGQgdG8gdGhlIGNhY2hlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTm9kZVRvQ2FjaGUoTm9kZSBub2RlKSB7Ci0gICAgICAgIGlmIChpc0NhY2hlRnVsbCgpKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBjYWNoZSB0aGUgbm9kZS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBjbGVhciB0aGUgbm9kZSdzIGNvbnRlbnRzIGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlLgotICAgICAgICBOb2RlIG5leHRDYWNoZWROb2RlID0gZmlyc3RDYWNoZWROb2RlOwotICAgICAgICBub2RlLnByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgbm9kZS5uZXh0ID0gbmV4dENhY2hlZE5vZGU7Ci0gICAgICAgIG5vZGUuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIGZpcnN0Q2FjaGVkTm9kZSA9IG5vZGU7Ci0gICAgICAgIGNhY2hlU2l6ZSsrOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBub2RlLCBlaXRoZXIgYnkgcmV1c2luZyBvbmUgZnJvbSB0aGUgY2FjaGUgb3IgY3JlYXRpbmcKLSAgICAgKiBhIG5ldyBvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSBvZiB0aGUgbmV3IG5vZGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZSBjcmVhdGVOb2RlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBOb2RlIGNhY2hlZE5vZGUgPSBnZXROb2RlRnJvbUNhY2hlKCk7Ci0gICAgICAgIGlmIChjYWNoZWROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVOb2RlKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlZE5vZGUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE5vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBub2RlIGZyb20gdGhlIGxpc3QsIHN0b3JpbmcgaXQgaW4gdGhlIGNhY2hlIGZvciByZXVzZQotICAgICAqIGlmIHRoZSBjYWNoZSBpcyBub3QgeWV0IGZ1bGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUgIHRoZSBub2RlIHRvIHJlbW92ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGUoTm9kZSBub2RlKSB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZU5vZGUobm9kZSk7Ci0gICAgICAgIGFkZE5vZGVUb0NhY2hlKG5vZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgbm9kZXMgZnJvbSB0aGUgbGlzdCwgc3RvcmluZyBhcyBtYW55IGFzIHJlcXVpcmVkIGluIHRoZQotICAgICAqIGNhY2hlIGZvciByZXVzZS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxOb2RlcygpIHsKLSAgICAgICAgLy8gQWRkIHRoZSByZW1vdmVkIG5vZGVzIHRvIHRoZSBjYWNoZSwgdGhlbiByZW1vdmUgdGhlIHJlc3QuCi0gICAgICAgIC8vIFdlIGNhbiBhZGQgdGhlbSB0byB0aGUgY2FjaGUgYmVmb3JlIHJlbW92aW5nIHRoZW0sIHNpbmNlCi0gICAgICAgIC8vIHtAbGluayBBYnN0cmFjdExpbmtlZExpc3QucmVtb3ZlQWxsTm9kZXMoKX0gcmVtb3ZlcyB0aGUKLSAgICAgICAgLy8gbm9kZXMgYnkgcmVtb3ZpbmcgcmVmZXJlbmNlcyBkaXJlY3RseSBmcm9tIHtAbGluayAjaGVhZGVyfS4KLSAgICAgICAgaW50IG51bWJlck9mTm9kZXNUb0NhY2hlID0gTWF0aC5taW4oc2l6ZSwgbWF4aW11bUNhY2hlU2l6ZSAtIGNhY2hlU2l6ZSk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGhlYWRlci5uZXh0OwotICAgICAgICBmb3IgKGludCBjdXJyZW50SW5kZXggPSAwOyBjdXJyZW50SW5kZXggPCBudW1iZXJPZk5vZGVzVG9DYWNoZTsgY3VycmVudEluZGV4KyspIHsKLSAgICAgICAgICAgIE5vZGUgb2xkTm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OwotICAgICAgICAgICAgYWRkTm9kZVRvQ2FjaGUob2xkTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIucmVtb3ZlQWxsTm9kZXMoKTsgICAgICAgIAotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemVzIHRoZSBkYXRhIGhlbGQgaW4gdGhpcyBvYmplY3QgdG8gdGhlIHN0cmVhbSBzcGVjaWZpZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgZG9Xcml0ZU9iamVjdChvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2VyaWFsaXplcyB0aGUgZGF0YSBoZWxkIGluIHRoaXMgb2JqZWN0IHRvIHRoZSBzdHJlYW0gc3BlY2lmaWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBkb1JlYWRPYmplY3QoaW4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvUHJlZGljYXRlZExpc3QuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1ByZWRpY2F0ZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNDczYjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvUHJlZGljYXRlZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uUHJlZGljYXRlZENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5MaXN0PC9jb2RlPiB0byB2YWxpZGF0ZSB0aGF0IGFsbCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBsaXN0IGV4aXN0cyB0byBwcm92aWRlIHZhbGlkYXRpb24gZm9yIHRoZSBkZWNvcmF0ZWQgbGlzdC4KLSAqIEl0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgdG8gZGVjb3JhdGUgYW4gZW1wdHkgbGlzdC4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiA8cD4KLSAqIE9uZSB1c2FnZSB3b3VsZCBiZSB0byBlbnN1cmUgdGhhdCBubyBudWxsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0LgotICogPHByZT5MaXN0IGxpc3QgPSBQcmVkaWNhdGVkTGlzdC5kZWNvcmF0ZShuZXcgQXJyYXlMaXN0KCksIE5vdE51bGxQcmVkaWNhdGUuSU5TVEFOQ0UpOzwvcHJlPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICovCi1wdWJsaWMgY2xhc3MgUHJlZGljYXRlZExpc3QgZXh0ZW5kcyBQcmVkaWNhdGVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIExpc3QgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NzIyMDM5MjIzODk4NjU5MTAyTDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHByZWRpY2F0ZWQgKHZhbGlkYXRpbmcpIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHZhbGlkYXRpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxpc3QgY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBkZWNvcmF0ZShMaXN0IGxpc3QsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkTGlzdChsaXN0LCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGxpc3QgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3Qgb3IgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZWRMaXN0KExpc3QgbGlzdCwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcihsaXN0LCBwcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3QgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChMaXN0KSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5pbmRleE9mKG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5yZW1vdmUoaW5kZXgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgIGdldExpc3QoKS5hZGQoaW5kZXgsIG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb2xsLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZShpdC5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuYWRkQWxsKGluZGV4LCBjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRMaXN0SXRlcmF0b3IoZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcihpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuc2V0KGluZGV4LCBvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLSAgICAgICAgTGlzdCBzdWIgPSBnZXRMaXN0KCkuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRMaXN0KHN1YiwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBJdGVyYXRvciBmb3IgdGhlIFByZWRpY2F0ZWRMaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIFByZWRpY2F0ZWRMaXN0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgUHJlZGljYXRlZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgICAgIHN1cGVyKGl0ZXJhdG9yKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgICAgICBpdGVyYXRvci5hZGQob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKG9iamVjdCk7Ci0gICAgICAgICAgICBpdGVyYXRvci5zZXQob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU2V0VW5pcXVlTGlzdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU2V0VW5pcXVlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzc1Y2FhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1NldFVuaXF1ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYSA8Y29kZT5MaXN0PC9jb2RlPiB0byBlbnN1cmUgdGhhdCBubyBkdXBsaWNhdGVzIGFyZSBwcmVzZW50Ci0gKiBtdWNoIGxpa2UgYSA8Y29kZT5TZXQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGUgPGNvZGU+TGlzdDwvY29kZT4gaW50ZXJmYWNlIG1ha2VzIGNlcnRhaW4gYXNzdW1wdGlvbnMvcmVxdWlyZW1lbnRzLgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBicmVha3MgdGhlc2UgaW4gY2VydGFpbiB3YXlzLCBidXQgdGhpcyBpcyBtZXJlbHkgdGhlCi0gKiByZXN1bHQgb2YgcmVqZWN0aW5nIGR1cGxpY2F0ZXMuCi0gKiBFYWNoIHZpb2xhdGlvbiBpcyBleHBsYWluZWQgaW4gdGhlIG1ldGhvZCwgYnV0IGl0IHNob3VsZCBub3QgYWZmZWN0IHlvdS4KLSAqIEJlYXIgaW4gbWluZCB0aGF0IFNldHMgcmVxdWlyZSBpbW11dGFibGUgb2JqZWN0cyB0byBmdW5jdGlvbiBjb3JyZWN0bHkuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5MaXN0T3JkZXJlZFNldCBMaXN0T3JkZXJlZFNldH0KLSAqIGNsYXNzIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCBieSB3cmFwcGluZyBhbiBleGlzdGluZyBTZXQgYW5kCi0gKiByZXRhaW5pbmcgaW5zZXJ0aW9uIG9yZGVyIGluIHRoZSBpdGVyYXRvci4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICogCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBUb20gRHVuaGFtCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRVbmlxdWVMaXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTk2OTgyMTg2MTUzNDc4Njk0TDsKLQotICAgIC8qKgotICAgICAqIEludGVybmFsIFNldCB0byBtYWludGFpbiB1bmlxdWVuZXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQgc2V0OwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgU2V0TGlzdCB1c2luZyB0aGUgc3VwcGxpZWQgbGlzdCB0byByZXRhaW4gb3JkZXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGxpc3QgY29udGFpbnMgZHVwbGljYXRlcywgdGhlc2UgYXJlIHJlbW92ZWQgKGZpcnN0IGluZGV4ZWQgb25lIGtlcHQpLgotICAgICAqIEEgPGNvZGU+SGFzaFNldDwvY29kZT4gaXMgdXNlZCBmb3IgdGhlIHNldCBiZWhhdmlvdXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXRVbmlxdWVMaXN0IGRlY29yYXRlKExpc3QgbGlzdCkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2V0VW5pcXVlTGlzdChsaXN0LCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QobGlzdCk7Ci0gICAgICAgICAgICBsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBTZXRVbmlxdWVMaXN0IHNsID0gbmV3IFNldFVuaXF1ZUxpc3QobGlzdCwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgICAgICBzbC5hZGRBbGwodGVtcCk7Ci0gICAgICAgICAgICByZXR1cm4gc2w7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykgdGhlIExpc3QgYW5kIHNwZWNpZmllcyB0aGUgc2V0IHRvIHVzZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2V0IGFuZCBsaXN0IG11c3QgYm90aCBiZSBjb3JyZWN0bHkgaW5pdGlhbGlzZWQgdG8gdGhlIHNhbWUgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2V0VW5pcXVlTGlzdChMaXN0IGxpc3QsIFNldCBzZXQpIHsKLSAgICAgICAgc3VwZXIobGlzdCk7Ci0gICAgICAgIGlmIChzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2V0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldCA9IHNldDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB1bm1vZGlmaWFibGUgdmlldyBhcyBhIFNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBzZXQgdmlldwotICAgICAqLwotICAgIHB1YmxpYyBTZXQgYXNTZXQoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCi0gICAgICogPHA+Ci0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogVGhlIDxjb2RlPkxpc3Q8L2NvZGU+IGludGVyZmFjZSByZXF1aXJlcyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBhbHdheXMuIEhvd2V2ZXIgdGhpcyBjbGFzcyBtYXkgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqIGJlY2F1c2Ugb2YgdGhlIDxjb2RlPlNldDwvY29kZT4gYmVoYXZpb3VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0IHdhcyBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIC8vIGdldHMgaW5pdGlhbCBzaXplCi0gICAgICAgIGZpbmFsIGludCBzaXplQmVmb3JlID0gc2l6ZSgpOwotCi0gICAgICAgIC8vIGFkZHMgZWxlbWVudCBpZiB1bmlxdWUKLSAgICAgICAgYWRkKHNpemUoKSwgb2JqZWN0KTsKLQotICAgICAgICAvLyBjb21wYXJlcyBzaXplcyB0byBkZXRlY3QgaWYgY29sbGVjdGlvbiBjaGFuZ2VkCi0gICAgICAgIHJldHVybiAoc2l6ZUJlZm9yZSAhPSBzaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZWxlbWVudCB0byBhIHNwZWNpZmljIGluZGV4IGluIHRoZSBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCi0gICAgICogPHA+Ci0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogVGhlIDxjb2RlPkxpc3Q8L2NvZGU+IGludGVyZmFjZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlbGVtZW50IGlzCi0gICAgICogYWx3YXlzIGluc2VydGVkLiBUaGlzIG1heSBub3QgaGFwcGVuIHdpdGggdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBpbnNlcnQgYXQKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgLy8gYWRkcyBlbGVtZW50IGlmIGl0IGlzIG5vdCBjb250YWluZWQgYWxyZWFkeQotICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKG9iamVjdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKLSAgICAgICAgICAgIHNldC5hZGQob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCi0gICAgICogPHA+Ci0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogVGhlIDxjb2RlPkxpc3Q8L2NvZGU+IGludGVyZmFjZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlbGVtZW50IGlzCi0gICAgICogYWx3YXlzIGluc2VydGVkLiBUaGlzIG1heSBub3QgaGFwcGVuIHdpdGggdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sbCAgdGhlIGNvbGxlY3Rpb24gdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gYWRkQWxsKHNpemUoKSwgY29sbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGF2b2lkaW5nIGR1cGxpY2F0ZXMuCi0gICAgICogPHA+Ci0gICAgICogT25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBhZGRlZCwgYW5kCi0gICAgICogZHVwbGljYXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogPHA+Ci0gICAgICogPGk+KFZpb2xhdGlvbik8L2k+Ci0gICAgICogVGhlIDxjb2RlPkxpc3Q8L2NvZGU+IGludGVyZmFjZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlbGVtZW50cwotICAgICAqIGFyZSBhbHdheXMgaW5zZXJ0ZWQuIFRoaXMgbWF5IG5vdCBoYXBwZW4gd2l0aCB0aGlzIGltcGxlbWVudGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGluc2VydCBhdAotICAgICAqIEBwYXJhbSBjb2xsICB0aGUgY29sbGVjdGlvbiB0byBhZGQgaW4gaXRlcmF0b3Igb3JkZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjb2xsZWN0aW9uIGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgLy8gZ2V0cyBpbml0aWFsIHNpemUKLSAgICAgICAgZmluYWwgaW50IHNpemVCZWZvcmUgPSBzaXplKCk7Ci0KLSAgICAgICAgLy8gYWRkcyBhbGwgZWxlbWVudHMKLSAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYWRkKGl0Lm5leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wYXJlcyBzaXplcyB0byBkZXRlY3QgaWYgY29sbGVjdGlvbiBjaGFuZ2VkCi0gICAgICAgIHJldHVybiBzaXplQmVmb3JlICE9IHNpemUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhdm9pZGluZyBkdXBsaWNhdGVzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBvYmplY3QgaXMgc2V0IGludG8gdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiBBZnRlcndhcmRzLCBhbnkgcHJldmlvdXMgZHVwbGljYXRlIGlzIHJlbW92ZWQKLSAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0IHRoZW4gYSBub3JtYWwgc2V0IG9jY3Vycy4KLSAgICAgKiBJZiBpdCBpcyBwcmVzZW50LCB0aGVuIHRoZSBvbGQgdmVyc2lvbiBpcyByZW1vdmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGluc2VydCBhdAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gc2V0Ci0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGludCBwb3MgPSBpbmRleE9mKG9iamVjdCk7Ci0gICAgICAgIE9iamVjdCByZW1vdmVkID0gc3VwZXIuc2V0KGluZGV4LCBvYmplY3QpOwotICAgICAgICBpZiAocG9zID09IC0xIHx8IHBvcyA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgdW5pcSBsaXN0Ci0gICAgICAgIC8vIChhbmQgaXQgaGFzbid0IGJlZW4gc3dhcHBlZCB3aXRoIGl0c2VsZikKLSAgICAgICAgc3VwZXIucmVtb3ZlKHBvcyk7ICAvLyByZW1vdmUgdGhlIGR1cGxpY2F0ZSBieSBpbmRleAotICAgICAgICBzZXQucmVtb3ZlKHJlbW92ZWQpOyAgLy8gcmVtb3ZlIHRoZSBpdGVtIGRlbGV0ZWQgYnkgdGhlIHNldAotICAgICAgICByZXR1cm4gcmVtb3ZlZDsgIC8vIHJldHVybiB0aGUgaXRlbSBkZWxldGVkIGJ5IHRoZSBzZXQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnJlbW92ZShvYmplY3QpOwotICAgICAgICBzZXQucmVtb3ZlKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotICAgICAgICBzZXQucmVtb3ZlKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnJlbW92ZUFsbChjb2xsKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChjb2xsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucmV0YWluQWxsKGNvbGwpOwotICAgICAgICBzZXQucmV0YWluQWxsKGNvbGwpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBzdXBlci5jbGVhcigpOwotICAgICAgICBzZXQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBzZXQuY29udGFpbnMob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIHNldC5jb250YWluc0FsbChjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2V0TGlzdEl0ZXJhdG9yKHN1cGVyLml0ZXJhdG9yKCksIHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2V0TGlzdExpc3RJdGVyYXRvcihzdXBlci5saXN0SXRlcmF0b3IoKSwgc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXRMaXN0TGlzdEl0ZXJhdG9yKHN1cGVyLmxpc3RJdGVyYXRvcihpbmRleCksIHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotICAgICAgICByZXR1cm4gbmV3IFNldFVuaXF1ZUxpc3Qoc3VwZXIuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpLCBzZXQpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgU2V0TGlzdEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0IHNldDsKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBsYXN0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBTZXRMaXN0SXRlcmF0b3IoSXRlcmF0b3IgaXQsIFNldCBzZXQpIHsKLSAgICAgICAgICAgIHN1cGVyKGl0KTsKLSAgICAgICAgICAgIHRoaXMuc2V0ID0gc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gc3VwZXIubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTsKLSAgICAgICAgICAgIHNldC5yZW1vdmUobGFzdCk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgU2V0TGlzdExpc3RJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBTZXQgc2V0OwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGxhc3QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFNldExpc3RMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yIGl0LCBTZXQgc2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihpdCk7Ci0gICAgICAgICAgICB0aGlzLnNldCA9IHNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgbGFzdCA9IHN1cGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIGxhc3QgPSBzdXBlci5wcmV2aW91cygpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTsKLSAgICAgICAgICAgIHNldC5yZW1vdmUobGFzdCk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKG9iamVjdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5hZGQob2JqZWN0KTsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkxpc3RJdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHNldCIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU3luY2hyb25pemVkTGlzdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvU3luY2hyb25pemVkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNWQ1OTZiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1N5bmNocm9uaXplZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uU3luY2hyb25pemVkQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5MaXN0PC9jb2RlPiB0byBzeW5jaHJvbml6ZSBpdHMgYmVoYXZpb3VyCi0gKiBmb3IgYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgc3luY2hyb25pemVkLCB0aGVuIGZvcndhcmRlZCB0byB0aGUgZGVjb3JhdGVkIGxpc3QuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZExpc3QgZXh0ZW5kcyBTeW5jaHJvbml6ZWRDb2xsZWN0aW9uIGltcGxlbWVudHMgTGlzdCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDAzODM1NDQ3MzI4NjE5NDM3TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHN5bmNocm9uaXplZCBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3QgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBkZWNvcmF0ZShMaXN0IGxpc3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRMaXN0KGxpc3QpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNocm9uaXplZExpc3QoTGlzdCBsaXN0KSB7Ci0gICAgICAgIHN1cGVyKGxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBsb2NrICB0aGUgbG9jayB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3luY2hyb25pemVkTGlzdChMaXN0IGxpc3QsIE9iamVjdCBsb2NrKSB7Ci0gICAgICAgIHN1cGVyKGxpc3QsIGxvY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlY29yYXRlZCBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChMaXN0KSBjb2xsZWN0aW9uOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgZ2V0TGlzdCgpLmFkZChpbmRleCwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMaXN0KCkuYWRkQWxsKGluZGV4LCBjb2xsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMaXN0KCkuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGdldExpc3QoKS5pbmRleE9mKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdGVyYXRvcnMgbXVzdCBiZSBtYW51YWxseSBzeW5jaHJvbml6ZWQuCi0gICAgICogPHByZT4KLSAgICAgKiBzeW5jaHJvbml6ZWQgKGNvbGwpIHsKLSAgICAgKiAgIExpc3RJdGVyYXRvciBpdCA9IGNvbGwubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICogICAvLyBkbyBzdHVmZiB3aXRoIGl0ZXJhdG9yCi0gICAgICogfQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZCBvbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdG9ycyBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZC4KLSAgICAgKiA8cHJlPgotICAgICAqIHN5bmNocm9uaXplZCAoY29sbCkgewotICAgICAqICAgTGlzdEl0ZXJhdG9yIGl0ID0gY29sbC5saXN0SXRlcmF0b3IoMyk7Ci0gICAgICogICAvLyBkbyBzdHVmZiB3aXRoIGl0ZXJhdG9yCi0gICAgICogfQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBtdXN0IGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZCBvbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcihpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGdldExpc3QoKS5yZW1vdmUoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGdldExpc3QoKS5zZXQoaW5kZXgsIG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdCgpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLSAgICAgICAgICAgIC8vIHRoZSBsb2NrIGlzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBzdWJsaXN0IGlzCi0gICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgb24gdGhlIHNhbWUgbG9jayBhcyB0aGUgcGFyZW50IGxpc3QKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY2hyb25pemVkTGlzdChsaXN0LCBsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJhbnNmb3JtZWRMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmFuc2Zvcm1lZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyMTJiNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9UcmFuc2Zvcm1lZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlRyYW5zZm9ybWVkQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkFic3RyYWN0TGlzdEl0ZXJhdG9yRGVjb3JhdG9yOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIHRyYW5zZm9ybSBvYmplY3RzIHRoYXQgYXJlIGFkZGVkLgotICogPHA+Ci0gKiBUaGUgYWRkIGFuZCBzZXQgbWV0aG9kcyBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjbGFzcy4KLSAqIFRodXMgb2JqZWN0cyBtdXN0IGJlIHJlbW92ZWQgb3Igc2VhcmNoZWQgZm9yIHVzaW5nIHRoZWlyIHRyYW5zZm9ybWVkIGZvcm0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNvbnZlcnRzIFN0cmluZ3MgdG8gSW50ZWdlcnMsIHlvdSBtdXN0Ci0gKiB1c2UgdGhlIEludGVnZXIgZm9ybSB0byByZW1vdmUgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtZWRMaXN0IGV4dGVuZHMgVHJhbnNmb3JtZWRDb2xsZWN0aW9uIGltcGxlbWVudHMgTGlzdCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTA3NzE5MzAzNTAwMDAxMzE0MUw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0cmFuc2Zvcm1pbmcgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGxpc3QgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIGNvbnZlcnNpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZGVjb3JhdGUoTGlzdCBsaXN0LCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkTGlzdChsaXN0LCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGxpc3QgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIGNvbnZlcnNpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IG9yIHRyYW5zZm9ybWVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNmb3JtZWRMaXN0KExpc3QgbGlzdCwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgc3VwZXIobGlzdCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlY29yYXRlZCBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChMaXN0KSBjb2xsZWN0aW9uOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkuaW5kZXhPZihvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCkucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBvYmplY3QgPSB0cmFuc2Zvcm0ob2JqZWN0KTsKLSAgICAgICAgZ2V0TGlzdCgpLmFkZChpbmRleCwgb2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgY29sbCA9IHRyYW5zZm9ybShjb2xsKTsKLSAgICAgICAgcmV0dXJuIGdldExpc3QoKS5hZGRBbGwoaW5kZXgsIGNvbGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKDApOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRMaXN0SXRlcmF0b3IoZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcihpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG9iamVjdCA9IHRyYW5zZm9ybShvYmplY3QpOwotICAgICAgICByZXR1cm4gZ2V0TGlzdCgpLnNldChpbmRleCwgb2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0gICAgICAgIExpc3Qgc3ViID0gZ2V0TGlzdCgpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lZExpc3Qoc3ViLCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgSXRlcmF0b3IgZm9yIHRoZSBUcmFuc2Zvcm1lZExpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgVHJhbnNmb3JtZWRMaXN0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdExpc3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgVHJhbnNmb3JtZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihpdGVyYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICBvYmplY3QgPSB0cmFuc2Zvcm0ob2JqZWN0KTsKLSAgICAgICAgICAgIGl0ZXJhdG9yLmFkZChvYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgICAgb2JqZWN0ID0gdHJhbnNmb3JtKG9iamVjdCk7Ci0gICAgICAgICAgICBpdGVyYXRvci5zZXQob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1RyZWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMGUzN2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHJlZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA0LTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpc3Q8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgaXMgb3B0aW1pc2VkIGZvciBmYXN0IGluc2VydGlvbnMgYW5kCi0gKiByZW1vdmFscyBhdCBhbnkgaW5kZXggaW4gdGhlIGxpc3QuCi0gKiA8cD4KLSAqIFRoaXMgbGlzdCBpbXBsZW1lbnRhdGlvbiB1dGlsaXNlcyBhIHRyZWUgc3RydWN0dXJlIGludGVybmFsbHkgdG8gZW5zdXJlIHRoYXQKLSAqIGFsbCBpbnNlcnRpb25zIGFuZCByZW1vdmFscyBhcmUgTyhsb2cgbikuIFRoaXMgcHJvdmlkZXMgbXVjaCBmYXN0ZXIgcGVyZm9ybWFuY2UKLSAqIHRoYW4gYm90aCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IGFuZCBhIDxjb2RlPkxpbmtlZExpc3Q8L2NvZGU+IHdoZXJlIGVsZW1lbnRzCi0gKiBhcmUgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQgcmVwZWF0ZWRseSBmcm9tIGFueXdoZXJlIGluIHRoZSBsaXN0LgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHJlbGF0aXZlIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgYXJlIGluZGljYXRpdmUgb2YgdGhpcyBjbGFzczoKLSAqIDxwcmU+Ci0gKiAgICAgICAgICAgICAgZ2V0ICBhZGQgIGluc2VydCAgaXRlcmF0ZSAgcmVtb3ZlCi0gKiBUcmVlTGlzdCAgICAgICAzICAgIDUgICAgICAgMSAgICAgICAyICAgICAgIDEKLSAqIEFycmF5TGlzdCAgICAgIDEgICAgMSAgICAgIDQwICAgICAgIDEgICAgICA0MAotICogTGlua2VkTGlzdCAgNTgwMCAgICAxICAgICAzNTAgICAgICAgMiAgICAgMzI1Ci0gKiA8L3ByZT4KLSAqIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gaXMgYSBnb29kIGdlbmVyYWwgcHVycG9zZSBsaXN0IGltcGxlbWVudGF0aW9uLgotICogSXQgaXMgZmFzdGVyIHRoYW4gPGNvZGU+VHJlZUxpc3Q8L2NvZGU+IGZvciBtb3N0IG9wZXJhdGlvbnMgZXhjZXB0IGluc2VydGluZwotICogYW5kIHJlbW92aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gYWxzbyB1c2VzIGxlc3MKLSAqIG1lbW9yeSBhcyA8Y29kZT5UcmVlTGlzdDwvY29kZT4gdXNlcyBvbmUgb2JqZWN0IHBlciBlbnRyeS4KLSAqIDxwPgotICogPGNvZGU+TGlua2VkTGlzdDwvY29kZT4gaXMgcmFyZWx5IGEgZ29vZCBjaG9pY2Ugb2YgaW1wbGVtZW50YXRpb24uCi0gKiA8Y29kZT5UcmVlTGlzdDwvY29kZT4gaXMgYWxtb3N0IGFsd2F5cyBhIGdvb2QgcmVwbGFjZW1lbnQgZm9yIGl0LCBhbHRob3VnaCBpdAotICogZG9lcyB1c2Ugc2xpZ3RseSBtb3JlIG1lbW9yeS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqCi0gKiBAYXV0aG9yIEpvZXJnIFNjaG11ZWNrZXIKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdCB7Ci0vLyAgICBhZGQ7IHRvQXJyYXk7IGl0ZXJhdG9yOyBpbnNlcnQ7IGdldDsgaW5kZXhPZjsgcmVtb3ZlCi0vLyAgICBUcmVlTGlzdCA9IDEyNjA7NzM2MDszMDgwOyAgMTYwOyAgIDE3MDszNDAwOyAgMTcwOwotLy8gICBBcnJheUxpc3QgPSAgMjIwOzE0ODA7MTc2MDsgNjg3MDsgICAgNTA7MTU0MDsgNzIwMDsKLS8vICBMaW5rZWRMaXN0ID0gIDI3MDs3MzYwOzMzNTA7NTU4NjA7MjkwNzIwOzI5MTA7NTUyMDA7Ci0KLSAgICAvKiogVGhlIHJvb3Qgbm9kZSBpbiB0aGUgQVZMIHRyZWUgKi8KLSAgICBwcml2YXRlIEFWTE5vZGUgcm9vdDsKLQotICAgIC8qKiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBsaXN0ICovCi0gICAgcHJpdmF0ZSBpbnQgc2l6ZTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFRyZWVMaXN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgbGlzdCB0aGF0IGNvcGllcyB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGwgIHRoZSBjb2xsZWN0aW9uIHRvIGNvcHkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJlZUxpc3QoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGFkZEFsbChjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIGNoZWNrSW50ZXJ2YWwoaW5kZXgsIDAsIHNpemUoKSAtIDEpOwotICAgICAgICByZXR1cm4gcm9vdC5nZXQoaW5kZXgpLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgLy8gb3ZlcnJpZGUgdG8gZ28gNzUlIGZhc3RlcgotICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBMaXN0SXRlcmF0b3Igb3ZlciB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgLy8gb3ZlcnJpZGUgdG8gZ28gNzUlIGZhc3RlcgotICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBMaXN0SXRlcmF0b3Igb3ZlciB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbUluZGV4ICB0aGUgaW5kZXggdG8gc3RhcnQgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGludCBmcm9tSW5kZXgpIHsKLSAgICAgICAgLy8gb3ZlcnJpZGUgdG8gZ28gNzUlIGZhc3RlcgotICAgICAgICAvLyBjYW5ub3QgdXNlIEVtcHR5SXRlcmF0b3IgYXMgaXRlcmF0b3IuYWRkKCkgbXVzdCB3b3JrCi0gICAgICAgIGNoZWNrSW50ZXJ2YWwoZnJvbUluZGV4LCAwLCBzaXplKCkpOwotICAgICAgICByZXR1cm4gbmV3IFRyZWVMaXN0SXRlcmF0b3IodGhpcywgZnJvbUluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGluZGV4IG9mIGFuIG9iamVjdCBpbiB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0LCAtMSBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAvLyBvdmVycmlkZSB0byBnbyA3NSUgZmFzdGVyCi0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdC5pbmRleE9mKG9iamVjdCwgcm9vdC5yZWxhdGl2ZVBvc2l0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIG9iamVjdCBpbiB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIChpbmRleE9mKG9iamVjdCkgPj0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGxpc3QgaW50byBhbiBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IGFzIGFuIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIC8vIG92ZXJyaWRlIHRvIGdvIDIwJSBmYXN0ZXIKLSAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBuZXcgT2JqZWN0W3NpemUoKV07Ci0gICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3QudG9BcnJheShhcnJheSwgcm9vdC5yZWxhdGl2ZVBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0byB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBhZGQgYmVmb3JlCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIGVsZW1lbnQgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICBjaGVja0ludGVydmFsKGluZGV4LCAwLCBzaXplKCkpOwotICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByb290ID0gbmV3IEFWTE5vZGUoaW5kZXgsIG9iaiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByb290ID0gcm9vdC5pbnNlcnQoaW5kZXgsIG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBzZXQKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIHN0b3JlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBvYmplY3QgYXQgdGhhdCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBjaGVja0ludGVydmFsKGluZGV4LCAwLCBzaXplKCkgLSAxKTsKLSAgICAgICAgQVZMTm9kZSBub2RlID0gcm9vdC5nZXQoaW5kZXgpOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gbm9kZS52YWx1ZTsKLSAgICAgICAgbm9kZS5zZXRWYWx1ZShvYmopOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBvYmplY3QgYXQgdGhhdCBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICBjaGVja0ludGVydmFsKGluZGV4LCAwLCBzaXplKCkgLSAxKTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldChpbmRleCk7Ci0gICAgICAgIHJvb3QgPSByb290LnJlbW92ZShpbmRleCk7Ci0gICAgICAgIHNpemUtLTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGxpc3QsIHJlbW92aW5nIGFsbCBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICByb290ID0gbnVsbDsKLSAgICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBpbmRleCBpcyB2YWxpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBjaGVjawotICAgICAqIEBwYXJhbSBzdGFydEluZGV4ICB0aGUgZmlyc3QgYWxsb3dlZCBpbmRleAotICAgICAqIEBwYXJhbSBlbmRJbmRleCAgdGhlIGxhc3QgYWxsb3dlZCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0ludGVydmFsKGludCBpbmRleCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotICAgICAgICBpZiAoaW5kZXggPCBzdGFydEluZGV4IHx8IGluZGV4ID4gZW5kSW5kZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbnZhbGlkIGluZGV4OiIgKyBpbmRleCArICIsIHNpemU9IiArIHNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50cyBhbiBBVkxOb2RlIHdoaWNoIGtlZXBzIHRoZSBvZmZzZXQgdXBkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG5vZGUgY29udGFpbnMgdGhlIHJlYWwgd29yay4KLSAgICAgKiBUcmVlTGlzdCBpcyBqdXN0IHRoZXJlIHRvIGltcGxlbWVudCB7QGxpbmsgamF2YS51dGlsLkxpc3R9LgotICAgICAqIFRoZSBub2RlcyBkb24ndCBrbm93IHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHRoZXkgYXJlIGhvbGRpbmcuICBUaGV5Ci0gICAgICogZG8ga25vdyBob3dldmVyIHRoZWlyIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudCBub2RlLgotICAgICAqIFRoaXMgYWxsb3dzIHRvIGNhbGN1bGF0ZSB0aGUgaW5kZXggb2YgYSBub2RlIHdoaWxlIHRyYXZlcnNpbmcgdGhlIHRyZWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIEZhZWRlbHVuZyBjYWxjdWxhdGlvbiBzdG9yZXMgYSBmbGFnIGZvciBib3RoIHRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZAotICAgICAqIHRvIGluZGljYXRlIGlmIHRoZXkgYXJlIGEgY2hpbGQgKGZhbHNlKSBvciBhIGxpbmsgYXMgaW4gbGlua2VkIGxpc3QgKHRydWUpLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBBVkxOb2RlIHsKLSAgICAgICAgLyoqIFRoZSBsZWZ0IGNoaWxkIG5vZGUgb3IgdGhlIHByZWRlY2Vzc29yIGlmIHtAbGluayAjbGVmdElzUHJldmlvdXN9LiovCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSBsZWZ0OwotICAgICAgICAvKiogRmxhZyBpbmRpY2F0aW5nIHRoYXQgbGVmdCByZWZlcmVuY2UgaXMgbm90IGEgc3VidHJlZSBidXQgdGhlIHByZWRlY2Vzc29yLiAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGVmdElzUHJldmlvdXM7Ci0gICAgICAgIC8qKiBUaGUgcmlnaHQgY2hpbGQgbm9kZSBvciB0aGUgc3VjY2Vzc29yIGlmIHtAbGluayAjcmlnaHRJc05leHR9LiAqLwotICAgICAgICBwcml2YXRlIEFWTE5vZGUgcmlnaHQ7Ci0gICAgICAgIC8qKiBGbGFnIGluZGljYXRpbmcgdGhhdCByaWdodCByZWZlcmVuY2UgaXMgbm90IGEgc3VidHJlZSBidXQgdGhlIHN1Y2Nlc3Nvci4gKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJpZ2h0SXNOZXh0OwotICAgICAgICAvKiogSG93IG1hbnkgbGV2ZWxzIG9mIGxlZnQvcmlnaHQgYXJlIGJlbG93IHRoaXMgb25lLiAqLwotICAgICAgICBwcml2YXRlIGludCBoZWlnaHQ7Ci0gICAgICAgIC8qKiBUaGUgcmVsYXRpdmUgcG9zaXRpb24sIHJvb3QgaG9sZHMgYWJzb2x1dGUgcG9zaXRpb24uICovCi0gICAgICAgIHByaXZhdGUgaW50IHJlbGF0aXZlUG9zaXRpb247Ci0gICAgICAgIC8qKiBUaGUgc3RvcmVkIGVsZW1lbnQuICovCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgd2l0aCBhIHJlbGF0aXZlIHBvc2l0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHJlbGF0aXZlUG9zaXRpb24gIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgbm9kZQotICAgICAgICAgKiBAcGFyYW0gb2JqICB0aGUgdmFsdWUgZm9yIHRoZSBuZG9lCi0gICAgICAgICAqIEBwYXJhbSByaWdodEZvbGxvd2VyIHRoZSBub2RlIHdpdGggdGhlIHZhbHVlIGZvbGxvd2luZyB0aGlzIG9uZQotICAgICAgICAgKiBAcGFyYW0gbGVmdEZvbGxvd2VyIHRoZSBub2RlIHdpdGggdGhlIHZhbHVlIGxlYWRpbmcgdGhpcyBvbmUKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZShpbnQgcmVsYXRpdmVQb3NpdGlvbiwgT2JqZWN0IG9iaiwgQVZMTm9kZSByaWdodEZvbGxvd2VyLCBBVkxOb2RlIGxlZnRGb2xsb3dlcikgewotICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uID0gcmVsYXRpdmVQb3NpdGlvbjsKLSAgICAgICAgICAgIHZhbHVlID0gb2JqOwotICAgICAgICAgICAgcmlnaHRJc05leHQgPSB0cnVlOwotICAgICAgICAgICAgbGVmdElzUHJldmlvdXMgPSB0cnVlOwotICAgICAgICAgICAgcmlnaHQgPSByaWdodEZvbGxvd2VyOwotICAgICAgICAgICAgbGVmdCA9IGxlZnRGb2xsb3dlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgbm9kZQotICAgICAgICAgKi8KLSAgICAgICAgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHZhbHVlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG9iaiAgdGhlIHZhbHVlIHRvIHN0b3JlCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHNldFZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvYmo7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTG9jYXRlIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGluZGV4IHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgKiBvZmZzZXQgb2YgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCi0gICAgICAgICAqLwotICAgICAgICBBVkxOb2RlIGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBpbmRleFJlbGF0aXZlVG9NZSA9IGluZGV4IC0gcmVsYXRpdmVQb3NpdGlvbjsKLQotICAgICAgICAgICAgaWYgKGluZGV4UmVsYXRpdmVUb01lID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVZMTm9kZSBuZXh0Tm9kZSA9ICgoaW5kZXhSZWxhdGl2ZVRvTWUgPCAwKSA/IGdldExlZnRTdWJUcmVlKCkgOiBnZXRSaWdodFN1YlRyZWUoKSk7Ci0gICAgICAgICAgICBpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5leHROb2RlLmdldChpbmRleFJlbGF0aXZlVG9NZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTG9jYXRlIHRoZSBpbmRleCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGVmdFN1YlRyZWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGxlZnQuaW5kZXhPZihvYmplY3QsIGluZGV4ICsgbGVmdC5yZWxhdGl2ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgPyB2YWx1ZSA9PSBvYmplY3QgOiB2YWx1ZS5lcXVhbHMob2JqZWN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZXRSaWdodFN1YlRyZWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LmluZGV4T2Yob2JqZWN0LCBpbmRleCArIHJpZ2h0LnJlbGF0aXZlUG9zaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0b3JlcyB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIGludG8gdGhlIGFycmF5IHNwZWNpZmllZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhpcyBub2RlCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHRvQXJyYXkoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCkgewotICAgICAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7Ci0gICAgICAgICAgICBpZiAoZ2V0TGVmdFN1YlRyZWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGVmdC50b0FycmF5KGFycmF5LCBpbmRleCArIGxlZnQucmVsYXRpdmVQb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0UmlnaHRTdWJUcmVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJpZ2h0LnRvQXJyYXkoYXJyYXksIGluZGV4ICsgcmlnaHQucmVsYXRpdmVQb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgbmV4dCBub2RlIGluIHRoZSBsaXN0IGFmdGVyIHRoaXMgb25lLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbmV4dCBub2RlCi0gICAgICAgICAqLwotICAgICAgICBBVkxOb2RlIG5leHQoKSB7Ci0gICAgICAgICAgICBpZiAocmlnaHRJc05leHQgfHwgcmlnaHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByaWdodC5taW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBub2RlIGluIHRoZSBsaXN0IGJlZm9yZSB0aGlzIG9uZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIG5vZGUKLSAgICAgICAgICovCi0gICAgICAgIEFWTE5vZGUgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBpZiAobGVmdElzUHJldmlvdXMgfHwgbGVmdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGVmdC5tYXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnNlcnRzIGEgbm9kZSBhdCB0aGUgcG9zaXRpb24gaW5kZXguICAKLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBvZiAKLSAgICAgICAgICogdGhlIHBhcmVudCBub2RlLgotICAgICAgICAgKiBAcGFyYW0gb2JqIGlzIHRoZSBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSBwb3NpdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIEFWTE5vZGUgaW5zZXJ0KGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaW50IGluZGV4UmVsYXRpdmVUb01lID0gaW5kZXggLSByZWxhdGl2ZVBvc2l0aW9uOwotCi0gICAgICAgICAgICBpZiAoaW5kZXhSZWxhdGl2ZVRvTWUgPD0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRPbkxlZnQoaW5kZXhSZWxhdGl2ZVRvTWUsIG9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRPblJpZ2h0KGluZGV4UmVsYXRpdmVUb01lLCBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIGluc2VydE9uTGVmdChpbnQgaW5kZXhSZWxhdGl2ZVRvTWUsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIEFWTE5vZGUgcmV0ID0gdGhpczsKLQotICAgICAgICAgICAgaWYgKGdldExlZnRTdWJUcmVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldExlZnQobmV3IEFWTE5vZGUoLTEsIG9iaiwgdGhpcywgbGVmdCksIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRMZWZ0KGxlZnQuaW5zZXJ0KGluZGV4UmVsYXRpdmVUb01lLCBvYmopLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbGF0aXZlUG9zaXRpb24gPj0gMCkgewotICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IGJhbGFuY2UoKTsKLSAgICAgICAgICAgIHJlY2FsY0hlaWdodCgpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSBpbnNlcnRPblJpZ2h0KGludCBpbmRleFJlbGF0aXZlVG9NZSwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgQVZMTm9kZSByZXQgPSB0aGlzOwotCi0gICAgICAgICAgICBpZiAoZ2V0UmlnaHRTdWJUcmVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJpZ2h0KG5ldyBBVkxOb2RlKCsxLCBvYmosIHJpZ2h0LCB0aGlzKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFJpZ2h0KHJpZ2h0Lmluc2VydChpbmRleFJlbGF0aXZlVG9NZSwgb2JqKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVsYXRpdmVQb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICByZWxhdGl2ZVBvc2l0aW9uLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBiYWxhbmNlKCk7Ci0gICAgICAgICAgICByZWNhbGNIZWlnaHQoKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBsZWZ0IG5vZGUsIHJldHVybmluZyBudWxsIGlmIGl0cyBhIGZhZWRlbHVuZy4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSBnZXRMZWZ0U3ViVHJlZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobGVmdElzUHJldmlvdXMgPyBudWxsIDogbGVmdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcmlnaHQgbm9kZSwgcmV0dXJuaW5nIG51bGwgaWYgaXRzIGEgZmFlZGVsdW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIGdldFJpZ2h0U3ViVHJlZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAocmlnaHRJc05leHQgPyBudWxsIDogcmlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHJpZ2h0bW9zdCBjaGlsZCBvZiB0aGlzIG5vZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSByaWdodG1vc3QgY2hpbGQgKGdyZWF0ZXN0IGluZGV4KQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIG1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoZ2V0UmlnaHRTdWJUcmVlKCkgPT0gbnVsbCkgPyB0aGlzIDogcmlnaHQubWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgbGVmdG1vc3QgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbGVmdG1vc3QgY2hpbGQgKHNtYWxsZXN0IGluZGV4KQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIG1pbigpIHsKLSAgICAgICAgICAgIHJldHVybiAoZ2V0TGVmdFN1YlRyZWUoKSA9PSBudWxsKSA/IHRoaXMgOiBsZWZ0Lm1pbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgdGhlIG5vZGUgYXQgYSBnaXZlbiBwb3NpdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgcmVtb3ZlZCByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24gb2YgCi0gICAgICAgICAqIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlLgotICAgICAgICAgKi8KLSAgICAgICAgQVZMTm9kZSByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXhSZWxhdGl2ZVRvTWUgPSBpbmRleCAtIHJlbGF0aXZlUG9zaXRpb247Ci0KLSAgICAgICAgICAgIGlmIChpbmRleFJlbGF0aXZlVG9NZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZVNlbGYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleFJlbGF0aXZlVG9NZSA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXRSaWdodChyaWdodC5yZW1vdmUoaW5kZXhSZWxhdGl2ZVRvTWUpLCByaWdodC5yaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlUG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldExlZnQobGVmdC5yZW1vdmUoaW5kZXhSZWxhdGl2ZVRvTWUpLCBsZWZ0LmxlZnQpOwotICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBvc2l0aW9uLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjYWxjSGVpZ2h0KCk7Ci0gICAgICAgICAgICByZXR1cm4gYmFsYW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIHJlbW92ZU1heCgpIHsKLSAgICAgICAgICAgIGlmIChnZXRSaWdodFN1YlRyZWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZVNlbGYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFJpZ2h0KHJpZ2h0LnJlbW92ZU1heCgpLCByaWdodC5yaWdodCk7Ci0gICAgICAgICAgICBpZiAocmVsYXRpdmVQb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICByZWxhdGl2ZVBvc2l0aW9uKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNhbGNIZWlnaHQoKTsKLSAgICAgICAgICAgIHJldHVybiBiYWxhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEFWTE5vZGUgcmVtb3ZlTWluKCkgewotICAgICAgICAgICAgaWYgKGdldExlZnRTdWJUcmVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVTZWxmKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRMZWZ0KGxlZnQucmVtb3ZlTWluKCksIGxlZnQubGVmdCk7Ci0gICAgICAgICAgICBpZiAocmVsYXRpdmVQb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZWxhdGl2ZVBvc2l0aW9uLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNhbGNIZWlnaHQoKTsKLSAgICAgICAgICAgIHJldHVybiBiYWxhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVtb3ZlcyB0aGlzIG5vZGUgZnJvbSB0aGUgdHJlZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbm9kZSB0aGF0IHJlcGxhY2VzIHRoaXMgb25lIGluIHRoZSBwYXJlbnQKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSByZW1vdmVTZWxmKCkgewotICAgICAgICAgICAgaWYgKGdldFJpZ2h0U3ViVHJlZSgpID09IG51bGwgJiYgZ2V0TGVmdFN1YlRyZWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0UmlnaHRTdWJUcmVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgICAgICBsZWZ0LnJlbGF0aXZlUG9zaXRpb24gKz0gcmVsYXRpdmVQb3NpdGlvbiArIChyZWxhdGl2ZVBvc2l0aW9uID4gMCA/IDAgOiAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVmdC5tYXgoKS5zZXRSaWdodChudWxsLCByaWdodCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0TGVmdFN1YlRyZWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmlnaHQucmVsYXRpdmVQb3NpdGlvbiArPSByZWxhdGl2ZVBvc2l0aW9uIC0gKHJlbGF0aXZlUG9zaXRpb24gPCAwID8gMCA6IDEpOwotICAgICAgICAgICAgICAgIHJpZ2h0Lm1pbigpLnNldExlZnQobnVsbCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGVpZ2h0UmlnaHRNaW51c0xlZnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBtb3JlIG9uIHRoZSByaWdodCwgc28gZGVsZXRlIGZyb20gdGhlIHJpZ2h0Ci0gICAgICAgICAgICAgICAgQVZMTm9kZSByaWdodE1pbiA9IHJpZ2h0Lm1pbigpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gcmlnaHRNaW4udmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGxlZnRJc1ByZXZpb3VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodE1pbi5sZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LnJlbW92ZU1pbigpOwotICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBvc2l0aW9uKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBtb3JlIG9uIHRoZSBsZWZ0IG9yIGVxdWFsLCBzbyBkZWxldGUgZnJvbSB0aGUgbGVmdAotICAgICAgICAgICAgICAgIEFWTE5vZGUgbGVmdE1heCA9IGxlZnQubWF4KCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBsZWZ0TWF4LnZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChyaWdodElzTmV4dCkgewotICAgICAgICAgICAgICAgICAgICByaWdodCA9IGxlZnRNYXgucmlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFWTE5vZGUgbGVmdFByZXZpb3VzID0gbGVmdC5sZWZ0OwotICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0LnJlbW92ZU1heCgpOwotICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGxlZnQgdGhhdCB3YXMgZGVsZXRlZCB3YXMgYSBkb3VibGUgbGluawotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9jY3VycyB3aGVuIGhlaWdodCBkaWZmZXJlbmNlIGlzIGVxdWFsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0UHJldmlvdXM7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnRJc1ByZXZpb3VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlUG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24tLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNhbGNIZWlnaHQoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvKioKLSAgICAgICAgICogQmFsYW5jZXMgYWNjb3JkaW5nIHRvIHRoZSBBVkwgYWxnb3JpdGhtLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBBVkxOb2RlIGJhbGFuY2UoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGhlaWdodFJpZ2h0TWludXNMZWZ0KCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgICAgY2FzZSAtMSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgICAgIGNhc2UgLTIgOgotICAgICAgICAgICAgICAgICAgICBpZiAobGVmdC5oZWlnaHRSaWdodE1pbnVzTGVmdCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGVmdChsZWZ0LnJvdGF0ZUxlZnQoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVJpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0LmhlaWdodFJpZ2h0TWludXNMZWZ0KCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRSaWdodChyaWdodC5yb3RhdGVSaWdodCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm90YXRlTGVmdCgpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHJlZSBpbmNvbnNpc3RlbnQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGludCBnZXRPZmZzZXQoQVZMTm9kZSBub2RlKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5yZWxhdGl2ZVBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJlbGF0aXZlIHBvc2l0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgc2V0T2Zmc2V0KEFWTE5vZGUgbm9kZSwgaW50IG5ld09mZmVzdCkgewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG9sZE9mZnNldCA9IGdldE9mZnNldChub2RlKTsKLSAgICAgICAgICAgIG5vZGUucmVsYXRpdmVQb3NpdGlvbiA9IG5ld09mZmVzdDsKLSAgICAgICAgICAgIHJldHVybiBvbGRPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgaGVpZ2h0IGJ5IGNhbGN1bGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlY2FsY0hlaWdodCgpIHsKLSAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KAotICAgICAgICAgICAgICAgIGdldExlZnRTdWJUcmVlKCkgPT0gbnVsbCA/IC0xIDogZ2V0TGVmdFN1YlRyZWUoKS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgZ2V0UmlnaHRTdWJUcmVlKCkgPT0gbnVsbCA/IC0xIDogZ2V0UmlnaHRTdWJUcmVlKCkuaGVpZ2h0KSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBub2RlIG9yIC0xIGlmIHRoZSBub2RlIGlzIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGludCBnZXRIZWlnaHQoQVZMTm9kZSBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCA/IC0xIDogbm9kZS5oZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBkaWZmZXJlbmNlIHJpZ2h0IC0gbGVmdAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgaGVpZ2h0UmlnaHRNaW51c0xlZnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SGVpZ2h0KGdldFJpZ2h0U3ViVHJlZSgpKSAtIGdldEhlaWdodChnZXRMZWZ0U3ViVHJlZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSByb3RhdGVMZWZ0KCkgewotICAgICAgICAgICAgQVZMTm9kZSBuZXdUb3AgPSByaWdodDsgLy8gY2FuJ3QgYmUgZmFlZGVsdW5nIQotICAgICAgICAgICAgQVZMTm9kZSBtb3ZlZE5vZGUgPSBnZXRSaWdodFN1YlRyZWUoKS5nZXRMZWZ0U3ViVHJlZSgpOwotCi0gICAgICAgICAgICBpbnQgbmV3VG9wUG9zaXRpb24gPSByZWxhdGl2ZVBvc2l0aW9uICsgZ2V0T2Zmc2V0KG5ld1RvcCk7Ci0gICAgICAgICAgICBpbnQgbXlOZXdQb3NpdGlvbiA9IC1uZXdUb3AucmVsYXRpdmVQb3NpdGlvbjsKLSAgICAgICAgICAgIGludCBtb3ZlZFBvc2l0aW9uID0gZ2V0T2Zmc2V0KG5ld1RvcCkgKyBnZXRPZmZzZXQobW92ZWROb2RlKTsKLQotICAgICAgICAgICAgc2V0UmlnaHQobW92ZWROb2RlLCBuZXdUb3ApOwotICAgICAgICAgICAgbmV3VG9wLnNldExlZnQodGhpcywgbnVsbCk7Ci0KLSAgICAgICAgICAgIHNldE9mZnNldChuZXdUb3AsIG5ld1RvcFBvc2l0aW9uKTsKLSAgICAgICAgICAgIHNldE9mZnNldCh0aGlzLCBteU5ld1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHNldE9mZnNldChtb3ZlZE5vZGUsIG1vdmVkUG9zaXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIG5ld1RvcDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQVZMTm9kZSByb3RhdGVSaWdodCgpIHsKLSAgICAgICAgICAgIEFWTE5vZGUgbmV3VG9wID0gbGVmdDsgLy8gY2FuJ3QgYmUgZmFlZGVsdW5nCi0gICAgICAgICAgICBBVkxOb2RlIG1vdmVkTm9kZSA9IGdldExlZnRTdWJUcmVlKCkuZ2V0UmlnaHRTdWJUcmVlKCk7Ci0KLSAgICAgICAgICAgIGludCBuZXdUb3BQb3NpdGlvbiA9IHJlbGF0aXZlUG9zaXRpb24gKyBnZXRPZmZzZXQobmV3VG9wKTsKLSAgICAgICAgICAgIGludCBteU5ld1Bvc2l0aW9uID0gLW5ld1RvcC5yZWxhdGl2ZVBvc2l0aW9uOwotICAgICAgICAgICAgaW50IG1vdmVkUG9zaXRpb24gPSBnZXRPZmZzZXQobmV3VG9wKSArIGdldE9mZnNldChtb3ZlZE5vZGUpOwotCi0gICAgICAgICAgICBzZXRMZWZ0KG1vdmVkTm9kZSwgbmV3VG9wKTsKLSAgICAgICAgICAgIG5ld1RvcC5zZXRSaWdodCh0aGlzLCBudWxsKTsKLQotICAgICAgICAgICAgc2V0T2Zmc2V0KG5ld1RvcCwgbmV3VG9wUG9zaXRpb24pOwotICAgICAgICAgICAgc2V0T2Zmc2V0KHRoaXMsIG15TmV3UG9zaXRpb24pOwotICAgICAgICAgICAgc2V0T2Zmc2V0KG1vdmVkTm9kZSwgbW92ZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3VG9wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxlZnQgZmllbGQgdG8gdGhlIG5vZGUsIG9yIHRoZSBwcmV2aW91cyBub2RlIGlmIHRoYXQgaXMgbnVsbAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbm9kZSAgdGhlIG5ldyBsZWZ0IHN1YnRyZWUgbm9kZQotICAgICAgICAgKiBAcGFyYW0gcHJldmlvdXMgIHRoZSBwcmV2aW91cyBub2RlIGluIHRoZSBsaW5rZWQgbGlzdAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldExlZnQoQVZMTm9kZSBub2RlLCBBVkxOb2RlIHByZXZpb3VzKSB7Ci0gICAgICAgICAgICBsZWZ0SXNQcmV2aW91cyA9IChub2RlID09IG51bGwpOwotICAgICAgICAgICAgbGVmdCA9IChsZWZ0SXNQcmV2aW91cyA/IHByZXZpb3VzIDogbm9kZSk7Ci0gICAgICAgICAgICByZWNhbGNIZWlnaHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByaWdodCBmaWVsZCB0byB0aGUgbm9kZSwgb3IgdGhlIG5leHQgbm9kZSBpZiB0aGF0IGlzIG51bGwKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5vZGUgIHRoZSBuZXcgbGVmdCBzdWJ0cmVlIG5vZGUKLSAgICAgICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IG5vZGUgaW4gdGhlIGxpbmtlZCBsaXN0Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc2V0UmlnaHQoQVZMTm9kZSBub2RlLCBBVkxOb2RlIG5leHQpIHsKLSAgICAgICAgICAgIHJpZ2h0SXNOZXh0ID0gKG5vZGUgPT0gbnVsbCk7Ci0gICAgICAgICAgICByaWdodCA9IChyaWdodElzTmV4dCA/IG5leHQgOiBub2RlKTsKLSAgICAgICAgICAgIHJlY2FsY0hlaWdodCgpOwotICAgICAgICB9Ci0KLS8vICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRmFlZGVsdW5nKCkgewotLy8gICAgICAgICAgQVZMTm9kZSBtYXhOb2RlID0gbGVmdC5tYXgoKTsKLS8vICAgICAgICAgIGlmICghbWF4Tm9kZS5yaWdodElzRmFlZGVsdW5nIHx8IG1heE5vZGUucmlnaHQgIT0gdGhpcykgewotLy8gICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1heE5vZGUgKyAiIHNob3VsZCByaWdodC1mYWVkZWwgdG8gIiArIHRoaXMpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgQVZMTm9kZSBtaW5Ob2RlID0gcmlnaHQubWluKCk7Ci0vLyAgICAgICAgICBpZiAoIW1pbk5vZGUubGVmdElzRmFlZGVsdW5nIHx8IG1pbk5vZGUubGVmdCAhPSB0aGlzKSB7Ci0vLyAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWF4Tm9kZSArICIgc2hvdWxkIGxlZnQtZmFlZGVsIHRvICIgKyB0aGlzKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgfQotLy8KLS8vICAgICAgICBwcml2YXRlIGludCBjaGVja1RyZWVEZXB0aCgpIHsKLS8vICAgICAgICAgICAgaW50IGhyaWdodCA9IChnZXRSaWdodFN1YlRyZWUoKSA9PSBudWxsID8gLTEgOiBnZXRSaWdodFN1YlRyZWUoKS5jaGVja1RyZWVEZXB0aCgpKTsKLS8vICAgICAgICAgICAgLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiY2hlY2tUcmVlRGVwdGgiKTsKLS8vICAgICAgICAgICAgLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCh0aGlzKTsKLS8vICAgICAgICAgICAgLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiIGxlZnQ6ICIpOwotLy8gICAgICAgICAgICAvLyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KF9sZWZ0KTsKLS8vICAgICAgICAgICAgLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiIHJpZ2h0OiAiKTsKLS8vICAgICAgICAgICAgLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKF9yaWdodCk7Ci0vLwotLy8gICAgICAgICAgICBpbnQgaGxlZnQgPSAobGVmdCA9PSBudWxsID8gLTEgOiBsZWZ0LmNoZWNrVHJlZURlcHRoKCkpOwotLy8gICAgICAgICAgICBpZiAoaGVpZ2h0ICE9IE1hdGgubWF4KGhyaWdodCwgaGxlZnQpICsgMSkgewotLy8gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgImhlaWdodCBzaG91bGQgYmUgbWF4IiArIGhsZWZ0ICsgIiwiICsgaHJpZ2h0ICsgIiBidXQgaXMgIiArIGhlaWdodCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgcmV0dXJuIGhlaWdodDsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIHByaXZhdGUgaW50IGNoZWNrTGVmdFN1Yk5vZGUoKSB7Ci0vLyAgICAgICAgICAgIGlmIChnZXRMZWZ0U3ViVHJlZSgpID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIHJldHVybiAwOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGludCBjb3VudCA9IDEgKyBsZWZ0LmNoZWNrUmlnaHRTdWJOb2RlKCk7Ci0vLyAgICAgICAgICAgIGlmIChsZWZ0LnJlbGF0aXZlUG9zaXRpb24gIT0gLWNvdW50KSB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIHJldHVybiBjb3VudCArIGxlZnQuY2hlY2tMZWZ0U3ViTm9kZSgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICBwcml2YXRlIGludCBjaGVja1JpZ2h0U3ViTm9kZSgpIHsKLS8vICAgICAgICAgICAgQVZMTm9kZSByaWdodCA9IGdldFJpZ2h0U3ViVHJlZSgpOwotLy8gICAgICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgaW50IGNvdW50ID0gMTsKLS8vICAgICAgICAgICAgY291bnQgKz0gcmlnaHQuY2hlY2tMZWZ0U3ViTm9kZSgpOwotLy8gICAgICAgICAgICBpZiAocmlnaHQucmVsYXRpdmVQb3NpdGlvbiAhPSBjb3VudCkgewotLy8gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICByZXR1cm4gY291bnQgKyByaWdodC5jaGVja1JpZ2h0U3ViTm9kZSgpOwotLy8gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCBmb3IgZGVidWdnaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiQVZMTm9kZSgiICsgcmVsYXRpdmVQb3NpdGlvbiArICIsIiArIChsZWZ0ICE9IG51bGwpICsgIiwiICsgdmFsdWUgKwotICAgICAgICAgICAgICAgICIsIiArIChnZXRSaWdodFN1YlRyZWUoKSAhPSBudWxsKSArICIsIGZhZWRlbHVuZyAiICsgcmlnaHRJc05leHQgKyAiICkiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IGl0ZXJhdG9yIG92ZXIgdGhlIGxpbmtlZCBsaXN0LgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBUcmVlTGlzdEl0ZXJhdG9yIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yLCBPcmRlcmVkSXRlcmF0b3IgewotICAgICAgICAvKiogVGhlIHBhcmVudCBsaXN0ICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUcmVlTGlzdCBwYXJlbnQ7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWNoZSBvZiB0aGUgbmV4dCBub2RlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB7QGxpbmsgI25leHQoKX0uCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgQVZMTm9kZSBuZXh0OwotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBuZXh0IG5vZGUgdG8gYmUgcmV0dXJuZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgaW50IG5leHRJbmRleDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhY2hlIG9mIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgcmV0dXJuZWQgYnkge0BsaW5rICNuZXh0KCl9Ci0gICAgICAgICAqIG9yIHtAbGluayAjcHJldmlvdXMoKX0uCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgQVZMTm9kZSBjdXJyZW50OwotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgcmV0dXJuZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgaW50IGN1cnJlbnRJbmRleDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtb2RpZmljYXRpb24gY291bnQgdGhhdCB0aGUgbGlzdCBpcyBleHBlY3RlZCB0byBoYXZlLiBJZiB0aGUgbGlzdAotICAgICAgICAgKiBkb2Vzbid0IGhhdmUgdGhpcyBjb3VudCwgdGhlbiBhCi0gICAgICAgICAqIHtAbGluayBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0gbWF5IGJlIHRocm93biBieQotICAgICAgICAgKiB0aGUgb3BlcmF0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZXhwZWN0ZWRNb2RDb3VudDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgTGlzdEl0ZXJhdG9yIGZvciBhIGxpc3QuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGxpc3QKLSAgICAgICAgICogQHBhcmFtIGZyb21JbmRleCAgdGhlIGluZGV4IHRvIHN0YXJ0IGF0Ci0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgVHJlZUxpc3RJdGVyYXRvcihUcmVlTGlzdCBwYXJlbnQsIGludCBmcm9tSW5kZXgpIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRNb2RDb3VudCA9IHBhcmVudC5tb2RDb3VudDsKLSAgICAgICAgICAgIHRoaXMubmV4dCA9IChwYXJlbnQucm9vdCA9PSBudWxsID8gbnVsbCA6IHBhcmVudC5yb290LmdldChmcm9tSW5kZXgpKTsKLSAgICAgICAgICAgIHRoaXMubmV4dEluZGV4ID0gZnJvbUluZGV4OwotICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVja3MgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBvZiB0aGUgbGlzdCBpcyB0aGUgdmFsdWUgdGhhdCB0aGlzCi0gICAgICAgICAqIG9iamVjdCBleHBlY3RzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIElmIHRoZSBsaXN0J3MgbW9kaWZpY2F0aW9uCi0gICAgICAgICAqIGNvdW50IGlzbid0IHRoZSB2YWx1ZSB0aGF0IHdhcyBleHBlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTW9kQ291bnQoKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50Lm1vZENvdW50ICE9IGV4cGVjdGVkTW9kQ291bnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEluZGV4IDwgcGFyZW50LnNpemUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBjaGVja01vZENvdW50KCk7Ci0gICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJObyBlbGVtZW50IGF0IGluZGV4ICIgKyBuZXh0SW5kZXggKyAiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5leHQgPSBwYXJlbnQucm9vdC5nZXQobmV4dEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5leHQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgY3VycmVudEluZGV4ID0gbmV4dEluZGV4Kys7Ci0gICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEluZGV4ID4gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgaWYgKCFoYXNQcmV2aW91cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIkFscmVhZHkgYXQgc3RhcnQgb2YgbGlzdC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gcGFyZW50LnJvb3QuZ2V0KG5leHRJbmRleCAtIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5wcmV2aW91cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbmV4dC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgICAgICAgICBjdXJyZW50SW5kZXggPSAtLW5leHRJbmRleDsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXgoKSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja01vZENvdW50KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5leHRJbmRleCA9PSBjdXJyZW50SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUoKSBmb2xsb3dpbmcgcHJldmlvdXMoKQotICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGN1cnJlbnRJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSgpIGZvbGxvd2luZyBuZXh0KCkKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGN1cnJlbnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgbmV4dEluZGV4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IC0xOwotICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGNoZWNrTW9kQ291bnQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50LnNldFZhbHVlKG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgY2hlY2tNb2RDb3VudCgpOwotICAgICAgICAgICAgcGFyZW50LmFkZChuZXh0SW5kZXgsIG9iaik7Ci0gICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IC0xOwotICAgICAgICAgICAgbmV4dEluZGV4Kys7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L1R5cGVkTGlzdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHlwZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhNzE0OTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVHlwZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIHZhbGlkYXRlIHRoYXQgZWxlbWVudHMKLSAqIGFkZGVkIGFyZSBvZiBhIHNwZWNpZmljIHR5cGUuCi0gKiA8cD4KLSAqIFRoZSB2YWxpZGF0aW9uIG9mIGFkZGl0aW9ucyBpcyBwZXJmb3JtZWQgdmlhIGFuIGluc3RhbmNlb2YgdGVzdCBhZ2FpbnN0IAotICogYSBzcGVjaWZpZWQgPGNvZGU+Q2xhc3M8L2NvZGU+LiBJZiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoZQotICogY29sbGVjdGlvbiwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBNYXR0aGV3IEhhd3Rob3JuZQotICovCi1wdWJsaWMgY2xhc3MgVHlwZWRMaXN0IHsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHR5cGVkIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QgIHRoZSBsaXN0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIHRvIGFsbG93IGludG8gdGhlIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IG9yIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsaXN0IGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZGVjb3JhdGUoTGlzdCBsaXN0LCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZExpc3QobGlzdCwgSW5zdGFuY2VvZlByZWRpY2F0ZS5nZXRJbnN0YW5jZSh0eXBlKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlc3RyaWN0aXZlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlZExpc3QoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9Vbm1vZGlmaWFibGVMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbGlzdC9Vbm1vZGlmaWFibGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5OWI3M2YuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvVW5tb2RpZmlhYmxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlVubW9kaWZpYWJsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVMaXN0Ci0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVMaXN0RGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgVW5tb2RpZmlhYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTk1MTgyODE5OTIyNDQzNjUyTDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdCAgdGhlIGxpc3QgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZGVjb3JhdGUoTGlzdCBsaXN0KSB7Ci0gICAgICAgIGlmIChsaXN0IGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUxpc3QobGlzdCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3QgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlTGlzdChMaXN0IGxpc3QpIHsKLSAgICAgICAgc3VwZXIobGlzdCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUl0ZXJhdG9yLmRlY29yYXRlKGdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmRlY29yYXRlKGdldExpc3QoKS5saXN0SXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVMaXN0SXRlcmF0b3IuZGVjb3JhdGUoZ2V0TGlzdCgpLmxpc3RJdGVyYXRvcihpbmRleCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotICAgICAgICBMaXN0IHN1YiA9IGdldExpc3QoKS5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTGlzdChzdWIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvcGFja2FnZS5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL2xpc3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTMzOWJmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9saXN0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0gJElkOiBwYWNrYWdlLmh0bWwsdiAxLjEgMjAwOS8wNS8yNyAyMjoxNjozMSBtcGFya2VyIEV4cCAkIC0tPgotIDwhLS0KLSAgIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxCT0RZPgotPHA+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZQote0BsaW5rIGphdmEudXRpbC5MaXN0IExpc3R9IGludGVyZmFjZS4KLTwvcD4KLTxwPgotVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPlRyZWVMaXN0IC0gYSBsaXN0IHRoYXQgaXMgb3B0aW1pc2VkIGZvciBpbnNlcnRpb25zIGFuZCByZW1vdmFscyBhdCBhbnkgaW5kZXggaW4gdGhlIGxpc3Q8L2xpPgotPGxpPkN1cnNvcmFibGVMaW5rZWRMaXN0IC0gYSBsaXN0IHRoYXQgY2FuIGJlIG1vZGlmaWVkIHdoaWxlIHRoZSBsaXN0SXRlcmF0b3IgKGN1cnNvcikgaXMgYmVpbmcgdXNlZDwvbGk+Ci08bGk+Tm9kZUNhY2hpbmdMaW5rZWRMaXN0IC0gYSBsaW5rZWQgbGlzdCB0aGF0IGNhY2hlcyB0aGUgc3RvcmFnZSBub2RlcyBmb3IgYSBwZXJmb3JtYW5jZSBnYWluPC9saT4KLTwvdWw+Ci08L3A+Ci08cD4KLVRoZSBmb2xsb3dpbmcgZGVjb3JhdG9ycyBhcmUgcHJvdmlkZWQgaW4gdGhlIHBhY2thZ2U6Ci08dWw+Ci08bGk+U3luY2hyb25pemVkIC0gc3luY2hyb25pemVzIG1ldGhvZCBhY2Nlc3MgZm9yIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50czwvbGk+Ci08bGk+VW5tb2RpZmlhYmxlIC0gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBjYW5ub3QgYmUgYWx0ZXJlZDwvbGk+Ci08bGk+UHJlZGljYXRlZCAtIGVuc3VyZXMgdGhhdCBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIHZhbGlkIGFjY29yZGluZyB0byBhIHByZWRpY2F0ZSBjYW4gYmUgYWRkZWQ8L2xpPgotPGxpPlR5cGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlIGNhbiBiZSBhZGRlZDwvbGk+Ci08bGk+VHJhbnNmb3JtZWQgLSB0cmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBhZGRlZDwvbGk+Ci08bGk+Rml4ZWRTaXplIC0gZW5zdXJlcyB0aGF0IHRoZSBzaXplIG9mIHRoZSBsaXN0IGNhbm5vdCBjaGFuZ2U8L2xpPgotPGxpPkxhenkgLSBjcmVhdGVzIG9iamVjdHMgaW4gdGhlIGxpc3Qgb24gZGVtYW5kPC9saT4KLTxsaT5Hcm93dGggLSBncm93cyB0aGUgbGlzdCBpbnN0ZWFkIG9mIGVycm9yaW5nIHdoZW4gc2V0L2FkZCB1c2VkIHdpdGggaW5kZXggYmV5b25kIHRoZSBsaXN0IHNpemU8L2xpPgotPGxpPlNldFVuaXF1ZSAtIGEgbGlzdCB0aGF0IGF2b2lkcyBkdXBsaWNhdGUgZW50cmllcyBsaWtlIGEgU2V0PC9saT4KLTwvdWw+Ci08L3A+Ci08L0JPRFk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SGFzaGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliOTM0NGQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdEhhc2hlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5JdGVyYWJsZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuS2V5VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5TWFwSXRlcmF0b3I7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBoYXNoLWJhc2VkIG1hcCB3aGljaCBwcm92aWRlcyBudW1lcm91cyBwb2ludHMgZm9yCi0gKiBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIHRoZSBmZWF0dXJlcyBuZWNlc3NhcnkgZm9yIGEgc3ViY2xhc3MgaGFzaC1iYXNlZCBtYXAuCi0gKiBLZXktdmFsdWUgZW50cmllcyBhcmUgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgPGNvZGU+SGFzaEVudHJ5PC9jb2RlPiBjbGFzcywKLSAqIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGFuZCByZXBsYWNlZC4gVGhlIGl0ZXJhdG9ycyBjYW4gc2ltaWxhcmx5IGJlIHJlcGxhY2VkLAotICogd2l0aG91dCB0aGUgbmVlZCB0byByZXBsYWNlIHRoZSBLZXlTZXQsIEVudHJ5U2V0IGFuZCBWYWx1ZXMgdmlldyBjbGFzc2VzLgotICogPHA+Ci0gKiBPdmVycmlkYWJsZSBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaGFzaGluZyBiZWhhdmlvdXIsIGFuZAotICogdG8gY2hhbmdlIGhvdyBlbnRyaWVzIGFyZSBhZGRlZCB0byBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuIEhvcGVmdWxseSwgYWxsIHlvdQotICogbmVlZCBmb3IgdW51c3VhbCBzdWJjbGFzc2VzIGlzIGhlcmUuCi0gKiA8cD4KLSAqIE5PVEU6IEZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEgdGhpcyBjbGFzcyBleHRlbmRzIEFic3RyYWN0TWFwLgotICogVGhpcyBpcyB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBSZWZlcmVuY2VNYXAgYmV0d2VlbiB2My4wIGFuZCB2My4xLgotICogVGhpcyBleHRlbmRzIGNsYXVzZSB3aWxsIGJlIHJlbW92ZWQgaW4gdjQuMC4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqCi0gKiBAYXV0aG9yIGphdmEgdXRpbCBIYXNoTWFwCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBDaHJpc3RpYW4gU2llZmtlcwotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RIYXNoZWRNYXAgZXh0ZW5kcyBBYnN0cmFjdE1hcCBpbXBsZW1lbnRzIEl0ZXJhYmxlTWFwIHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT19ORVhUX0VOVFJZID0gIk5vIG5leHQoKSBlbnRyeSBpbiB0aGUgaXRlcmF0aW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT19QUkVWSU9VU19FTlRSWSA9ICJObyBwcmV2aW91cygpIGVudHJ5IGluIHRoZSBpdGVyYXRpb24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9JTlZBTElEID0gInJlbW92ZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGFmdGVyIG5leHQoKSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUS0VZX0lOVkFMSUQgPSAiZ2V0S2V5KCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRWQUxVRV9JTlZBTElEID0gImdldFZhbHVlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRWQUxVRV9JTlZBTElEID0gInNldFZhbHVlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG5leHQoKSBhbmQgYmVmb3JlIHJlbW92ZSgpIjsKLSAgICAKLSAgICAvKiogVGhlIGRlZmF1bHQgY2FwYWNpdHkgdG8gdXNlICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDE2OwotICAgIC8qKiBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgdG8gdXNlICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USFJFU0hPTEQgPSAxMjsKLSAgICAvKiogVGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IgdG8gdXNlICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0xPQURfRkFDVE9SID0gMC43NWY7Ci0gICAgLyoqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IGFsbG93ZWQgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKLSAgICAvKiogQW4gb2JqZWN0IGZvciBtYXNraW5nIG51bGwgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBOVUxMID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIC8qKiBMb2FkIGZhY3Rvciwgbm9ybWFsbHkgMC43NSAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgZmxvYXQgbG9hZEZhY3RvcjsKLSAgICAvKiogVGhlIHNpemUgb2YgdGhlIG1hcCAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IHNpemU7Ci0gICAgLyoqIE1hcCBlbnRyaWVzICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBIYXNoRW50cnlbXSBkYXRhOwotICAgIC8qKiBTaXplIGF0IHdoaWNoIHRvIHJlaGFzaCAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IHRocmVzaG9sZDsKLSAgICAvKiogTW9kaWZpY2F0aW9uIGNvdW50IGZvciBpdGVyYXRvcnMgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBtb2RDb3VudDsKLSAgICAvKiogRW50cnkgc2V0ICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBFbnRyeVNldCBlbnRyeVNldDsKLSAgICAvKiogS2V5IHNldCAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgS2V5U2V0IGtleVNldDsKLSAgICAvKiogVmFsdWVzICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBWYWx1ZXMgdmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SGFzaGVkTWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHdoaWNoIHBlcmZvcm1zIG5vIHZhbGlkYXRpb24gb24gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5LCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvciwgbXVzdCBiZSAmZ3Q7IDAuMGYgYW5kIGdlbmVyYWxseSAmbHQ7IDEuMGYKLSAgICAgKiBAcGFyYW0gdGhyZXNob2xkICB0aGUgdGhyZXNob2xkLCBtdXN0IGJlIHNlbnNpYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SGFzaGVkTWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IsIGludCB0aHJlc2hvbGQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5sb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLSAgICAgICAgdGhpcy5kYXRhID0gbmV3IEhhc2hFbnRyeVtpbml0aWFsQ2FwYWNpdHldOwotICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKLSAgICAgKiBkZWZhdWx0IGxvYWQgZmFjdG9yLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEhhc2hlZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCi0gICAgICogbG9hZCBmYWN0b3IuIAotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkKLSAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEhhc2hlZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbml0aWFsIGNhcGFjaXR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9hZEZhY3RvciA8PSAwLjBmIHx8IEZsb2F0LmlzTmFOKGxvYWRGYWN0b3IpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMb2FkIGZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLSAgICAgICAgaW5pdGlhbENhcGFjaXR5ID0gY2FsY3VsYXRlTmV3Q2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsKLSAgICAgICAgdGhpcy50aHJlc2hvbGQgPSBjYWxjdWxhdGVUaHJlc2hvbGQoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICAgICAgdGhpcy5kYXRhID0gbmV3IEhhc2hFbnRyeVtpbml0aWFsQ2FwYWNpdHldOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY29weWluZyBlbGVtZW50cyBmcm9tIGFub3RoZXIgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RIYXNoZWRNYXAoTWFwIG1hcCkgewotICAgICAgICB0aGlzKE1hdGgubWF4KDIgKiBtYXAuc2l6ZSgpLCBERUZBVUxUX0NBUEFDSVRZKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7Ci0gICAgICAgIHB1dEFsbChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpc2Ugc3ViY2xhc3NlcyBkdXJpbmcgY29uc3RydWN0aW9uLCBjbG9uaW5nIG9yIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIGtleSBzcGVjaWZpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSwgbnVsbCBpZiBubyBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAga2V5ID0gY29udmVydEtleShrZXkpOwotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleSk7Ci0gICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaGFzaEluZGV4KGhhc2hDb2RlLCBkYXRhLmxlbmd0aCldOyAvLyBubyBsb2NhbCBmb3IgaGFzaCBpbmRleAotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoa2V5LCBlbnRyeS5rZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgaXMgY3VycmVudGx5IGVtcHR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGlzIGN1cnJlbnRseSBzaXplIHplcm8KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gKHNpemUgPT0gMCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAga2V5ID0gY29udmVydEtleShrZXkpOwotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleSk7Ci0gICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaGFzaEluZGV4KGhhc2hDb2RlLCBkYXRhLmxlbmd0aCldOyAvLyBubyBsb2NhbCBmb3IgaGFzaCBpbmRleAotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoa2V5LCBlbnRyeS5rZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpc2l6ZSA9IGRhdGEubGVuZ3RoOyBpIDwgaXNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaV07Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpc2l6ZSA9IGRhdGEubGVuZ3RoOyBpIDwgaXNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaV07Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxWYWx1ZSh2YWx1ZSwgZW50cnkuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQdXRzIGEga2V5LXZhbHVlIG1hcHBpbmcgaW50byB0aGlzIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGFkZAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGFkZAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMga2V5LCBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAga2V5ID0gY29udmVydEtleShrZXkpOwotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleSk7Ci0gICAgICAgIGludCBpbmRleCA9IGhhc2hJbmRleChoYXNoQ29kZSwgZGF0YS5sZW5ndGgpOwotICAgICAgICBIYXNoRW50cnkgZW50cnkgPSBkYXRhW2luZGV4XTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5oYXNoQ29kZSA9PSBoYXNoQ29kZSAmJiBpc0VxdWFsS2V5KGtleSwgZW50cnkua2V5KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRW50cnkoZW50cnksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFkZE1hcHBpbmcoaW5kZXgsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIGludG8gdGhpcyBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBhcm91bmQgdGhlIHNwZWNpZmllZCBtYXAgYW5kCi0gICAgICogdXNlcyB7QGxpbmsgI3B1dChPYmplY3QsIE9iamVjdCl9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gYWRkCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICBpbnQgbWFwU2l6ZSA9IG1hcC5zaXplKCk7Ci0gICAgICAgIGlmIChtYXBTaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgbmV3U2l6ZSA9IChpbnQpICgoc2l6ZSArIG1hcFNpemUpIC8gbG9hZEZhY3RvciArIDEpOwotICAgICAgICBlbnN1cmVDYXBhY2l0eShjYWxjdWxhdGVOZXdDYXBhY2l0eShuZXdTaXplKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZnJvbSB0aGlzIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHJlbW92ZWQga2V5LCBudWxsIGlmIGtleSBub3QgaW4gbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBrZXkgPSBjb252ZXJ0S2V5KGtleSk7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5KTsKLSAgICAgICAgaW50IGluZGV4ID0gaGFzaEluZGV4KGhhc2hDb2RlLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaW5kZXhdOwotICAgICAgICBIYXNoRW50cnkgcHJldmlvdXMgPSBudWxsOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoa2V5LCBlbnRyeS5rZXkpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICByZW1vdmVNYXBwaW5nKGVudHJ5LCBpbmRleCwgcHJldmlvdXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBtYXAsIHJlc2V0dGluZyB0aGUgc2l6ZSB0byB6ZXJvIGFuZCBudWxsaWZ5aW5nIHJlZmVyZW5jZXMKLSAgICAgKiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gaXNzdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICBIYXNoRW50cnlbXSBkYXRhID0gdGhpcy5kYXRhOwotICAgICAgICBmb3IgKGludCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZGF0YVtpXSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGlucHV0IGtleXMgdG8gYW5vdGhlciBvYmplY3QgZm9yIHN0b3JhZ2UgaW4gdGhlIG1hcC4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1hc2tzIG51bGxzLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcGVyZm9ybSBhbHRlcm5hdGUga2V5IGNvbnZlcnNpb25zLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXZlcnNlIGNvbnZlcnNpb24gY2FuIGJlIGNoYW5nZWQsIGlmIHJlcXVpcmVkLCBieSBvdmVycmlkaW5nIHRoZQotICAgICAqIGdldEtleSgpIG1ldGhvZCBpbiB0aGUgaGFzaCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQga2V5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIChrZXkgPT0gbnVsbCA/IE5VTEwgOiBrZXkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkgc3BlY2lmaWVkLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgYWRkaXRpb25hbCBoYXNoaW5nIHJvdXRpbmUgZnJvbSBKREsxLjQuCi0gICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gYWx0ZXJuYXRlIGhhc2ggY29kZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBnZXQgYSBoYXNoIGNvZGUgZm9yCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBoYXNoKE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gc2FtZSBhcyBKREsgMS40Ci0gICAgICAgIGludCBoID0ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIGggKz0gfihoIDw8IDkpOwotICAgICAgICBoIF49ICAoaCA+Pj4gMTQpOwotICAgICAgICBoICs9ICAoaCA8PCA0KTsKLSAgICAgICAgaCBePSAgKGggPj4+IDEwKTsKLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBrZXlzLCBpbiBpbnRlcm5hbCBjb252ZXJ0ZWQgZm9ybSwgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWFsLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZXF1YWxzIG1ldGhvZCBhbmQgYXNzdW1lcyBuZWl0aGVyIGtleSBpcyBudWxsLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gbWF0Y2ggZGlmZmVyZW50bHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkgdG8gY29tcGFyZSBwYXNzZWQgaW4gZnJvbSBvdXRzaWRlCi0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5IGV4dHJhY3RlZCBmcm9tIHRoZSBlbnRyeSB2aWEgPGNvZGU+ZW50cnkua2V5PC9jb2RlPgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxLZXkoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyKSB7Ci0gICAgICAgIHJldHVybiAoa2V5MSA9PSBrZXkyIHx8IGtleTEuZXF1YWxzKGtleTIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIHZhbHVlcywgaW4gZXh0ZXJuYWwgZm9ybSwgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWFsLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZXF1YWxzIG1ldGhvZCBhbmQgYXNzdW1lcyBuZWl0aGVyIHZhbHVlIGlzIG51bGwuCi0gICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBtYXRjaCBkaWZmZXJlbnRseS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUxICB0aGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZSBwYXNzZWQgaW4gZnJvbSBvdXRzaWRlCi0gICAgICogQHBhcmFtIHZhbHVlMiAgdGhlIHNlY29uZCB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUgZW50cnkgdmlhIDxjb2RlPmdldFZhbHVlKCk8L2NvZGU+Ci0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbFZhbHVlKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZTEgPT0gdmFsdWUyIHx8IHZhbHVlMS5lcXVhbHModmFsdWUyKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluZGV4IGludG8gdGhlIGRhdGEgc3RvcmFnZSBmb3IgdGhlIGhhc2hDb2RlIHNwZWNpZmllZC4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGhhc2hDb2RlLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGFsdGVybmF0ZSBidWNrZXRpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhhc2hDb2RlICB0aGUgaGFzaCBjb2RlIHRvIHVzZQotICAgICAqIEBwYXJhbSBkYXRhU2l6ZSAgdGhlIHNpemUgb2YgdGhlIGRhdGEgdG8gcGljayBhIGJ1Y2tldCBmcm9tCi0gICAgICogQHJldHVybiB0aGUgYnVja2V0IGluZGV4Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBoYXNoSW5kZXgoaW50IGhhc2hDb2RlLCBpbnQgZGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuIGhhc2hDb2RlICYgKGRhdGFTaXplIC0gMSk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbnRyeSBtYXBwZWQgdG8gdGhlIGtleSBzcGVjaWZpZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZXhpc3RzIGZvciBzdWJjbGFzc2VzIHRoYXQgbWF5IG5lZWQgdG8gcGVyZm9ybSBhIG11bHRpLXN0ZXAKLSAgICAgKiBwcm9jZXNzIGFjY2Vzc2luZyB0aGUgZW50cnkuIFRoZSBwdWJsaWMgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGRvbid0IHVzZSB0aGlzCi0gICAgICogbWV0aG9kIHRvIGdhaW4gYSBzbWFsbCBwZXJmb3JtYW5jZSBib29zdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgZW50cnksIG51bGwgaWYgbm8gbWF0Y2gKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGdldEVudHJ5KE9iamVjdCBrZXkpIHsKLSAgICAgICAga2V5ID0gY29udmVydEtleShrZXkpOwotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleSk7Ci0gICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IGRhdGFbaGFzaEluZGV4KGhhc2hDb2RlLCBkYXRhLmxlbmd0aCldOyAvLyBubyBsb2NhbCBmb3IgaGFzaCBpbmRleAotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoa2V5LCBlbnRyeS5rZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIGtleS12YWx1ZSBtYXBwaW5nIHRvIGNoYW5nZSB0aGUgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zZXRWYWx1ZSgpPC9jb2RlPiBvbiB0aGUgZW50cnkuCi0gICAgICogU3ViY2xhc3NlcyBjb3VsZCBvdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIHVwZGF0ZQotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSAgdGhlIG5ldyB2YWx1ZSB0byBzdG9yZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVudHJ5KEhhc2hFbnRyeSBlbnRyeSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKG5ld1ZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV1c2VzIGFuIGV4aXN0aW5nIGtleS12YWx1ZSBtYXBwaW5nLCBzdG9yaW5nIGNvbXBsZXRlbHkgbmV3IGRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXRzIGFsbCB0aGUgZGF0YSBmaWVsZHMgb24gdGhlIGVudHJ5LgotICAgICAqIFN1YmNsYXNzZXMgY291bGQgcG9wdWxhdGUgYWRkaXRpb25hbCBlbnRyeSBmaWVsZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gdXBkYXRlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBoYXNoSW5kZXggIHRoZSBpbmRleCBpbiB0aGUgZGF0YSBhcnJheQotICAgICAqIEBwYXJhbSBoYXNoQ29kZSAgdGhlIGhhc2ggY29kZSBvZiB0aGUga2V5IHRvIGFkZAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmV1c2VFbnRyeShIYXNoRW50cnkgZW50cnksIGludCBoYXNoSW5kZXgsIGludCBoYXNoQ29kZSwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGVudHJ5Lm5leHQgPSBkYXRhW2hhc2hJbmRleF07Ci0gICAgICAgIGVudHJ5Lmhhc2hDb2RlID0gaGFzaENvZGU7Ci0gICAgICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcga2V5LXZhbHVlIG1hcHBpbmcgaW50byB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPmNyZWF0ZUVudHJ5KCk8L2NvZGU+LCA8Y29kZT5hZGRFbnRyeSgpPC9jb2RlPgotICAgICAqIGFuZCA8Y29kZT5jaGVja0NhcGFjaXR5KCk8L2NvZGU+LgotICAgICAqIEl0IGFsc28gaGFuZGxlcyBjaGFuZ2VzIHRvIDxjb2RlPm1vZENvdW50PC9jb2RlPiBhbmQgPGNvZGU+c2l6ZTwvY29kZT4uCi0gICAgICogU3ViY2xhc3NlcyBjb3VsZCBvdmVycmlkZSB0byBmdWxseSBjb250cm9sIGFkZHMgdG8gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGFzaEluZGV4ICB0aGUgaW5kZXggaW50byB0aGUgZGF0YSBhcnJheSB0byBzdG9yZSBhdAotICAgICAqIEBwYXJhbSBoYXNoQ29kZSAgdGhlIGhhc2ggY29kZSBvZiB0aGUga2V5IHRvIGFkZAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZyhpbnQgaGFzaEluZGV4LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICBIYXNoRW50cnkgZW50cnkgPSBjcmVhdGVFbnRyeShkYXRhW2hhc2hJbmRleF0sIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgYWRkRW50cnkoZW50cnksIGhhc2hJbmRleCk7Ci0gICAgICAgIHNpemUrKzsKLSAgICAgICAgY2hlY2tDYXBhY2l0eSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVudHJ5IHRvIHN0b3JlIHRoZSBrZXktdmFsdWUgZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYSBuZXcgSGFzaEVudHJ5IGluc3RhbmNlLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGEgZGlmZmVyZW50IHN0b3JhZ2UgY2xhc3MsCi0gICAgICogb3IgaW1wbGVtZW50IGNhY2hpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IGVudHJ5IGluIHNlcXVlbmNlCi0gICAgICogQHBhcmFtIGhhc2hDb2RlICB0aGUgaGFzaCBjb2RlIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc3RvcmUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZW50cnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGNyZWF0ZUVudHJ5KEhhc2hFbnRyeSBuZXh0LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hFbnRyeShuZXh0LCBoYXNoQ29kZSwga2V5LCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYW4gZW50cnkgaW50byB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgdGhlIGVudHJ5IHRvIHRoZSBkYXRhIHN0b3JhZ2UgdGFibGUuCi0gICAgICogU3ViY2xhc3NlcyBjb3VsZCBvdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gYWRkCi0gICAgICogQHBhcmFtIGhhc2hJbmRleCAgdGhlIGluZGV4IGludG8gdGhlIGRhdGEgYXJyYXkgdG8gc3RvcmUgYXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFbnRyeShIYXNoRW50cnkgZW50cnksIGludCBoYXNoSW5kZXgpIHsKLSAgICAgICAgZGF0YVtoYXNoSW5kZXhdID0gZW50cnk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbWFwcGluZyBmcm9tIHRoZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5yZW1vdmVFbnRyeSgpPC9jb2RlPiBhbmQgPGNvZGU+ZGVzdHJveUVudHJ5KCk8L2NvZGU+LgotICAgICAqIEl0IGFsc28gaGFuZGxlcyBjaGFuZ2VzIHRvIDxjb2RlPm1vZENvdW50PC9jb2RlPiBhbmQgPGNvZGU+c2l6ZTwvY29kZT4uCi0gICAgICogU3ViY2xhc3NlcyBjb3VsZCBvdmVycmlkZSB0byBmdWxseSBjb250cm9sIHJlbW92YWxzIGZyb20gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byByZW1vdmUKLSAgICAgKiBAcGFyYW0gaGFzaEluZGV4ICB0aGUgaW5kZXggaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgKiBAcGFyYW0gcHJldmlvdXMgIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgY2hhaW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBwaW5nKEhhc2hFbnRyeSBlbnRyeSwgaW50IGhhc2hJbmRleCwgSGFzaEVudHJ5IHByZXZpb3VzKSB7Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgICAgIHJlbW92ZUVudHJ5KGVudHJ5LCBoYXNoSW5kZXgsIHByZXZpb3VzKTsKLSAgICAgICAgc2l6ZS0tOwotICAgICAgICBkZXN0cm95RW50cnkoZW50cnkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGNoYWluIHN0b3JlZCBpbiBhIHBhcnRpY3VsYXIgaW5kZXguCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZW1vdmVzIHRoZSBlbnRyeSBmcm9tIHRoZSBkYXRhIHN0b3JhZ2UgdGFibGUuCi0gICAgICogVGhlIHNpemUgaXMgbm90IHVwZGF0ZWQuCi0gICAgICogU3ViY2xhc3NlcyBjb3VsZCBvdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIHJlbW92ZQotICAgICAqIEBwYXJhbSBoYXNoSW5kZXggIHRoZSBpbmRleCBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQotICAgICAqIEBwYXJhbSBwcmV2aW91cyAgdGhlIHByZXZpb3VzIGVudHJ5IGluIHRoZSBjaGFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUVudHJ5KEhhc2hFbnRyeSBlbnRyeSwgaW50IGhhc2hJbmRleCwgSGFzaEVudHJ5IHByZXZpb3VzKSB7Ci0gICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkYXRhW2hhc2hJbmRleF0gPSBlbnRyeS5uZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogS2lsbHMgYW4gZW50cnkgcmVhZHkgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHByZXBhcmVzIHRoZSBIYXNoRW50cnkgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGltcGxlbWVudCBjYWNoaW5nIChvdmVycmlkZSBjbGVhciBhcyB3ZWxsKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBkZXN0cm95Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveUVudHJ5KEhhc2hFbnRyeSBlbnRyeSkgewotICAgICAgICBlbnRyeS5uZXh0ID0gbnVsbDsKLSAgICAgICAgZW50cnkua2V5ID0gbnVsbDsKLSAgICAgICAgZW50cnkudmFsdWUgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBjYXBhY2l0eSBvZiB0aGUgbWFwIGFuZCBlbmxhcmdlcyBpdCBpZiBuZWNlc3NhcnkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSB0aHJlc2hvbGQgdG8gY2hlY2sgaWYgdGhlIG1hcCBuZWVkcyBlbmxhcmdpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NhcGFjaXR5KCkgewotICAgICAgICBpZiAoc2l6ZSA+PSB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgIGludCBuZXdDYXBhY2l0eSA9IGRhdGEubGVuZ3RoICogMjsKLSAgICAgICAgICAgIGlmIChuZXdDYXBhY2l0eSA8PSBNQVhJTVVNX0NBUEFDSVRZKSB7Ci0gICAgICAgICAgICAgICAgZW5zdXJlQ2FwYWNpdHkobmV3Q2FwYWNpdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHRoZSBjYXBhY2l0eSBwcm9wb3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgIHRoZSBuZXcgY2FwYWNpdHkgb2YgdGhlIGFycmF5IChhIHBvd2VyIG9mIHR3bywgbGVzcyBvciBlcXVhbCB0byBtYXgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5ld0NhcGFjaXR5KSB7Ci0gICAgICAgIGludCBvbGRDYXBhY2l0eSA9IGRhdGEubGVuZ3RoOwotICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPD0gb2xkQ2FwYWNpdHkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJlc2hvbGQgPSBjYWxjdWxhdGVUaHJlc2hvbGQobmV3Q2FwYWNpdHksIGxvYWRGYWN0b3IpOwotICAgICAgICAgICAgZGF0YSA9IG5ldyBIYXNoRW50cnlbbmV3Q2FwYWNpdHldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaEVudHJ5IG9sZEVudHJpZXNbXSA9IGRhdGE7Ci0gICAgICAgICAgICBIYXNoRW50cnkgbmV3RW50cmllc1tdID0gbmV3IEhhc2hFbnRyeVtuZXdDYXBhY2l0eV07Ci0KLSAgICAgICAgICAgIG1vZENvdW50Kys7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gb2xkQ2FwYWNpdHkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIEhhc2hFbnRyeSBlbnRyeSA9IG9sZEVudHJpZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkRW50cmllc1tpXSA9IG51bGw7ICAvLyBnYwotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoRW50cnkgbmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoSW5kZXgoZW50cnkuaGFzaENvZGUsIG5ld0NhcGFjaXR5KTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubmV4dCA9IG5ld0VudHJpZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cmllc1tpbmRleF0gPSBlbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoZW50cnkgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyZXNob2xkID0gY2FsY3VsYXRlVGhyZXNob2xkKG5ld0NhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICAgICAgICAgIGRhdGEgPSBuZXdFbnRyaWVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbmV3IGNhcGFjaXR5IG9mIHRoZSBtYXAuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBub3JtYWxpemVzIHRoZSBjYXBhY2l0eSB0byBhIHBvd2VyIG9mIHR3by4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcG9zZWRDYXBhY2l0eSAgdGhlIHByb3Bvc2VkIGNhcGFjaXR5Ci0gICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBuZXcgY2FwYWNpdHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZU5ld0NhcGFjaXR5KGludCBwcm9wb3NlZENhcGFjaXR5KSB7Ci0gICAgICAgIGludCBuZXdDYXBhY2l0eSA9IDE7Ci0gICAgICAgIGlmIChwcm9wb3NlZENhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKG5ld0NhcGFjaXR5IDwgcHJvcG9zZWRDYXBhY2l0eSkgewotICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw8PSAxOyAgLy8gbXVsdGlwbHkgYnkgdHdvCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKSB7Ci0gICAgICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdDYXBhY2l0eTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbmV3IHRocmVzaG9sZCBvZiB0aGUgbWFwLCB3aGVyZSBpdCB3aWxsIGJlIHJlc2l6ZWQuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBsb2FkIGZhY3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgIHRoZSBuZXcgY2FwYWNpdHkKLSAgICAgKiBAcGFyYW0gZmFjdG9yICB0aGUgbG9hZCBmYWN0b3IKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcmVzaXplIHRocmVzaG9sZAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY2FsY3VsYXRlVGhyZXNob2xkKGludCBuZXdDYXBhY2l0eSwgZmxvYXQgZmFjdG9yKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSAobmV3Q2FwYWNpdHkgKiBmYWN0b3IpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgPGNvZGU+bmV4dDwvY29kZT4gZmllbGQgZnJvbSBhIDxjb2RlPkhhc2hFbnRyeTwvY29kZT4uCi0gICAgICogVXNlZCBpbiBzdWJjbGFzc2VzIHRoYXQgaGF2ZSBubyB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBxdWVyeSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPm5leHQ8L2NvZGU+IGZpZWxkIG9mIHRoZSBlbnRyeQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGVudHJ5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGVudHJ5TmV4dChIYXNoRW50cnkgZW50cnkpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5Lm5leHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxjb2RlPmhhc2hDb2RlPC9jb2RlPiBmaWVsZCBmcm9tIGEgPGNvZGU+SGFzaEVudHJ5PC9jb2RlPi4KLSAgICAgKiBVc2VkIGluIHN1YmNsYXNzZXMgdGhhdCBoYXZlIG5vIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIHF1ZXJ5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+aGFzaENvZGU8L2NvZGU+IGZpZWxkIG9mIHRoZSBlbnRyeQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGVudHJ5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGVudHJ5SGFzaENvZGUoSGFzaEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIHJldHVybiBlbnRyeS5oYXNoQ29kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgPGNvZGU+a2V5PC9jb2RlPiBmaWVsZCBmcm9tIGEgPGNvZGU+SGFzaEVudHJ5PC9jb2RlPi4KLSAgICAgKiBVc2VkIGluIHN1YmNsYXNzZXMgdGhhdCBoYXZlIG5vIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIHF1ZXJ5LCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+a2V5PC9jb2RlPiBmaWVsZCBvZiB0aGUgZW50cnkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBlbnRyeSBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBlbnRyeUtleShIYXNoRW50cnkgZW50cnkpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmtleTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGZpZWxkIGZyb20gYSA8Y29kZT5IYXNoRW50cnk8L2NvZGU+LgotICAgICAqIFVzZWQgaW4gc3ViY2xhc3NlcyB0aGF0IGhhdmUgbm8gdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gcXVlcnksIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gZmllbGQgb2YgdGhlIGVudHJ5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgaXMgbnVsbAotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZW50cnlWYWx1ZShIYXNoRW50cnkgZW50cnkpIHsKLSAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIHRoZSBtYXAuCi0gICAgICogQ2hhbmdlcyBtYWRlIHRvIHRoZSBpdGVyYXRvciBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogPHA+Ci0gICAgICogQSBNYXBJdGVyYXRvciByZXR1cm5zIHRoZSBrZXlzIGluIHRoZSBtYXAuIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVudAotICAgICAqIG1ldGhvZHMgdG8gZ2V0IHRoZSBrZXkgYW5kIHZhbHVlLCBhbmQgc2V0IHRoZSB2YWx1ZS4KLSAgICAgKiBJdCBhdm9pZHMgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIGVudHJ5U2V0L2tleVNldC92YWx1ZXMgb2JqZWN0LgotICAgICAqIEl0IGFsc28gYXZvaWRzIGNyZWF0aW5nIHRoZSBNYXAuRW50cnkgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5TWFwSXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwSXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFwSXRlcmF0b3IgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBIYXNoTWFwSXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciB7Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgSGFzaE1hcEl0ZXJhdG9yKEFic3RyYWN0SGFzaGVkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0RW50cnkoKS5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICAgICAgSGFzaEVudHJ5IGN1cnJlbnQgPSBjdXJyZW50RW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLkdFVEtFWV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIEhhc2hFbnRyeSBjdXJyZW50ID0gY3VycmVudEVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5HRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgSGFzaEVudHJ5IGN1cnJlbnQgPSBjdXJyZW50RW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlNFVFZBTFVFX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW50cnlTZXQgdmlldyBvZiB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgdmlldyBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogVG8gc2ltcGx5IGl0ZXJhdGUgdGhyb3VnaCB0aGUgZW50cmllcywgdXNlIHtAbGluayAjbWFwSXRlcmF0b3IoKX0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZW50cnlTZXQgdmlldwotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIGlmIChlbnRyeVNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlbnRyeVNldCA9IG5ldyBFbnRyeVNldCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnlTZXQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW50cnkgc2V0IGl0ZXJhdG9yLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVudHJ5U2V0IGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGNyZWF0ZUVudHJ5U2V0SXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmIChzaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5SXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldEl0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVudHJ5U2V0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldCB7Ci0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RIYXNoZWRNYXAgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEVudHJ5U2V0KEFic3RyYWN0SGFzaGVkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgcGFyZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBlbnRyeSkgewotICAgICAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgTWFwLkVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBlbnRyeTsKLSAgICAgICAgICAgICAgICBFbnRyeSBtYXRjaCA9IHBhcmVudC5nZXRFbnRyeShlLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hdGNoICE9IG51bGwgJiYgbWF0Y2guZXF1YWxzKGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29udGFpbnMob2JqKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIHBhcmVudC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jcmVhdGVFbnRyeVNldEl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeVNldCBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEVudHJ5U2V0SXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEVudHJ5U2V0SXRlcmF0b3IoQWJzdHJhY3RIYXNoZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm5leHRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXlTZXQgdmlldyBvZiB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgdmlldyBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogVG8gc2ltcGx5IGl0ZXJhdGUgdGhyb3VnaCB0aGUga2V5cywgdXNlIHtAbGluayAjbWFwSXRlcmF0b3IoKX0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5U2V0IHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgaWYgKGtleVNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBrZXlTZXQgPSBuZXcgS2V5U2V0KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBrZXlTZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGtleSBzZXQgaXRlcmF0b3IuCi0gICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gaXRlcmF0b3JzIHdpdGggZGlmZmVyZW50IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5U2V0IGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGNyZWF0ZUtleVNldEl0ZXJhdG9yKCkgewotICAgICAgICBpZiAoc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgS2V5U2V0SXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogS2V5U2V0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgS2V5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgewotICAgICAgICAvKiogVGhlIHBhcmVudCBtYXAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0SGFzaGVkTWFwIHBhcmVudDsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBLZXlTZXQoQWJzdHJhY3RIYXNoZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBwYXJlbnQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jb250YWluc0tleShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBwYXJlbnQuY29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgICAgIHBhcmVudC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNyZWF0ZUtleVNldEl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZXlTZXQgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBLZXlTZXRJdGVyYXRvciBleHRlbmRzIEVudHJ5U2V0SXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEtleVNldEl0ZXJhdG9yKEFic3RyYWN0SGFzaGVkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0RW50cnkoKS5nZXRLZXkoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlcyB2aWV3IG9mIHRoZSBtYXAuCi0gICAgICogQ2hhbmdlcyBtYWRlIHRvIHRoZSB2aWV3IGFmZmVjdCB0aGlzIG1hcC4KLSAgICAgKiBUbyBzaW1wbHkgaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMsIHVzZSB7QGxpbmsgI21hcEl0ZXJhdG9yKCl9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBWYWx1ZXModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdmFsdWVzIGl0ZXJhdG9yLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVWYWx1ZXNJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKHNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRW1wdHlJdGVyYXRvci5JTlNUQU5DRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlc0l0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbHVlcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFZhbHVlcyBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbiB7Ci0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RIYXNoZWRNYXAgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFZhbHVlcyhBYnN0cmFjdEhhc2hlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHBhcmVudC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlVmFsdWVzSXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbHVlcyBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFZhbHVlc0l0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBWYWx1ZXNJdGVyYXRvcihBYnN0cmFjdEhhc2hlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dEVudHJ5KCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSGFzaEVudHJ5IHVzZWQgdG8gc3RvcmUgdGhlIGRhdGEuCi0gICAgICogPHA+Ci0gICAgICogSWYgeW91IHN1YmNsYXNzIDxjb2RlPkFic3RyYWN0SGFzaGVkTWFwPC9jb2RlPiBidXQgbm90IDxjb2RlPkhhc2hFbnRyeTwvY29kZT4KLSAgICAgKiB0aGVuIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgcHJvdGVjdGVkIGZpZWxkcy4KLSAgICAgKiBUaGUgPGNvZGU+ZW50cnlYeHgoKTwvY29kZT4gbWV0aG9kcyBvbiA8Y29kZT5BYnN0cmFjdEhhc2hlZE1hcDwvY29kZT4gZXhpc3QKLSAgICAgKiB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgYWNjZXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSGFzaEVudHJ5IGltcGxlbWVudHMgTWFwLkVudHJ5LCBLZXlWYWx1ZSB7Ci0gICAgICAgIC8qKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgaGFzaCBjaGFpbiAqLwotICAgICAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IG5leHQ7Ci0gICAgICAgIC8qKiBUaGUgaGFzaCBjb2RlIG9mIHRoZSBrZXkgKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCBoYXNoQ29kZTsKLSAgICAgICAgLyoqIFRoZSBrZXkgKi8KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBrZXk7Ci0gICAgICAgIC8qKiBUaGUgdmFsdWUgKi8KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBIYXNoRW50cnkoSGFzaEVudHJ5IG5leHQsIGludCBoYXNoQ29kZSwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKLSAgICAgICAgICAgIHRoaXMuaGFzaENvZGUgPSBoYXNoQ29kZTsKLSAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ID09IE5VTEwgPyBudWxsIDoga2V5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIE9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogPT0gdGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBvdGhlciA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIChnZXRLZXkoKSA9PSBudWxsID8gb3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCA6IGdldEtleSgpLmVxdWFscyhvdGhlci5nZXRLZXkoKSkpICYmCi0gICAgICAgICAgICAgICAgKGdldFZhbHVlKCkgPT0gbnVsbCA/IG90aGVyLmdldFZhbHVlKCkgPT0gbnVsbCA6IGdldFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoZ2V0S2V5KCkgPT0gbnVsbCA/IDAgOiBnZXRLZXkoKS5oYXNoQ29kZSgpKSBeCi0gICAgICAgICAgICAgICAgICAgKGdldFZhbHVlKCkgPT0gbnVsbCA/IDAgOiBnZXRWYWx1ZSgpLmhhc2hDb2RlKCkpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGdldEtleSgpKS5hcHBlbmQoJz0nKS5hcHBlbmQoZ2V0VmFsdWUoKSkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBCYXNlIEl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhcmVudCBtYXAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0SGFzaGVkTWFwIHBhcmVudDsKLSAgICAgICAgLyoqIFRoZSBjdXJyZW50IGluZGV4IGludG8gdGhlIGFycmF5IG9mIGJ1Y2tldHMgKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCBoYXNoSW5kZXg7Ci0gICAgICAgIC8qKiBUaGUgbGFzdCByZXR1cm5lZCBlbnRyeSAqLwotICAgICAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGxhc3Q7Ci0gICAgICAgIC8qKiBUaGUgbmV4dCBlbnRyeSAqLwotICAgICAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IG5leHQ7Ci0gICAgICAgIC8qKiBUaGUgbW9kaWZpY2F0aW9uIGNvdW50IGV4cGVjdGVkICovCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZXhwZWN0ZWRNb2RDb3VudDsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBIYXNoSXRlcmF0b3IoQWJzdHJhY3RIYXNoZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBIYXNoRW50cnlbXSBkYXRhID0gcGFyZW50LmRhdGE7Ci0gICAgICAgICAgICBpbnQgaSA9IGRhdGEubGVuZ3RoOwotICAgICAgICAgICAgSGFzaEVudHJ5IG5leHQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIG5leHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5leHQgPSBkYXRhWy0taV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OwotICAgICAgICAgICAgdGhpcy5oYXNoSW5kZXggPSBpOwotICAgICAgICAgICAgdGhpcy5leHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dCAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBIYXNoRW50cnkgbmV4dEVudHJ5KCkgeyAKLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIYXNoRW50cnkgbmV3Q3VycmVudCA9IG5leHQ7Ci0gICAgICAgICAgICBpZiAobmV3Q3VycmVudCA9PSBudWxsKSAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLk5PX05FWFRfRU5UUlkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSGFzaEVudHJ5W10gZGF0YSA9IHBhcmVudC5kYXRhOwotICAgICAgICAgICAgaW50IGkgPSBoYXNoSW5kZXg7Ci0gICAgICAgICAgICBIYXNoRW50cnkgbiA9IG5ld0N1cnJlbnQubmV4dDsKLSAgICAgICAgICAgIHdoaWxlIChuID09IG51bGwgJiYgaSA+IDApIHsKLSAgICAgICAgICAgICAgICBuID0gZGF0YVstLWldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dCA9IG47Ci0gICAgICAgICAgICBoYXNoSW5kZXggPSBpOwotICAgICAgICAgICAgbGFzdCA9IG5ld0N1cnJlbnQ7Ci0gICAgICAgICAgICByZXR1cm4gbmV3Q3VycmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBIYXNoRW50cnkgY3VycmVudEVudHJ5KCkgewotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlJFTU9WRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGxhc3QuZ2V0S2V5KCkpOwotICAgICAgICAgICAgbGFzdCA9IG51bGw7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkl0ZXJhdG9yWyIgKyBsYXN0LmdldEtleSgpICsgIj0iICsgbGFzdC5nZXRWYWx1ZSgpICsgIl0iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkl0ZXJhdG9yW10iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG1hcCBkYXRhIHRvIHRoZSBzdHJlYW0uIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGRlbiBpZiBhCi0gICAgICogc3ViY2xhc3MgbXVzdCBiZSBzZXR1cCBiZWZvcmUgPGNvZGU+cHV0KCk8L2NvZGU+IGlzIHVzZWQuCi0gICAgICogPHA+Ci0gICAgICogU2VyaWFsaXphdGlvbiBpcyBub3Qgb25lIG9mIHRoZSBKREsncyBuaWNlc3QgdG9waWNzLiBOb3JtYWwgc2VyaWFsaXphdGlvbiB3aWxsCi0gICAgICogaW5pdGlhbGlzZSB0aGUgc3VwZXJjbGFzcyBiZWZvcmUgdGhlIHN1YmNsYXNzLiBTb21ldGltZXMgaG93ZXZlciwgdGhpcyBpc24ndAotICAgICAqIHdoYXQgeW91IHdhbnQsIGFzIGluIHRoaXMgY2FzZSB0aGUgPGNvZGU+cHV0KCk8L2NvZGU+IG1ldGhvZCBvbiByZWFkIGNhbiBiZQotICAgICAqIGFmZmVjdGVkIGJ5IHN1YmNsYXNzIHN0YXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzb2x1dGlvbiBhZG9wdGVkIGhlcmUgaXMgdG8gc2VyaWFsaXplIHRoZSBzdGF0ZSBkYXRhIG9mIHRoaXMgY2xhc3MgaW4KLSAgICAgKiB0aGlzIHByb3RlY3RlZCBtZXRob2QuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJ5IHRoZQotICAgICAqIDxjb2RlPndyaXRlT2JqZWN0KCk8L2NvZGU+IG9mIHRoZSBmaXJzdCBzZXJpYWxpemFibGUgc3ViY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBoYXZlIGEgc3BlY2lmaWMgZmllbGQgdGhhdCBtdXN0IGJlIHByZXNlbnQKLSAgICAgKiBvbiByZWFkIGJlZm9yZSB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgd29yay4gR2VuZXJhbGx5LCB0aGUgcmVhZCBkZXRlcm1pbmVzCi0gICAgICogd2hhdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaGVyZSwgaWYgYW55dGhpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1dyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KGxvYWRGYWN0b3IpOwotICAgICAgICBvdXQud3JpdGVJbnQoZGF0YS5sZW5ndGgpOwotICAgICAgICBvdXQud3JpdGVJbnQoc2l6ZSk7Ci0gICAgICAgIGZvciAoTWFwSXRlcmF0b3IgaXQgPSBtYXBJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoaXQubmV4dCgpKTsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChpdC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBtYXAgZGF0YSBmcm9tIHRoZSBzdHJlYW0uIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGRlbiBpZiBhCi0gICAgICogc3ViY2xhc3MgbXVzdCBiZSBzZXR1cCBiZWZvcmUgPGNvZGU+cHV0KCk8L2NvZGU+IGlzIHVzZWQuCi0gICAgICogPHA+Ci0gICAgICogU2VyaWFsaXphdGlvbiBpcyBub3Qgb25lIG9mIHRoZSBKREsncyBuaWNlc3QgdG9waWNzLiBOb3JtYWwgc2VyaWFsaXphdGlvbiB3aWxsCi0gICAgICogaW5pdGlhbGlzZSB0aGUgc3VwZXJjbGFzcyBiZWZvcmUgdGhlIHN1YmNsYXNzLiBTb21ldGltZXMgaG93ZXZlciwgdGhpcyBpc24ndAotICAgICAqIHdoYXQgeW91IHdhbnQsIGFzIGluIHRoaXMgY2FzZSB0aGUgPGNvZGU+cHV0KCk8L2NvZGU+IG1ldGhvZCBvbiByZWFkIGNhbiBiZQotICAgICAqIGFmZmVjdGVkIGJ5IHN1YmNsYXNzIHN0YXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzb2x1dGlvbiBhZG9wdGVkIGhlcmUgaXMgdG8gZGVzZXJpYWxpemUgdGhlIHN0YXRlIGRhdGEgb2YgdGhpcyBjbGFzcyBpbgotICAgICAqIHRoaXMgcHJvdGVjdGVkIG1ldGhvZC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYnkgdGhlCi0gICAgICogPGNvZGU+cmVhZE9iamVjdCgpPC9jb2RlPiBvZiB0aGUgZmlyc3Qgc2VyaWFsaXphYmxlIHN1YmNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHRoZSBzdWJjbGFzcyBoYXMgYSBzcGVjaWZpYyBmaWVsZCB0aGF0IG11c3QgYmUgcHJlc2VudAotICAgICAqIGJlZm9yZSA8Y29kZT5wdXQoKTwvY29kZT4gb3IgPGNvZGU+Y2FsY3VsYXRlVGhyZXNob2xkKCk8L2NvZGU+IHdpbGwgd29yayBjb3JyZWN0bHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9SZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBsb2FkRmFjdG9yID0gaW4ucmVhZEZsb2F0KCk7Ci0gICAgICAgIGludCBjYXBhY2l0eSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgdGhyZXNob2xkID0gY2FsY3VsYXRlVGhyZXNob2xkKGNhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICAgICAgZGF0YSA9IG5ldyBIYXNoRW50cnlbY2FwYWNpdHldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2xvbmVzIHRoZSBtYXAgd2l0aG91dCBjbG9uaW5nIHRoZSBrZXlzIG9yIHZhbHVlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUbyBpbXBsZW1lbnQgPGNvZGU+Y2xvbmUoKTwvY29kZT4sIGEgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0gICAgICogPGNvZGU+Q2xvbmVhYmxlPC9jb2RlPiBpbnRlcmZhY2UgYW5kIG1ha2UgdGhpcyBtZXRob2QgcHVibGljLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAgY2xvbmVkID0gKEFic3RyYWN0SGFzaGVkTWFwKSBzdXBlci5jbG9uZSgpOwotICAgICAgICAgICAgY2xvbmVkLmRhdGEgPSBuZXcgSGFzaEVudHJ5W2RhdGEubGVuZ3RoXTsKLSAgICAgICAgICAgIGNsb25lZC5lbnRyeVNldCA9IG51bGw7Ci0gICAgICAgICAgICBjbG9uZWQua2V5U2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGNsb25lZC52YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgY2xvbmVkLm1vZENvdW50ID0gMDsKLSAgICAgICAgICAgIGNsb25lZC5zaXplID0gMDsKLSAgICAgICAgICAgIGNsb25lZC5pbml0KCk7Ci0gICAgICAgICAgICBjbG9uZWQucHV0QWxsKHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuIGNsb25lZDsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhpcyBtYXAgd2l0aCBhbm90aGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0bwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSBvYmo7Ci0gICAgICAgIGlmIChtYXAuc2l6ZSgpICE9IHNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE1hcEl0ZXJhdG9yIGl0ID0gbWFwSXRlcmF0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoa2V5KSAhPSBudWxsIHx8IG1hcC5jb250YWluc0tleShrZXkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKG1hcC5nZXQoa2V5KSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGlnbm9yZWQpICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3RhbmRhcmQgTWFwIGhhc2hDb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBkZWZpbmVkIGluIHRoZSBNYXAgaW50ZXJmYWNlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjcmVhdGVFbnRyeVNldEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHRvdGFsICs9IGl0Lm5leHQoKS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYXMgYSBTdHJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAie30iOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDMyICogc2l6ZSgpKTsKLSAgICAgICAgYnVmLmFwcGVuZCgneycpOwotCi0gICAgICAgIE1hcEl0ZXJhdG9yIGl0ID0gbWFwSXRlcmF0b3IoKTsKLSAgICAgICAgYm9vbGVhbiBoYXNOZXh0ID0gaXQuaGFzTmV4dCgpOwotICAgICAgICB3aGlsZSAoaGFzTmV4dCkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGtleSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDoga2V5KQotICAgICAgICAgICAgICAgLmFwcGVuZCgnPScpCi0gICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiB2YWx1ZSk7Ci0KLSAgICAgICAgICAgIGhhc05leHQgPSBpdC5oYXNOZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaGFzTmV4dCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJ1Zi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc2MzY5Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZS5BYnN0cmFjdE1hcEVudHJ5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuQWJzdHJhY3RTZXREZWNvcmF0b3I7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IHNpbXBsaWZpZXMgdGhlIHRhc2sgb2YgY3JlYXRpbmcgbWFwIGRlY29yYXRvcnMuCi0gKiA8cD4KLSAqIFRoZSBNYXAgQVBJIGlzIHZlcnkgZGlmZmljdWx0IHRvIGRlY29yYXRlIGNvcnJlY3RseSwgYW5kIGludm9sdmVzIGltcGxlbWVudGluZwotICogbG90cyBvZiBkaWZmZXJlbnQgY2xhc3Nlcy4gVGhpcyBjbGFzcyBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbXBsZXIgQVBJLgotICogPHA+Ci0gKiBTcGVjaWFsIGhvb2sgbWV0aG9kcyBhcmUgcHJvdmlkZWQgdGhhdCBhcmUgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgYWRkZWQgdG8KLSAqIHRoZSBtYXAuIEJ5IG92ZXJyaWRpbmcgdGhlc2UgbWV0aG9kcywgdGhlIGlucHV0IGNhbiBiZSB2YWxpZGF0ZWQgb3IgbWFuaXB1bGF0ZWQuCi0gKiBJbiBhZGRpdGlvbiB0byB0aGUgbWFpbiBtYXAgbWV0aG9kcywgdGhlIGVudHJ5U2V0IGlzIGFsc28gYWZmZWN0ZWQsIHdoaWNoIGlzCi0gKiB0aGUgaGFyZGVzdCBwYXJ0IG9mIHdyaXRpbmcgbWFwIGltcGxlbWVudGF0aW9ucy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYWNrYWdlLXNjb3BlZCwgYW5kIG1heSBiZSB3aXRoZHJhd24gb3IgcmVwbGFjZWQgaW4gZnV0dXJlCi0gKiB2ZXJzaW9ucyBvZiBDb21tb25zIENvbGxlY3Rpb25zLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXBEZWNvcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvcihNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEhvb2sgbWV0aG9kIGNhbGxlZCB3aGVuIGEgdmFsdWUgaXMgYmVpbmcgc2V0IHVzaW5nIDxjb2RlPnNldFZhbHVlPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgdmFsaWRhdGUgdGhlIHZhbHVlIGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgKiBvciBpdCBtYXkgdHJhbnNmb3JtIHRoZSB2YWx1ZSBpbnRvIGFub3RoZXIgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgaW5wdXQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gY2hlY2sKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBtYXAgbWF5IG5vdCBiZSBjaGFuZ2VkIGJ5IHNldFZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgaW52YWxpZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsIGFuZCBudWxscyBhcmUgaW52YWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgY2hlY2tTZXRWYWx1ZShPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogSG9vayBtZXRob2QgY2FsbGVkIHRvIGRldGVybWluZSBpZiA8Y29kZT5jaGVja1NldFZhbHVlPC9jb2RlPiBoYXMgYW55IGVmZmVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHRoZSA8Y29kZT5jaGVja1NldFZhbHVlPC9jb2RlPiBtZXRob2QKLSAgICAgKiBoYXMgbm8gZWZmZWN0IGFzIHRoaXMgb3B0aW1pc2VzIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2V0VmFsdWVDaGVja2luZygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIGlmIChpc1NldFZhbHVlQ2hlY2tpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldChtYXAuZW50cnlTZXQoKSwgdGhpcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW4gZW50cnkgc2V0IHRoYXQgY2hlY2tzIGFkZGl0aW9ucyB2aWEgc2V0VmFsdWUuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXREZWNvcmF0b3IgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IgcGFyZW50OwotCi0gICAgICAgIHByb3RlY3RlZCBFbnRyeVNldChTZXQgc2V0LCBBYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHNldCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRJdGVyYXRvcihjb2xsZWN0aW9uLml0ZXJhdG9yKCksIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG5ldyBNYXBFbnRyeSgoTWFwLkVudHJ5KSBhcnJheVtpXSwgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhcnJheTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0IGFycmF5W10pIHsKLSAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGFycmF5OwotICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGNyZWF0ZSBhIG5ldyBhcnJheSB0byBoYW5kbGUgbXVsdGktdGhyZWFkZWQgc2l0dWF0aW9ucwotICAgICAgICAgICAgICAgIC8vIHdoZXJlIGFub3RoZXIgdGhyZWFkIGNvdWxkIGFjY2VzcyBkYXRhIGJlZm9yZSB3ZSBkZWNvcmF0ZSBpdAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gY29sbGVjdGlvbi50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBNYXBFbnRyeSgoTWFwLkVudHJ5KSByZXN1bHRbaV0sIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiByZXN1bHQgc2hvdWxkIGJlIHJldHVybmVkIHN0cmFpZ2h0Ci0gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvcHkgYmFjayBpbnRvIGlucHV0IGFycmF5IHRvIGZ1bGZpbCB0aGUgbWV0aG9kIGNvbnRyYWN0Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgYXJyYXksIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IHJlc3VsdC5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBhcnJheVtyZXN1bHQubGVuZ3RoXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbiBlbnRyeSBzZXQgaXRlcmF0b3IgdGhhdCBjaGVja3MgYWRkaXRpb25zIHZpYSBzZXRWYWx1ZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgRW50cnlTZXRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3IgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEVudHJ5U2V0SXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3IsIEFic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoaXRlcmF0b3IpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFwRW50cnkoZW50cnksIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIG1hcCBlbnRyeSB0aGF0IGNoZWNrcyBhZGRpdGlvbnMgdmlhIHNldFZhbHVlLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBNYXBFbnRyeSBleHRlbmRzIEFic3RyYWN0TWFwRW50cnlEZWNvcmF0b3IgewotCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0SW5wdXRDaGVja2VkTWFwRGVjb3JhdG9yIHBhcmVudDsKLQotICAgICAgICBwcm90ZWN0ZWQgTWFwRW50cnkoTWFwLkVudHJ5IGVudHJ5LCBBYnN0cmFjdElucHV0Q2hlY2tlZE1hcERlY29yYXRvciBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKGVudHJ5KTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHZhbHVlID0gcGFyZW50LmNoZWNrU2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdExpbmtlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmM5NzNiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RMaW5rZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW1wdHlPcmRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5FbXB0eU9yZGVyZWRNYXBJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGhhc2gtYmFzZWQgbWFwIHRoYXQgbGlua3MgZW50cmllcyB0byBjcmVhdGUgYW4KLSAqIG9yZGVyZWQgbWFwIGFuZCB3aGljaCBwcm92aWRlcyBudW1lcm91cyBwb2ludHMgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbGwgdGhlIGZlYXR1cmVzIG5lY2Vzc2FyeSBmb3IgYSBzdWJjbGFzcyBsaW5rZWQKLSAqIGhhc2gtYmFzZWQgbWFwLiBLZXktdmFsdWUgZW50cmllcyBhcmUgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUKLSAqIDxjb2RlPkxpbmtFbnRyeTwvY29kZT4gY2xhc3Mgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYW5kIHJlcGxhY2VkLgotICogVGhlIGl0ZXJhdG9ycyBjYW4gc2ltaWxhcmx5IGJlIHJlcGxhY2VkLCB3aXRob3V0IHRoZSBuZWVkIHRvIHJlcGxhY2UgdGhlIEtleVNldCwKLSAqIEVudHJ5U2V0IGFuZCBWYWx1ZXMgdmlldyBjbGFzc2VzLgotICogPHA+Ci0gKiBPdmVycmlkYWJsZSBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaGFzaGluZyBiZWhhdmlvdXIsIGFuZAotICogdG8gY2hhbmdlIGhvdyBlbnRyaWVzIGFyZSBhZGRlZCB0byBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuIEhvcGVmdWxseSwgYWxsIHlvdQotICogbmVlZCBmb3IgdW51c3VhbCBzdWJjbGFzc2VzIGlzIGhlcmUuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIG9yZGVyIGJ5IG9yaWdpbmFsIGluc2VydGlvbiwgYnV0IHN1YmNsYXNzZXMKLSAqIG1heSB3b3JrIGRpZmZlcmVudGx5LiBUaGUgPGNvZGU+T3JkZXJlZE1hcDwvY29kZT4gaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkCi0gKiB0byBwcm92aWRlIGFjY2VzcyB0byBiaWRpcmVjdGlvbmFsIGl0ZXJhdGlvbiBhbmQgZXh0cmEgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqIDxwPgotICogVGhlIDxjb2RlPm9yZGVyZWRNYXBJdGVyYXRvcigpPC9jb2RlPiBtZXRob2QgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byBhCi0gKiBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLiBUaGUgaXRlcmF0b3JzIGZyb20gdGhlIG90aGVyIHZpZXdzIGNhbiBhbHNvIGJlIGNhc3QKLSAqIHRvIDxjb2RlPk9yZGVyZWRJdGVyYXRvcjwvY29kZT4gaWYgcmVxdWlyZWQuCi0gKiA8cD4KLSAqIEFsbCB0aGUgYXZhaWxhYmxlIGl0ZXJhdG9ycyBjYW4gYmUgcmVzZXQgYmFjayB0byB0aGUgc3RhcnQgYnkgY2FzdGluZyB0bwotICogPGNvZGU+UmVzZXR0YWJsZUl0ZXJhdG9yPC9jb2RlPiBhbmQgY2FsbGluZyA8Y29kZT5yZXNldCgpPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGFsc28gZGVzaWduZWQgdG8gYmUgc3ViY2xhc3NlZCwgd2l0aCBsb3RzIG9mIHVzZWZ1bAotICogbWV0aG9kcyBleHBvc2VkLgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICoKLSAqIEBhdXRob3IgamF2YSB1dGlsIExpbmtlZEhhc2hNYXAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdExpbmtlZE1hcCBleHRlbmRzIEFic3RyYWN0SGFzaGVkTWFwIGltcGxlbWVudHMgT3JkZXJlZE1hcCB7Ci0gICAgCi0gICAgLyoqIEhlYWRlciBpbiB0aGUgbGlua2VkIGxpc3QgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IExpbmtFbnRyeSBoZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBvbmx5IHVzZWQgaW4gZGVzZXJpYWxpemF0aW9uLCBkbyBub3QgdXNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMaW5rZWRNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igd2hpY2ggcGVyZm9ybXMgbm8gdmFsaWRhdGlvbiBvbiB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHksIG11c3QgYmUgYSBwb3dlciBvZiB0d28KLSAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yLCBtdXN0IGJlID4gMC4wZiBhbmQgZ2VuZXJhbGx5IDwgMS4wZgotICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgIHRoZSB0aHJlc2hvbGQsIG11c3QgYmUgc2Vuc2libGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMaW5rZWRNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwgaW50IHRocmVzaG9sZCkgewotICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IsIHRocmVzaG9sZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5LiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdExpbmtlZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAotICAgICAqIGxvYWQgZmFjdG9yLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbGVzcyB0aGFuIHplcm8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMaW5rZWRNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNvcHlpbmcgZWxlbWVudHMgZnJvbSBhbm90aGVyIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gY29weQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TGlua2VkTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXNlIHRoaXMgc3ViY2xhc3MgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBOT1RFOiBBcyBmcm9tIHYzLjIgdGhpcyBtZXRob2QgY2FsbHMKLSAgICAgKiB7QGxpbmsgI2NyZWF0ZUVudHJ5KEhhc2hFbnRyeSwgaW50LCBPYmplY3QsIE9iamVjdCl9IHRvIGNyZWF0ZQotICAgICAqIHRoZSBtYXAgZW50cnkgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGhlYWRlciA9IChMaW5rRW50cnkpIGNyZWF0ZUVudHJ5KG51bGwsIC0xLCBudWxsLCBudWxsKTsKLSAgICAgICAgaGVhZGVyLmJlZm9yZSA9IGhlYWRlci5hZnRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyBvdmVycmlkZSB1c2VzIGZhc3RlciBpdGVyYXRvcgotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChMaW5rRW50cnkgZW50cnkgPSBoZWFkZXIuYWZ0ZXI7IGVudHJ5ICE9IGhlYWRlcjsgZW50cnkgPSBlbnRyeS5hZnRlcikgewotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChMaW5rRW50cnkgZW50cnkgPSBoZWFkZXIuYWZ0ZXI7IGVudHJ5ICE9IGhlYWRlcjsgZW50cnkgPSBlbnRyeS5hZnRlcikgewotICAgICAgICAgICAgICAgIGlmIChpc0VxdWFsVmFsdWUodmFsdWUsIGVudHJ5LmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBtYXAsIHJlc2V0dGluZyB0aGUgc2l6ZSB0byB6ZXJvIGFuZCBudWxsaWZ5aW5nIHJlZmVyZW5jZXMKLSAgICAgKiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gaXNzdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAvLyBvdmVycmlkZSB0byByZXNldCB0aGUgbGlua2VkIGxpc3QKLSAgICAgICAgc3VwZXIuY2xlYXIoKTsKLSAgICAgICAgaGVhZGVyLmJlZm9yZSA9IGhlYWRlci5hZnRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlyc3Qga2V5IGluIHRoZSBtYXAsIHdoaWNoIGlzIHRoZSBtb3N0IHJlY2VudGx5IGluc2VydGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgaW5zZXJ0ZWQga2V5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1hcCBpcyBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXIuYWZ0ZXIuZ2V0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcCwgd2hpY2ggaXMgdGhlIGZpcnN0IGluc2VydGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZGVzdCBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJNYXAgaXMgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyLmJlZm9yZS5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IGtleSBpbiBzZXF1ZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGdldCBhZnRlcgotICAgICAqIEByZXR1cm4gdGhlIG5leHQga2V5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgTGlua0VudHJ5IGVudHJ5ID0gKExpbmtFbnRyeSkgZ2V0RW50cnkoa2V5KTsKLSAgICAgICAgcmV0dXJuIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmFmdGVyID09IGhlYWRlciA/IG51bGwgOiBlbnRyeS5hZnRlci5nZXRLZXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJldmlvdXMga2V5IGluIHNlcXVlbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZ2V0IGJlZm9yZQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGtleQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBMaW5rRW50cnkgZW50cnkgPSAoTGlua0VudHJ5KSBnZXRFbnRyeShrZXkpOwotICAgICAgICByZXR1cm4gKGVudHJ5ID09IG51bGwgfHwgZW50cnkuYmVmb3JlID09IGhlYWRlciA/IG51bGwgOiBlbnRyeS5iZWZvcmUuZ2V0S2V5KCkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUga2V5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaW5rRW50cnkgZ2V0RW50cnkoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleCAiICsgaW5kZXggKyAiIGlzIGxlc3MgdGhhbiB6ZXJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4ID49IHNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleCAiICsgaW5kZXggKyAiIGlzIGludmFsaWQgZm9yIHNpemUgIiArIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIExpbmtFbnRyeSBlbnRyeTsKLSAgICAgICAgaWYgKGluZGV4IDwgKHNpemUgLyAyKSkgewotICAgICAgICAgICAgLy8gU2VhcmNoIGZvcndhcmRzCi0gICAgICAgICAgICBlbnRyeSA9IGhlYWRlci5hZnRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGN1cnJlbnRJbmRleCA9IDA7IGN1cnJlbnRJbmRleCA8IGluZGV4OyBjdXJyZW50SW5kZXgrKykgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkuYWZ0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZWFyY2ggYmFja3dhcmRzCi0gICAgICAgICAgICBlbnRyeSA9IGhlYWRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGN1cnJlbnRJbmRleCA9IHNpemU7IGN1cnJlbnRJbmRleCA+IGluZGV4OyBjdXJyZW50SW5kZXgtLSkgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkuYmVmb3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBlbnRyeSBpbnRvIHRoaXMgbWFwLCBtYWludGFpbmluZyBpbnNlcnRpb24gb3JkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhZGRzIHRoZSBlbnRyeSB0byB0aGUgZGF0YSBzdG9yYWdlIHRhYmxlIGFuZAotICAgICAqIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIGFkZAotICAgICAqIEBwYXJhbSBoYXNoSW5kZXggIHRoZSBpbmRleCBpbnRvIHRoZSBkYXRhIGFycmF5IHRvIHN0b3JlIGF0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRW50cnkoSGFzaEVudHJ5IGVudHJ5LCBpbnQgaGFzaEluZGV4KSB7Ci0gICAgICAgIExpbmtFbnRyeSBsaW5rID0gKExpbmtFbnRyeSkgZW50cnk7Ci0gICAgICAgIGxpbmsuYWZ0ZXIgID0gaGVhZGVyOwotICAgICAgICBsaW5rLmJlZm9yZSA9IGhlYWRlci5iZWZvcmU7Ci0gICAgICAgIGhlYWRlci5iZWZvcmUuYWZ0ZXIgPSBsaW5rOwotICAgICAgICBoZWFkZXIuYmVmb3JlID0gbGluazsKLSAgICAgICAgZGF0YVtoYXNoSW5kZXhdID0gZW50cnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW50cnkgdG8gc3RvcmUgdGhlIGRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEgbmV3IExpbmtFbnRyeSBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV4dCAgdGhlIG5leHQgZW50cnkgaW4gc2VxdWVuY2UKLSAgICAgKiBAcGFyYW0gaGFzaENvZGUgIHRoZSBoYXNoIGNvZGUgdG8gdXNlCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzdG9yZQotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHN0b3JlCi0gICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBlbnRyeQotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNoRW50cnkgY3JlYXRlRW50cnkoSGFzaEVudHJ5IG5leHQsIGludCBoYXNoQ29kZSwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlua0VudHJ5KG5leHQsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBlbnRyeSBmcm9tIHRoZSBtYXAgYW5kIHRoZSBsaW5rZWQgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbW92ZXMgdGhlIGVudHJ5IGZyb20gdGhlIGxpbmtlZCBsaXN0IGNoYWluLCB0aGVuCi0gICAgICogY2FsbHMgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIGhhc2hJbmRleCAgdGhlIGluZGV4IGludG8gdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICogQHBhcmFtIHByZXZpb3VzICB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGNoYWluCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRW50cnkoSGFzaEVudHJ5IGVudHJ5LCBpbnQgaGFzaEluZGV4LCBIYXNoRW50cnkgcHJldmlvdXMpIHsKLSAgICAgICAgTGlua0VudHJ5IGxpbmsgPSAoTGlua0VudHJ5KSBlbnRyeTsKLSAgICAgICAgbGluay5iZWZvcmUuYWZ0ZXIgPSBsaW5rLmFmdGVyOwotICAgICAgICBsaW5rLmFmdGVyLmJlZm9yZSA9IGxpbmsuYmVmb3JlOwotICAgICAgICBsaW5rLmFmdGVyID0gbnVsbDsKLSAgICAgICAgbGluay5iZWZvcmUgPSBudWxsOwotICAgICAgICBzdXBlci5yZW1vdmVFbnRyeShlbnRyeSwgaGFzaEluZGV4LCBwcmV2aW91cyk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Y29kZT5iZWZvcmU8L2NvZGU+IGZpZWxkIGZyb20gYSA8Y29kZT5MaW5rRW50cnk8L2NvZGU+LgotICAgICAqIFVzZWQgaW4gc3ViY2xhc3NlcyB0aGF0IGhhdmUgbm8gdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gcXVlcnksIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5iZWZvcmU8L2NvZGU+IGZpZWxkIG9mIHRoZSBlbnRyeQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGVudHJ5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua0VudHJ5IGVudHJ5QmVmb3JlKExpbmtFbnRyeSBlbnRyeSkgewotICAgICAgICByZXR1cm4gZW50cnkuYmVmb3JlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Y29kZT5hZnRlcjwvY29kZT4gZmllbGQgZnJvbSBhIDxjb2RlPkxpbmtFbnRyeTwvY29kZT4uCi0gICAgICogVXNlZCBpbiBzdWJjbGFzc2VzIHRoYXQgaGF2ZSBubyB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBxdWVyeSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmFmdGVyPC9jb2RlPiBmaWVsZCBvZiB0aGUgZW50cnkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBlbnRyeSBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpbmtFbnRyeSBlbnRyeUFmdGVyKExpbmtFbnRyeSBlbnRyeSkgewotICAgICAgICByZXR1cm4gZW50cnkuYWZ0ZXI7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgdG8gdGhlIGl0ZXJhdG9yIGFmZmVjdCB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIE1hcEl0ZXJhdG9yIHJldHVybnMgdGhlIGtleXMgaW4gdGhlIG1hcC4gSXQgYWxzbyBwcm92aWRlcyBjb252ZW5pZW50Ci0gICAgICogbWV0aG9kcyB0byBnZXQgdGhlIGtleSBhbmQgdmFsdWUsIGFuZCBzZXQgdGhlIHZhbHVlLgotICAgICAqIEl0IGF2b2lkcyB0aGUgbmVlZCB0byBjcmVhdGUgYW4gZW50cnlTZXQva2V5U2V0L3ZhbHVlcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFwIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRW1wdHlPcmRlcmVkTWFwSXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMaW5rTWFwSXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3Igb3ZlciB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgaXRlcmF0b3IgYWZmZWN0IHRoaXMgbWFwLgotICAgICAqIDxwPgotICAgICAqIEEgTWFwSXRlcmF0b3IgcmV0dXJucyB0aGUga2V5cyBpbiB0aGUgbWFwLiBJdCBhbHNvIHByb3ZpZGVzIGNvbnZlbmllbnQKLSAgICAgKiBtZXRob2RzIHRvIGdldCB0aGUga2V5IGFuZCB2YWx1ZSwgYW5kIHNldCB0aGUgdmFsdWUuCi0gICAgICogSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGNyZWF0ZSBhbiBlbnRyeVNldC9rZXlTZXQvdmFsdWVzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXAgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgT3JkZXJlZE1hcEl0ZXJhdG9yIG9yZGVyZWRNYXBJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5T3JkZXJlZE1hcEl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGlua01hcEl0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTGlua01hcEl0ZXJhdG9yIGV4dGVuZHMgTGlua0l0ZXJhdG9yIGltcGxlbWVudHMgT3JkZXJlZE1hcEl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBMaW5rTWFwSXRlcmF0b3IoQWJzdHJhY3RMaW5rZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm5leHRFbnRyeSgpLmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wcmV2aW91c0VudHJ5KCkuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIEhhc2hFbnRyeSBjdXJyZW50ID0gY3VycmVudEVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5HRVRLRVlfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICBIYXNoRW50cnkgY3VycmVudCA9IGN1cnJlbnRFbnRyeSgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuR0VUVkFMVUVfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIEhhc2hFbnRyeSBjdXJyZW50ID0gY3VycmVudEVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5TRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW50cnkgc2V0IGl0ZXJhdG9yLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVudHJ5U2V0IGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGNyZWF0ZUVudHJ5U2V0SXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmIChzaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5T3JkZXJlZEl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeVNldCBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEVudHJ5U2V0SXRlcmF0b3IgZXh0ZW5kcyBMaW5rSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEVudHJ5U2V0SXRlcmF0b3IoQWJzdHJhY3RMaW5rZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm5leHRFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wcmV2aW91c0VudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBrZXkgc2V0IGl0ZXJhdG9yLgotICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleVNldCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVLZXlTZXRJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKHNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRW1wdHlPcmRlcmVkSXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXRJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZXlTZXQgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBLZXlTZXRJdGVyYXRvciBleHRlbmRzIEVudHJ5U2V0SXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIEtleVNldEl0ZXJhdG9yKEFic3RyYWN0TGlua2VkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0RW50cnkoKS5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJldmlvdXNFbnRyeSgpLmdldEtleSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHZhbHVlcyBpdGVyYXRvci4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHJldHVybiBpdGVyYXRvcnMgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgY3JlYXRlVmFsdWVzSXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmIChzaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5T3JkZXJlZEl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVmFsdWVzSXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGl0ZXJhdG9yLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmFsdWVzSXRlcmF0b3IgZXh0ZW5kcyBMaW5rSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFZhbHVlc0l0ZXJhdG9yKEFic3RyYWN0TGlua2VkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0RW50cnkoKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wcmV2aW91c0VudHJ5KCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogTGlua0VudHJ5IHRoYXQgc3RvcmVzIHRoZSBkYXRhLgotICAgICAqIDxwPgotICAgICAqIElmIHlvdSBzdWJjbGFzcyA8Y29kZT5BYnN0cmFjdExpbmtlZE1hcDwvY29kZT4gYnV0IG5vdCA8Y29kZT5MaW5rRW50cnk8L2NvZGU+Ci0gICAgICogdGhlbiB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHByb3RlY3RlZCBmaWVsZHMuCi0gICAgICogVGhlIDxjb2RlPmVudHJ5WHh4KCk8L2NvZGU+IG1ldGhvZHMgb24gPGNvZGU+QWJzdHJhY3RMaW5rZWRNYXA8L2NvZGU+IGV4aXN0Ci0gICAgICogdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGFjY2Vzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExpbmtFbnRyeSBleHRlbmRzIEhhc2hFbnRyeSB7Ci0gICAgICAgIC8qKiBUaGUgZW50cnkgYmVmb3JlIHRoaXMgb25lIGluIHRoZSBvcmRlciAqLwotICAgICAgICBwcm90ZWN0ZWQgTGlua0VudHJ5IGJlZm9yZTsKLSAgICAgICAgLyoqIFRoZSBlbnRyeSBhZnRlciB0aGlzIG9uZSBpbiB0aGUgb3JkZXIgKi8KLSAgICAgICAgcHJvdGVjdGVkIExpbmtFbnRyeSBhZnRlcjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBoYXNoIGJ1Y2tldCBzZXF1ZW5jZQotICAgICAgICAgKiBAcGFyYW0gaGFzaENvZGUgIHRoZSBoYXNoIGNvZGUKLSAgICAgICAgICogQHBhcmFtIGtleSAgdGhlIGtleQotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIExpbmtFbnRyeShIYXNoRW50cnkgbmV4dCwgaW50IGhhc2hDb2RlLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1cGVyKG5leHQsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBCYXNlIEl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgaW4gbGluayBvcmRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIExpbmtJdGVyYXRvcgotICAgICAgICAgICAgaW1wbGVtZW50cyBPcmRlcmVkSXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RMaW5rZWRNYXAgcGFyZW50OwotICAgICAgICAvKiogVGhlIGN1cnJlbnQgKGxhc3QgcmV0dXJuZWQpIGVudHJ5ICovCi0gICAgICAgIHByb3RlY3RlZCBMaW5rRW50cnkgbGFzdDsKLSAgICAgICAgLyoqIFRoZSBuZXh0IGVudHJ5ICovCi0gICAgICAgIHByb3RlY3RlZCBMaW5rRW50cnkgbmV4dDsKLSAgICAgICAgLyoqIFRoZSBtb2RpZmljYXRpb24gY291bnQgZXhwZWN0ZWQgKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCBleHBlY3RlZE1vZENvdW50OwotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIExpbmtJdGVyYXRvcihBYnN0cmFjdExpbmtlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIHRoaXMubmV4dCA9IHBhcmVudC5oZWFkZXIuYWZ0ZXI7Ci0gICAgICAgICAgICB0aGlzLmV4cGVjdGVkTW9kQ291bnQgPSBwYXJlbnQubW9kQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIChuZXh0ICE9IHBhcmVudC5oZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dC5iZWZvcmUgIT0gcGFyZW50LmhlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgTGlua0VudHJ5IG5leHRFbnRyeSgpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV4dCA9PSBwYXJlbnQuaGVhZGVyKSAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLk5PX05FWFRfRU5UUlkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGFzdCA9IG5leHQ7Ci0gICAgICAgICAgICBuZXh0ID0gbmV4dC5hZnRlcjsKLSAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIExpbmtFbnRyeSBwcmV2aW91c0VudHJ5KCkgewotICAgICAgICAgICAgaWYgKHBhcmVudC5tb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmtFbnRyeSBwcmV2aW91cyA9IG5leHQuYmVmb3JlOwotICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IHBhcmVudC5oZWFkZXIpICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuTk9fUFJFVklPVVNfRU5UUlkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dCA9IHByZXZpb3VzOwotICAgICAgICAgICAgbGFzdCA9IHByZXZpb3VzOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBMaW5rRW50cnkgY3VycmVudEVudHJ5KCkgewotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlJFTU9WRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGxhc3QuZ2V0S2V5KCkpOwotICAgICAgICAgICAgbGFzdCA9IG51bGw7Ci0gICAgICAgICAgICBleHBlY3RlZE1vZENvdW50ID0gcGFyZW50Lm1vZENvdW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIGxhc3QgPSBudWxsOwotICAgICAgICAgICAgbmV4dCA9IHBhcmVudC5oZWFkZXIuYWZ0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiSXRlcmF0b3JbIiArIGxhc3QuZ2V0S2V5KCkgKyAiPSIgKyBsYXN0LmdldFZhbHVlKCkgKyAiXSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiSXRlcmF0b3JbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TWFwRGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0TWFwRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNjUyYjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdE1hcERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFByb3ZpZGVzIGEgYmFzZSBkZWNvcmF0b3IgdGhhdCBlbmFibGVzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byBiZSBhZGRlZAotICogdG8gYSBNYXAgdmlhIGRlY29yYXRpb24uCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIGZvcndhcmRlZCBkaXJlY3RseSB0byB0aGUgZGVjb3JhdGVkIG1hcC4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSBzcGVjaWFsIHByb2Nlc3Npbmcgd2l0aAotICoge0BsaW5rICNlbnRyeVNldCgpfSwge0BsaW5rICNrZXlTZXQoKX0gb3Ige0BsaW5rICN2YWx1ZXMoKX0uIEluc3RlYWQKLSAqIGl0IHNpbXBseSByZXR1cm5zIHRoZSBzZXQvY29sbGVjdGlvbiBmcm9tIHRoZSB3cmFwcGVkIG1hcC4gVGhpcyBtYXkgYmUKLSAqIHVuZGVzaXJhYmxlLCBmb3IgZXhhbXBsZSBpZiB5b3UgYXJlIHRyeWluZyB0byB3cml0ZSBhIHZhbGlkYXRpbmcKLSAqIGltcGxlbWVudGF0aW9uIGl0IHdvdWxkIHByb3ZpZGUgYSBsb29waG9sZSBhcm91bmQgdGhlIHZhbGlkYXRpb24uCi0gKiBCdXQsIHlvdSBtaWdodCB3YW50IHRoYXQgbG9vcGhvbGUsIHNvIHRoaXMgY2xhc3MgaXMga2VwdCBzaW1wbGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBEYW5pZWwgUmFsbAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwRGVjb3JhdG9yIGltcGxlbWVudHMgTWFwIHsKLQotICAgIC8qKiBUaGUgbWFwIHRvIGRlY29yYXRlICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgbWFwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TWFwRGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RNYXBEZWNvcmF0b3IoTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgbWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRNYXAoKSB7Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtYXAuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuZW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwVG9Db3B5KSB7Ci0gICAgICAgIG1hcC5wdXRBbGwobWFwVG9Db3B5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbWFwLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtYXAudmFsdWVzKCk7Ci0gICAgfQotICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLmVxdWFscyhvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbWFwLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0T3JkZXJlZE1hcERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdE9yZGVyZWRNYXBEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRiMjYxMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0T3JkZXJlZE1hcERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXBJdGVyYXRvcjsKLQotLyoqIAotICogUHJvdmlkZXMgYSBiYXNlIGRlY29yYXRvciB0aGF0IGVuYWJsZXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGJlIGFkZGVkCi0gKiB0byBhbiBPcmRlcmVkTWFwIHZpYSBkZWNvcmF0aW9uLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBtYXAuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nIHdpdGggdGhlIG1hcCB2aWV3cy4KLSAqIEluc3RlYWQgaXQgc2ltcGx5IHJldHVybnMgdGhlIHNldC9jb2xsZWN0aW9uIGZyb20gdGhlIHdyYXBwZWQgbWFwLiBUaGlzIG1heSBiZQotICogdW5kZXNpcmFibGUsIGZvciBleGFtcGxlIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHdyaXRlIGEgdmFsaWRhdGluZyBpbXBsZW1lbnRhdGlvbgotICogaXQgd291bGQgcHJvdmlkZSBhIGxvb3Bob2xlIGFyb3VuZCB0aGUgdmFsaWRhdGlvbi4KLSAqIEJ1dCwgeW91IG1pZ2h0IHdhbnQgdGhhdCBsb29waG9sZSwgc28gdGhpcyBjbGFzcyBpcyBrZXB0IHNpbXBsZS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcmRlcmVkTWFwRGVjb3JhdG9yCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXBEZWNvcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkTWFwIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIG9ubHkgdXNlZCBpbiBkZXNlcmlhbGl6YXRpb24sIGRvIG5vdCB1c2Ugb3RoZXJ3aXNlLgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdE9yZGVyZWRNYXBEZWNvcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdE9yZGVyZWRNYXBEZWNvcmF0b3IoT3JkZXJlZE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3JkZXJlZE1hcCBnZXRPcmRlcmVkTWFwKCkgewotICAgICAgICByZXR1cm4gKE9yZGVyZWRNYXApIG1hcDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldE9yZGVyZWRNYXAoKS5maXJzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldE9yZGVyZWRNYXAoKS5sYXN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldE9yZGVyZWRNYXAoKS5uZXh0S2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcmV2aW91c0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRPcmRlcmVkTWFwKCkucHJldmlvdXNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwSXRlcmF0b3IgbWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPcmRlcmVkTWFwKCkubWFwSXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3JkZXJlZE1hcEl0ZXJhdG9yIG9yZGVyZWRNYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldE9yZGVyZWRNYXAoKS5vcmRlcmVkTWFwSXRlcmF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RSZWZlcmVuY2VNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJmMTNhNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Fic3RyYWN0UmVmZXJlbmNlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuRGVmYXVsdE1hcEVudHJ5OwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgaGFzaC1iYXNlZCBtYXAgdGhhdCBhbGxvd3MgdGhlIGVudHJpZXMgdG8KLSAqIGJlIHJlbW92ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIHRoZSBmZWF0dXJlcyBuZWNlc3NhcnkgZm9yIGEgc3ViY2xhc3MgcmVmZXJlbmNlCi0gKiBoYXNoLWJhc2VkIG1hcC4gS2V5LXZhbHVlIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgdGhlCi0gKiA8Y29kZT5SZWZlcmVuY2VFbnRyeTwvY29kZT4gY2xhc3Mgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYW5kIHJlcGxhY2VkLgotICogVGhlIGl0ZXJhdG9ycyBjYW4gc2ltaWxhcmx5IGJlIHJlcGxhY2VkLCB3aXRob3V0IHRoZSBuZWVkIHRvIHJlcGxhY2UgdGhlIEtleVNldCwKLSAqIEVudHJ5U2V0IGFuZCBWYWx1ZXMgdmlldyBjbGFzc2VzLgotICogPHA+Ci0gKiBPdmVycmlkYWJsZSBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaGFzaGluZyBiZWhhdmlvdXIsIGFuZAotICogdG8gY2hhbmdlIGhvdyBlbnRyaWVzIGFyZSBhZGRlZCB0byBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuIEhvcGVmdWxseSwgYWxsIHlvdQotICogbmVlZCBmb3IgdW51c3VhbCBzdWJjbGFzc2VzIGlzIGhlcmUuCi0gKiA8cD4KLSAqIFdoZW4geW91IGNvbnN0cnVjdCBhbiA8Y29kZT5BYnN0cmFjdFJlZmVyZW5jZU1hcDwvY29kZT4sIHlvdSBjYW4gc3BlY2lmeSB3aGF0Ci0gKiBraW5kIG9mIHJlZmVyZW5jZXMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIG1hcCdzIGtleXMgYW5kIHZhbHVlcy4KLSAqIElmIG5vbi1oYXJkIHJlZmVyZW5jZXMgYXJlIHVzZWQsIHRoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGNhbiByZW1vdmUKLSAqIG1hcHBpbmdzIGlmIGEga2V5IG9yIHZhbHVlIGJlY29tZXMgdW5yZWFjaGFibGUsIG9yIGlmIHRoZSBKVk0ncyBtZW1vcnkgaXMKLSAqIHJ1bm5pbmcgbG93LiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRoZSBkaWZmZXJlbnQgcmVmZXJlbmNlIHR5cGVzIGJlaGF2ZSwKLSAqIHNlZSB7QGxpbmsgUmVmZXJlbmNlfS4KLSAqIDxwPgotICogRGlmZmVyZW50IHR5cGVzIG9mIHJlZmVyZW5jZXMgY2FuIGJlIHNwZWNpZmllZCBmb3Iga2V5cyBhbmQgdmFsdWVzLgotICogVGhlIGtleXMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgd2VhayBidXQgdGhlIHZhbHVlcyBoYXJkLAotICogaW4gd2hpY2ggY2FzZSB0aGlzIGNsYXNzIHdpbGwgYmVoYXZlIGxpa2UgYQotICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC9kb2NzL2FwaS9qYXZhL3V0aWwvV2Vha0hhc2hNYXAuaHRtbCI+Ci0gKiA8Y29kZT5XZWFrSGFzaE1hcDwvY29kZT48L2E+LiBIb3dldmVyLCB5b3UgY2FuIGFsc28gc3BlY2lmeSBoYXJkIGtleXMgYW5kCi0gKiB3ZWFrIHZhbHVlcywgb3IgYW55IG90aGVyIGNvbWJpbmF0aW9uLiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VzCi0gKiBoYXJkIGtleXMgYW5kIHNvZnQgdmFsdWVzLCBwcm92aWRpbmcgYSBtZW1vcnktc2Vuc2l0aXZlIGNhY2hlLgotICogPHA+Ci0gKiBUaGlzIHtAbGluayBNYXB9IGltcGxlbWVudGF0aW9uIGRvZXMgPGk+bm90PC9pPiBhbGxvdyBudWxsIGVsZW1lbnRzLgotICogQXR0ZW1wdGluZyB0byBhZGQgYSBudWxsIGtleSBvciB2YWx1ZSB0byB0aGUgbWFwIHdpbGwgcmFpc2UgYQotICogPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+LgotICogPHA+Ci0gKiBBbGwgdGhlIGF2YWlsYWJsZSBpdGVyYXRvcnMgY2FuIGJlIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IGJ5IGNhc3RpbmcgdG8KLSAqIDxjb2RlPlJlc2V0dGFibGVJdGVyYXRvcjwvY29kZT4gYW5kIGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4KLSAqIFlvdSBjYW4gdXNlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwfSB0byAKLSAqIHByb3ZpZGUgc3luY2hyb25pemVkIGFjY2VzcyB0byBhIDxjb2RlPlJlZmVyZW5jZU1hcDwvY29kZT4uCi0gKgotICogQHNlZSBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZQotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xIChleHRyYWN0ZWQgZnJvbSBSZWZlcmVuY2VNYXAgaW4gMy4wKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKiAKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWZlcmVuY2VNYXAgZXh0ZW5kcyBBYnN0cmFjdEhhc2hlZE1hcCB7Ci0KLSAgICAvKiogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGhhcmQgcmVmZXJlbmNlcyBzaG91bGQgYmUgdXNlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUkQgPSAwOwotCi0gICAgLyoqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCBzb2Z0IHJlZmVyZW5jZXMgc2hvdWxkIGJlIHVzZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0ZUID0gMTsKLQotICAgIC8qKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgd2VhayByZWZlcmVuY2VzIHNob3VsZCBiZSB1c2VkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VBSyA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcmVmZXJlbmNlIHR5cGUgZm9yIGtleXMuICBNdXN0IGJlIEhBUkQsIFNPRlQsIFdFQUsuCi0gICAgICogQHNlcmlhbAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQga2V5VHlwZTsKLQotICAgIC8qKgotICAgICAqIFRoZSByZWZlcmVuY2UgdHlwZSBmb3IgdmFsdWVzLiAgTXVzdCBiZSBIQVJELCBTT0ZULCBXRUFLLgotICAgICAqIEBzZXJpYWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHZhbHVlVHlwZTsKLQotICAgIC8qKgotICAgICAqIFNob3VsZCB0aGUgdmFsdWUgYmUgYXV0b21hdGljYWxseSBwdXJnZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBrZXkgaGFzIGJlZW4gY29sbGVjdGVkPwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHB1cmdlVmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogUmVmZXJlbmNlUXVldWUgdXNlZCB0byBlbGltaW5hdGUgc3RhbGUgbWFwcGluZ3MuCi0gICAgICogU2VlIHB1cmdlLgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IFJlZmVyZW5jZVF1ZXVlIHF1ZXVlOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZWZlcmVuY2VNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSB0eXBlcywKLSAgICAgKiBsb2FkIGZhY3RvciBhbmQgaW5pdGlhbCBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciBrZXlzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3IgdmFsdWVzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIG1hcAotICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yICB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gcHVyZ2VWYWx1ZXMgIHNob3VsZCB0aGUgdmFsdWUgYmUgYXV0b21hdGljYWxseSBwdXJnZWQgd2hlbiB0aGUgCi0gICAgICogICBrZXkgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVmZXJlbmNlTWFwKAotICAgICAgICAgICAgaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUsIGludCBjYXBhY2l0eSwgCi0gICAgICAgICAgICBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHB1cmdlVmFsdWVzKSB7Ci0gICAgICAgIHN1cGVyKGNhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICAgICAgdmVyaWZ5KCJrZXlUeXBlIiwga2V5VHlwZSk7Ci0gICAgICAgIHZlcmlmeSgidmFsdWVUeXBlIiwgdmFsdWVUeXBlKTsKLSAgICAgICAgdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKLSAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7Ci0gICAgICAgIHRoaXMucHVyZ2VWYWx1ZXMgPSBwdXJnZVZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXNlIHRoaXMgc3ViY2xhc3MgZHVyaW5nIGNvbnN0cnVjdGlvbiwgY2xvbmluZyBvciBkZXNlcmlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSB0eXBlIGludCBpcyBhIHZhbGlkIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdmFsdWUgdG8gY2hlY2sKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaWYgaW52YWxpZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5KFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgewotICAgICAgICBpZiAoKHR5cGUgPCBIQVJEKSB8fCAodHlwZSA+IFdFQUspKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUgKyAiIG11c3QgYmUgSEFSRCwgU09GVCwgV0VBSy4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBtYXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcHVyZ2VCZWZvcmVSZWFkKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBpcyBjdXJyZW50bHkgZW1wdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgaXMgY3VycmVudGx5IHNpemUgemVybwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHB1cmdlQmVmb3JlUmVhZCgpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcHVyZ2VCZWZvcmVSZWFkKCk7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gZ2V0RW50cnkoa2V5KTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwdXJnZUJlZm9yZVJlYWQoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoZSBrZXkgc3BlY2lmaWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUsIG51bGwgaWYgbm8gbWF0Y2gKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIHB1cmdlQmVmb3JlUmVhZCgpOwotICAgICAgICBFbnRyeSBlbnRyeSA9IGdldEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFB1dHMgYSBrZXktdmFsdWUgbWFwcGluZyBpbnRvIHRoaXMgbWFwLgotICAgICAqIE5laXRoZXIgdGhlIGtleSBub3IgdGhlIHZhbHVlIG1heSBiZSBudWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcHJldmlvdXNseSBtYXBwZWQgdG8gdGhpcyBrZXksIG51bGwgaWYgbm9uZQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBrZXlzIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCB2YWx1ZXMgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1cmdlQmVmb3JlV3JpdGUoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZnJvbSB0aGlzIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUgbWFwcGluZyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHJlbW92ZWQga2V5LCBudWxsIGlmIGtleSBub3QgaW4gbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHB1cmdlQmVmb3JlV3JpdGUoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgc3VwZXIuY2xlYXIoKTsKLSAgICAgICAgd2hpbGUgKHF1ZXVlLnBvbGwoKSAhPSBudWxsKSB7fSAvLyBkcmFpbiB0aGUgcXVldWUKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhIE1hcEl0ZXJhdG9yIG92ZXIgdGhlIHJlZmVyZW5jZSBtYXAuCi0gICAgICogVGhlIGl0ZXJhdG9yIG9ubHkgcmV0dXJucyB2YWxpZCBrZXkvdmFsdWUgcGFpcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VNYXBJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhpcyBtYXAncyBlbnRyaWVzLgotICAgICAqIEFuIGl0ZXJhdG9yIHJldHVybmVkIGVudHJ5IGlzIHZhbGlkIHVudGlsIDxjb2RlPm5leHQoKTwvY29kZT4gaXMgY2FsbGVkIGFnYWluLgotICAgICAqIFRoZSA8Y29kZT5zZXRWYWx1ZSgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIDxjb2RlPnRvQXJyYXk8L2NvZGU+IGVudHJpZXMgaGFzIG5vIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzZXQgdmlldyBvZiB0aGlzIG1hcCdzIGVudHJpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBpZiAoZW50cnlTZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnlTZXQgPSBuZXcgUmVmZXJlbmNlRW50cnlTZXQodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5U2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGlzIG1hcCdzIGtleXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc2V0IHZpZXcgb2YgdGhpcyBtYXAncyBrZXlzCi0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChrZXlTZXQgPT0gbnVsbCkgewotICAgICAgICAgICAga2V5U2V0ID0gbmV3IFJlZmVyZW5jZUtleVNldCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4ga2V5U2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIHZpZXcgb2YgdGhpcyBtYXAncyB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc2V0IHZpZXcgb2YgdGhpcyBtYXAncyB2YWx1ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVzID0gbmV3IFJlZmVyZW5jZVZhbHVlcyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQdXJnZXMgc3RhbGUgbWFwcGluZ3MgZnJvbSB0aGlzIG1hcCBiZWZvcmUgcmVhZCBvcGVyYXRpb25zLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNwdXJnZSgpfSB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHVyZ2VCZWZvcmVSZWFkKCkgewotICAgICAgICBwdXJnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1cmdlcyBzdGFsZSBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwIGJlZm9yZSB3cml0ZSBvcGVyYXRpb25zLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNwdXJnZSgpfSB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgc3RhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHVyZ2VCZWZvcmVXcml0ZSgpIHsKLSAgICAgICAgcHVyZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXJnZXMgc3RhbGUgbWFwcGluZ3MgZnJvbSB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IHN5bmNocm9uaXplZCEgIFNwZWNpYWwKLSAgICAgKiBjYXJlIG11c3QgYmUgdGFrZW4gaWYsIGZvciBpbnN0YW5jZSwgeW91IHdhbnQgc3RhbGUKLSAgICAgKiBtYXBwaW5ncyB0byBiZSByZW1vdmVkIG9uIGEgcGVyaW9kaWMgYmFzaXMgYnkgc29tZQotICAgICAqIGJhY2tncm91bmQgdGhyZWFkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHB1cmdlKCkgewotICAgICAgICBSZWZlcmVuY2UgcmVmID0gcXVldWUucG9sbCgpOwotICAgICAgICB3aGlsZSAocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHB1cmdlKHJlZik7Ci0gICAgICAgICAgICByZWYgPSBxdWV1ZS5wb2xsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXJnZXMgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlZiAgdGhlIHJlZmVyZW5jZSB0byBwdXJnZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHB1cmdlKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgLy8gVGhlIGhhc2hDb2RlIG9mIHRoZSByZWZlcmVuY2UgaXMgdGhlIGhhc2hDb2RlIG9mIHRoZQotICAgICAgICAvLyBtYXBwaW5nIGtleSwgZXZlbiBpZiB0aGUgcmVmZXJlbmNlIHJlZmVycyB0byB0aGUgCi0gICAgICAgIC8vIG1hcHBpbmcgdmFsdWUuLi4KLSAgICAgICAgaW50IGhhc2ggPSByZWYuaGFzaENvZGUoKTsKLSAgICAgICAgaW50IGluZGV4ID0gaGFzaEluZGV4KGhhc2gsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgSGFzaEVudHJ5IHByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgSGFzaEVudHJ5IGVudHJ5ID0gZGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoKChSZWZlcmVuY2VFbnRyeSkgZW50cnkpLnB1cmdlKHJlZikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuc2l6ZS0tOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbnRyeSBtYXBwZWQgdG8gdGhlIGtleSBzcGVjaWZpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIGVudHJ5LCBudWxsIGlmIG5vIG1hdGNoCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2hFbnRyeSBnZXRFbnRyeShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RW50cnkoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSBmb3IgYSBNYXBFbnRyeS4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzLCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlIGlkZW50aXR5SGFzaENvZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBnZXQgYSBoYXNoIGNvZGUgZm9yLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIGdldCBhIGhhc2ggY29kZSBmb3IsIG1heSBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlLCBhcyBwZXIgdGhlIE1hcEVudHJ5IHNwZWNpZmljYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGhhc2hFbnRyeShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChrZXkgPT0gbnVsbCA/IDAgOiBrZXkuaGFzaENvZGUoKSkgXgotICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28ga2V5cywgaW4gaW50ZXJuYWwgY29udmVydGVkIGZvcm0sIHRvIHNlZSBpZiB0aGV5IGFyZSBlcXVhbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnZlcnRzIHRoZSBrZXkgZnJvbSB0aGUgZW50cnkgdG8gYSByZWFsIHJlZmVyZW5jZQotICAgICAqIGJlZm9yZSBjb21wYXJpc29uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5IHRvIGNvbXBhcmUgcGFzc2VkIGluIGZyb20gb3V0c2lkZQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleSBleHRyYWN0ZWQgZnJvbSB0aGUgZW50cnkgdmlhIDxjb2RlPmVudHJ5LmtleTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWFsS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotICAgICAgICBrZXkyID0gKGtleVR5cGUgPiBIQVJEID8gKChSZWZlcmVuY2UpIGtleTIpLmdldCgpIDoga2V5Mik7Ci0gICAgICAgIHJldHVybiAoa2V5MSA9PSBrZXkyIHx8IGtleTEuZXF1YWxzKGtleTIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJlZmVyZW5jZUVudHJ5IGluc3RlYWQgb2YgYSBIYXNoRW50cnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IGVudHJ5IGluIHNlcXVlbmNlCi0gICAgICogQHBhcmFtIGhhc2hDb2RlICB0aGUgaGFzaCBjb2RlIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc3RvcmUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZW50cnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGNyZWF0ZUVudHJ5KEhhc2hFbnRyeSBuZXh0LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZUVudHJ5KHRoaXMsIG5leHQsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVudHJ5IHNldCBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeVNldCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVFbnRyeVNldEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZUVudHJ5U2V0SXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBrZXkgc2V0IGl0ZXJhdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleVNldCBpdGVyYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJdGVyYXRvciBjcmVhdGVLZXlTZXRJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VLZXlTZXRJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHZhbHVlcyBpdGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlcmF0b3IgY3JlYXRlVmFsdWVzSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVmFsdWVzSXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEVudHJ5U2V0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VFbnRyeVNldCBleHRlbmRzIEVudHJ5U2V0IHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBSZWZlcmVuY2VFbnRyeVNldChBYnN0cmFjdEhhc2hlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyKSB7Ci0gICAgICAgICAgICAvLyBzcGVjaWFsIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBkaXNhcHBlYXJpbmcgZW50cmllcwotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZSA9IChFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBEZWZhdWx0TWFwRW50cnkoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KGFycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogS2V5U2V0IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VLZXlTZXQgZXh0ZW5kcyBLZXlTZXQgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZUtleVNldChBYnN0cmFjdEhhc2hlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyKSB7Ci0gICAgICAgICAgICAvLyBzcGVjaWFsIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBkaXNhcHBlYXJpbmcga2V5cwotICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChwYXJlbnQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KGFycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VWYWx1ZXMgZXh0ZW5kcyBWYWx1ZXMgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZVZhbHVlcyhBYnN0cmFjdEhhc2hlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyKSB7Ci0gICAgICAgICAgICAvLyBzcGVjaWFsIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBkaXNhcHBlYXJpbmcgdmFsdWVzCi0gICAgICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHBhcmVudC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoYXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBBIE1hcEVudHJ5IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIGdldEtleSgpIG9yIGdldFZhbHVlKCkgcmV0dXJucyBudWxsLCBpdCBtZWFucwotICAgICAqIHRoZSBtYXBwaW5nIGlzIHN0YWxlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUVudHJ5IGV4dGVuZHMgSGFzaEVudHJ5IHsKLSAgICAgICAgLyoqIFRoZSBwYXJlbnQgbWFwICovCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdFJlZmVyZW5jZU1hcCBwYXJlbnQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgZW50cnkgb2JqZWN0IGZvciB0aGUgUmVmZXJlbmNlTWFwLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBtYXAKLSAgICAgICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBoYXNoIGJ1Y2tldAotICAgICAgICAgKiBAcGFyYW0gaGFzaENvZGUgIHRoZSBoYXNoIGNvZGUgb2YgdGhlIGtleQotICAgICAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnkoQWJzdHJhY3RSZWZlcmVuY2VNYXAgcGFyZW50LCBIYXNoRW50cnkgbmV4dCwgaW50IGhhc2hDb2RlLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1cGVyKG5leHQsIGhhc2hDb2RlLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgdGhpcy5rZXkgPSB0b1JlZmVyZW5jZShwYXJlbnQua2V5VHlwZSwga2V5LCBoYXNoQ29kZSk7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdG9SZWZlcmVuY2UocGFyZW50LnZhbHVlVHlwZSwgdmFsdWUsIGhhc2hDb2RlKTsgLy8gdGhlIGtleSBoYXNoQ29kZSBpcyBwYXNzZWQgaW4gZGVsaWJlcmF0ZWx5Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUga2V5IGZyb20gdGhlIGVudHJ5LgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZXJlZmVyZW5jZXMgd2VhayBhbmQgc29mdCBrZXlzIGFuZCB0aHVzIG1heSByZXR1cm4gbnVsbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGtleSwgd2hpY2ggbWF5IGJlIG51bGwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiAocGFyZW50LmtleVR5cGUgPiBIQVJEKSA/ICgoUmVmZXJlbmNlKSBrZXkpLmdldCgpIDoga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGVudHJ5LgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZXJlZmVyZW5jZXMgd2VhayBhbmQgc29mdCB2YWx1ZSBhbmQgdGh1cyBtYXkgcmV0dXJuIG51bGwuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgd2hpY2ggbWF5IGJlIG51bGwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQudmFsdWVUeXBlID4gSEFSRCkgPyAoKFJlZmVyZW5jZSkgdmFsdWUpLmdldCgpIDogdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudHJ5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBzdG9yZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2xkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQudmFsdWVUeXBlID4gSEFSRCkgewotICAgICAgICAgICAgICAgICgoUmVmZXJlbmNlKXZhbHVlKS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSB0b1JlZmVyZW5jZShwYXJlbnQudmFsdWVUeXBlLCBvYmosIGhhc2hDb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29tcGFyZXMgdGhpcyBtYXAgZW50cnkgdG8gYW5vdGhlci4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyA8Y29kZT5pc0VxdWFsS2V5PC9jb2RlPiBhbmQKLSAgICAgICAgICogPGNvZGU+aXNFcXVhbFZhbHVlPC9jb2RlPiBvbiB0aGUgbWFpbiBtYXAgZm9yIGNvbXBhcmlzb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb3RoZXIgbWFwIGVudHJ5IHRvIGNvbXBhcmUgdG8KLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsLCBmYWxzZSBpZiBub3QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpb2JqOwotICAgICAgICAgICAgT2JqZWN0IGVudHJ5S2V5ID0gZW50cnkuZ2V0S2V5KCk7ICAvLyBjb252ZXJ0IHRvIGhhcmQgcmVmZXJlbmNlCi0gICAgICAgICAgICBPYmplY3QgZW50cnlWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7ICAvLyBjb252ZXJ0IHRvIGhhcmQgcmVmZXJlbmNlCi0gICAgICAgICAgICBpZiAoKGVudHJ5S2V5ID09IG51bGwpIHx8IChlbnRyeVZhbHVlID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29tcGFyZSB1c2luZyBtYXAgbWV0aG9kcywgYWlkaW5nIGlkZW50aXR5IHN1YmNsYXNzCi0gICAgICAgICAgICAvLyBub3RlIHRoYXQga2V5IGlzIGRpcmVjdCBhY2Nlc3MgYW5kIHZhbHVlIGlzIHZpYSBtZXRob2QKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuaXNFcXVhbEtleShlbnRyeUtleSwga2V5KSAmJgotICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0VxdWFsVmFsdWUoZW50cnlWYWx1ZSwgZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgaGFzaGNvZGUgb2YgdGhlIGVudHJ5IHVzaW5nIHRlbXBvcmFyeSBoYXJkIHJlZmVyZW5jZXMuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPGNvZGU+aGFzaEVudHJ5PC9jb2RlPiBvbiB0aGUgbWFpbiBtYXAuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBoYXNoY29kZSBvZiB0aGUgZW50cnkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50Lmhhc2hFbnRyeShnZXRLZXkoKSwgZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHJlZmVyZW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZSB0byB0aGUgZ2l2ZW4gcmVmZXJlbnQuCi0gICAgICAgICAqIFRoZSByZWZlcmVuY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBxdWV1ZSBmb3IgbGF0ZXIgcHVyZ2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHR5cGUgIEhBUkQsIFNPRlQgb3IgV0VBSwotICAgICAgICAgKiBAcGFyYW0gcmVmZXJlbnQgIHRoZSBvYmplY3QgdG8gcmVmZXIgdG8KLSAgICAgICAgICogQHBhcmFtIGhhc2ggIHRoZSBoYXNoIGNvZGUgb2YgdGhlIDxpPmtleTwvaT4gb2YgdGhlIG1hcHBpbmc7Ci0gICAgICAgICAqICAgIHRoaXMgbnVtYmVyIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHJlZmVyZW50Lmhhc2hDb2RlKCkgaWYKLSAgICAgICAgICogICAgdGhlIHJlZmVyZW50IHJlcHJlc2VudHMgYSB2YWx1ZSBhbmQgbm90IGEga2V5Ci0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHRvUmVmZXJlbmNlKGludCB0eXBlLCBPYmplY3QgcmVmZXJlbnQsIGludCBoYXNoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEhBUkQ6IHJldHVybiByZWZlcmVudDsKLSAgICAgICAgICAgICAgICBjYXNlIFNPRlQ6IHJldHVybiBuZXcgU29mdFJlZihoYXNoLCByZWZlcmVudCwgcGFyZW50LnF1ZXVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFdFQUs6IHJldHVybiBuZXcgV2Vha1JlZihoYXNoLCByZWZlcmVudCwgcGFyZW50LnF1ZXVlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQdXJnZXMgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UKLSAgICAgICAgICogQHBhcmFtIHJlZiAgdGhlIHJlZmVyZW5jZSB0byBwdXJnZQotICAgICAgICAgKiBAcmV0dXJuIHRydWUgb3IgZmFsc2UKLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gcHVyZ2UoUmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgYm9vbGVhbiByID0gKHBhcmVudC5rZXlUeXBlID4gSEFSRCkgJiYgKGtleSA9PSByZWYpOwotICAgICAgICAgICAgciA9IHIgfHwgKChwYXJlbnQudmFsdWVUeXBlID4gSEFSRCkgJiYgKHZhbHVlID09IHJlZikpOwotICAgICAgICAgICAgaWYgKHIpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50LmtleVR5cGUgPiBIQVJEKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoUmVmZXJlbmNlKWtleSkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudC52YWx1ZVR5cGUgPiBIQVJEKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoUmVmZXJlbmNlKXZhbHVlKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnB1cmdlVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBidWNrZXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBidWNrZXQKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBSZWZlcmVuY2VFbnRyeSBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIChSZWZlcmVuY2VFbnRyeSkgbmV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBUaGUgRW50cnlTZXQgaXRlcmF0b3IuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUVudHJ5U2V0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgICAgIC8qKiBUaGUgcGFyZW50IG1hcCAqLwotICAgICAgICBmaW5hbCBBYnN0cmFjdFJlZmVyZW5jZU1hcCBwYXJlbnQ7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGVzZSBmaWVsZHMga2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIHRhYmxlLgotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIFJlZmVyZW5jZUVudHJ5IGVudHJ5OwotICAgICAgICBSZWZlcmVuY2VFbnRyeSBwcmV2aW91czsKLQotICAgICAgICAvLyBUaGVzZSBPYmplY3QgZmllbGRzIHByb3ZpZGUgaGFyZCByZWZlcmVuY2VzIHRvIHRoZQotICAgICAgICAvLyBjdXJyZW50IGFuZCBuZXh0IGVudHJ5OyB0aGlzIGFzc3VyZXMgdGhhdCBpZiBoYXNOZXh0KCkKLSAgICAgICAgLy8gcmV0dXJucyB0cnVlLCBuZXh0KCkgd2lsbCBhY3R1YWxseSByZXR1cm4gYSB2YWxpZCBlbGVtZW50LgotICAgICAgICBPYmplY3QgbmV4dEtleSwgbmV4dFZhbHVlOwotICAgICAgICBPYmplY3QgY3VycmVudEtleSwgY3VycmVudFZhbHVlOwotCi0gICAgICAgIGludCBleHBlY3RlZE1vZENvdW50OwotCi0gICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeVNldEl0ZXJhdG9yKEFic3RyYWN0UmVmZXJlbmNlTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgaW5kZXggPSAocGFyZW50LnNpemUoKSAhPSAwID8gcGFyZW50LmRhdGEubGVuZ3RoIDogMCk7Ci0gICAgICAgICAgICAvLyBoYXZlIHRvIGRvIHRoaXMgaGVyZSEgIHNpemUoKSBpbnZvY2F0aW9uIGFib3ZlCi0gICAgICAgICAgICAvLyBtYXkgaGF2ZSBhbHRlcmVkIHRoZSBtb2RDb3VudC4KLSAgICAgICAgICAgIGV4cGVjdGVkTW9kQ291bnQgPSBwYXJlbnQubW9kQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0TnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnkgZSA9IGVudHJ5OwotICAgICAgICAgICAgICAgIGludCBpID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICBlID0gKFJlZmVyZW5jZUVudHJ5KSBwYXJlbnQuZGF0YVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBlOwotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5leHRLZXkgPSBlLmdldEtleSgpOwotICAgICAgICAgICAgICAgIG5leHRWYWx1ZSA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dE51bGwoKSkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja01vZCgpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQubW9kQ291bnQgIT0gZXhwZWN0ZWRNb2RDb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbmV4dE51bGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG5leHRLZXkgPT0gbnVsbCkgfHwgKG5leHRWYWx1ZSA9PSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBSZWZlcmVuY2VFbnRyeSBuZXh0RW50cnkoKSB7ICAgIAotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIGlmIChuZXh0TnVsbCgpICYmICFoYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldmlvdXMgPSBlbnRyeTsKLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dCgpOwotICAgICAgICAgICAgY3VycmVudEtleSA9IG5leHRLZXk7Ci0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7Ci0gICAgICAgICAgICBuZXh0S2V5ID0gbnVsbDsKLSAgICAgICAgICAgIG5leHRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlRW50cnkgY3VycmVudEVudHJ5KCkgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIHJldHVybiBwcmV2aW91czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgY2hlY2tNb2QoKTsKLSAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50LnJlbW92ZShjdXJyZW50S2V5KTsKLSAgICAgICAgICAgIHByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBudWxsOwotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGV4cGVjdGVkTW9kQ291bnQgPSBwYXJlbnQubW9kQ291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUga2V5U2V0IGl0ZXJhdG9yLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VLZXlTZXRJdGVyYXRvciBleHRlbmRzIFJlZmVyZW5jZUVudHJ5U2V0SXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgUmVmZXJlbmNlS2V5U2V0SXRlcmF0b3IoQWJzdHJhY3RSZWZlcmVuY2VNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCkuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWVzIGl0ZXJhdG9yLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VWYWx1ZXNJdGVyYXRvciBleHRlbmRzIFJlZmVyZW5jZUVudHJ5U2V0SXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgUmVmZXJlbmNlVmFsdWVzSXRlcmF0b3IoQWJzdHJhY3RSZWZlcmVuY2VNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBNYXBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlTWFwSXRlcmF0b3IgZXh0ZW5kcyBSZWZlcmVuY2VFbnRyeVNldEl0ZXJhdG9yIGltcGxlbWVudHMgTWFwSXRlcmF0b3IgewotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZU1hcEl0ZXJhdG9yKEFic3RyYWN0UmVmZXJlbmNlTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKS5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICAgICAgSGFzaEVudHJ5IGN1cnJlbnQgPSBjdXJyZW50RW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLkdFVEtFWV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIEhhc2hFbnRyeSBjdXJyZW50ID0gY3VycmVudEVudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5HRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgSGFzaEVudHJ5IGN1cnJlbnQgPSBjdXJyZW50RW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlNFVFZBTFVFX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBUaGVzZSB0d28gY2xhc3NlcyBzdG9yZSB0aGUgaGFzaENvZGUgb2YgdGhlIGtleSBvZgotICAgIC8vIG9mIHRoZSBtYXBwaW5nLCBzbyB0aGF0IGFmdGVyIHRoZXkncmUgZGVxdWV1ZWQgYSBxdWljawotICAgIC8vIGxvb2t1cCBvZiB0aGUgYnVja2V0IGluIHRoZSB0YWJsZSBjYW4gb2NjdXIuCi0KLSAgICAvKioKLSAgICAgKiBBIHNvZnQgcmVmZXJlbmNlIGhvbGRlci4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgU29mdFJlZiBleHRlbmRzIFNvZnRSZWZlcmVuY2UgewotICAgICAgICAvKiogdGhlIGhhc2hDb2RlIG9mIHRoZSBrZXkgKGV2ZW4gaWYgdGhlIHJlZmVyZW5jZSBwb2ludHMgdG8gYSB2YWx1ZSkgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgaGFzaDsKLQotICAgICAgICBwdWJsaWMgU29mdFJlZihpbnQgaGFzaCwgT2JqZWN0IHIsIFJlZmVyZW5jZVF1ZXVlIHEpIHsKLSAgICAgICAgICAgIHN1cGVyKHIsIHEpOwotICAgICAgICAgICAgdGhpcy5oYXNoID0gaGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgd2VhayByZWZlcmVuY2UgaG9sZGVyLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBXZWFrUmVmIGV4dGVuZHMgV2Vha1JlZmVyZW5jZSB7Ci0gICAgICAgIC8qKiB0aGUgaGFzaENvZGUgb2YgdGhlIGtleSAoZXZlbiBpZiB0aGUgcmVmZXJlbmNlIHBvaW50cyB0byBhIHZhbHVlKSAqLwotICAgICAgICBwcml2YXRlIGludCBoYXNoOwotCi0gICAgICAgIHB1YmxpYyBXZWFrUmVmKGludCBoYXNoLCBPYmplY3QgciwgUmVmZXJlbmNlUXVldWUgcSkgewotICAgICAgICAgICAgc3VwZXIociwgcSk7Ci0gICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBzdXBlcmNsYXNzIG1ldGhvZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTZXJpYWxpemF0aW9uIGlzIG5vdCBvbmUgb2YgdGhlIEpESydzIG5pY2VzdCB0b3BpY3MuIE5vcm1hbCBzZXJpYWxpemF0aW9uIHdpbGwKLSAgICAgKiBpbml0aWFsaXNlIHRoZSBzdXBlcmNsYXNzIGJlZm9yZSB0aGUgc3ViY2xhc3MuIFNvbWV0aW1lcyBob3dldmVyLCB0aGlzIGlzbid0Ci0gICAgICogd2hhdCB5b3Ugd2FudCwgYXMgaW4gdGhpcyBjYXNlIHRoZSA8Y29kZT5wdXQoKTwvY29kZT4gbWV0aG9kIG9uIHJlYWQgY2FuIGJlCi0gICAgICogYWZmZWN0ZWQgYnkgc3ViY2xhc3Mgc3RhdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNvbHV0aW9uIGFkb3B0ZWQgaGVyZSBpcyB0byBzZXJpYWxpemUgdGhlIHN0YXRlIGRhdGEgb2YgdGhpcyBjbGFzcyBpbgotICAgICAqIHRoaXMgcHJvdGVjdGVkIG1ldGhvZC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYnkgdGhlCi0gICAgICogPGNvZGU+d3JpdGVPYmplY3QoKTwvY29kZT4gb2YgdGhlIGZpcnN0IHNlcmlhbGl6YWJsZSBzdWJjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiB0aGV5IGhhdmUgYSBzcGVjaWZpYyBmaWVsZCB0aGF0IG11c3QgYmUgcHJlc2VudAotICAgICAqIG9uIHJlYWQgYmVmb3JlIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCB3b3JrLiBHZW5lcmFsbHksIHRoZSByZWFkIGRldGVybWluZXMKLSAgICAgKiB3aGF0IG11c3QgYmUgc2VyaWFsaXplZCBoZXJlLCBpZiBhbnl0aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvV3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlSW50KGtleVR5cGUpOwotICAgICAgICBvdXQud3JpdGVJbnQodmFsdWVUeXBlKTsKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihwdXJnZVZhbHVlcyk7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KGxvYWRGYWN0b3IpOwotICAgICAgICBvdXQud3JpdGVJbnQoZGF0YS5sZW5ndGgpOwotICAgICAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ID0gbWFwSXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoaXQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG51bGwpOyAgLy8gbnVsbCB0ZXJtaW5hdGUgbWFwCi0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN1cGVyLmRvV3JpdGVPYmplY3QoKSBhcyBjb2RlIHRoZXJlIGRvZXNuJ3Qgd29yayBmb3IgcmVmZXJlbmNlIG1hcAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBzdXBlcmNsYXNzbSBtZXRob2QgdG8gcmVhZCB0aGUgc3RhdGUgb2YgdGhpcyBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTZXJpYWxpemF0aW9uIGlzIG5vdCBvbmUgb2YgdGhlIEpESydzIG5pY2VzdCB0b3BpY3MuIE5vcm1hbCBzZXJpYWxpemF0aW9uIHdpbGwKLSAgICAgKiBpbml0aWFsaXNlIHRoZSBzdXBlcmNsYXNzIGJlZm9yZSB0aGUgc3ViY2xhc3MuIFNvbWV0aW1lcyBob3dldmVyLCB0aGlzIGlzbid0Ci0gICAgICogd2hhdCB5b3Ugd2FudCwgYXMgaW4gdGhpcyBjYXNlIHRoZSA8Y29kZT5wdXQoKTwvY29kZT4gbWV0aG9kIG9uIHJlYWQgY2FuIGJlCi0gICAgICogYWZmZWN0ZWQgYnkgc3ViY2xhc3Mgc3RhdGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNvbHV0aW9uIGFkb3B0ZWQgaGVyZSBpcyB0byBkZXNlcmlhbGl6ZSB0aGUgc3RhdGUgZGF0YSBvZiB0aGlzIGNsYXNzIGluCi0gICAgICogdGhpcyBwcm90ZWN0ZWQgbWV0aG9kLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBieSB0aGUKLSAgICAgKiA8Y29kZT5yZWFkT2JqZWN0KCk8L2NvZGU+IG9mIHRoZSBmaXJzdCBzZXJpYWxpemFibGUgc3ViY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhlIHN1YmNsYXNzIGhhcyBhIHNwZWNpZmljIGZpZWxkIHRoYXQgbXVzdCBiZSBwcmVzZW50Ci0gICAgICogYmVmb3JlIDxjb2RlPnB1dCgpPC9jb2RlPiBvciA8Y29kZT5jYWxjdWxhdGVUaHJlc2hvbGQoKTwvY29kZT4gd2lsbCB3b3JrIGNvcnJlY3RseS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1JlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMua2V5VHlwZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIHRoaXMucHVyZ2VWYWx1ZXMgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBpbi5yZWFkRmxvYXQoKTsKLSAgICAgICAgaW50IGNhcGFjaXR5ID0gaW4ucmVhZEludCgpOwotICAgICAgICBpbml0KCk7Ci0gICAgICAgIGRhdGEgPSBuZXcgSGFzaEVudHJ5W2NhcGFjaXR5XTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB0aHJlc2hvbGQgPSBjYWxjdWxhdGVUaHJlc2hvbGQoZGF0YS5sZW5ndGgsIGxvYWRGYWN0b3IpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdXBlci5kb1JlYWRPYmplY3QoKSBhcyBjb2RlIHRoZXJlIGRvZXNuJ3Qgd29yayBmb3IgcmVmZXJlbmNlIG1hcAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFNvcnRlZE1hcERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9BYnN0cmFjdFNvcnRlZE1hcERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjNlNmY5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQWJzdHJhY3RTb3J0ZWRNYXBEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotLyoqIAotICogUHJvdmlkZXMgYSBiYXNlIGRlY29yYXRvciB0aGF0IGVuYWJsZXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGJlIGFkZGVkCi0gKiB0byBhIE1hcCB2aWEgZGVjb3JhdGlvbi4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgZm9yd2FyZGVkIGRpcmVjdGx5IHRvIHRoZSBkZWNvcmF0ZWQgbWFwLgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IHNwZWNpYWwgcHJvY2Vzc2luZyB3aXRoIHRoZSBtYXAgdmlld3MuCi0gKiBJbnN0ZWFkIGl0IHNpbXBseSByZXR1cm5zIHRoZSBzZXQvY29sbGVjdGlvbiBmcm9tIHRoZSB3cmFwcGVkIG1hcC4gVGhpcyBtYXkgYmUKLSAqIHVuZGVzaXJhYmxlLCBmb3IgZXhhbXBsZSBpZiB5b3UgYXJlIHRyeWluZyB0byB3cml0ZSBhIHZhbGlkYXRpbmcgaW1wbGVtZW50YXRpb24KLSAqIGl0IHdvdWxkIHByb3ZpZGUgYSBsb29waG9sZSBhcm91bmQgdGhlIHZhbGlkYXRpb24uCi0gKiBCdXQsIHlvdSBtaWdodCB3YW50IHRoYXQgbG9vcGhvbGUsIHNvIHRoaXMgY2xhc3MgaXMga2VwdCBzaW1wbGUuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U29ydGVkTWFwRGVjb3JhdG9yCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXBEZWNvcmF0b3IgaW1wbGVtZW50cyBTb3J0ZWRNYXAgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U29ydGVkTWFwRGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RTb3J0ZWRNYXBEZWNvcmF0b3IoU29ydGVkTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIG1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRNYXAgZ2V0U29ydGVkTWFwKCkgewotICAgICAgICByZXR1cm4gKFNvcnRlZE1hcCkgbWFwOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkuY29tcGFyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZmlyc3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5maXJzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgaGVhZE1hcChPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmhlYWRNYXAodG9LZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmxhc3RLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHN1Yk1hcChPYmplY3QgZnJvbUtleSwgT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5zdWJNYXAoZnJvbUtleSwgdG9LZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgdGFpbE1hcChPYmplY3QgZnJvbUtleSkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkudGFpbE1hcChmcm9tS2V5KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQ2FzZUluc2Vuc2l0aXZlTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0Nhc2VJbnNlbnNpdGl2ZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzA3MWRlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvQ2FzZUluc2Vuc2l0aXZlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBjYXNlLWluc2Vuc2l0aXZlIDxjb2RlPk1hcDwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBtYXAsIGtleXMgYXJlIGNvbnZlcnRlZCB0byBhbGwgbG93ZXJjYXNlLiBBIG5ldyAKLSAqIGtleSBpcyBjb21wYXJlZCB0byBleGlzdGluZyBrZXlzIGJ5IGNvbXBhcmluZyA8Y29kZT5uZXdLZXkudG9TdHJpbmcoKS50b0xvd2VyKCk8L2NvZGU+Ci0gKiB0byB0aGUgbG93ZXJjYXNlIHZhbHVlcyBpbiB0aGUgY3VycmVudCA8Y29kZT5LZXlTZXQuPC9jb2RlPgotICogPHA+Ci0gKiBOdWxsIGtleXMgYXJlIHN1cHBvcnRlZC4gIAotICogPHA+Ci0gKiBUaGUgPGNvZGU+a2V5U2V0KCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGFsbCBsb3dlcmNhc2Uga2V5cywgb3IgbnVsbHMuCi0gKiA8cD4KLSAqIEV4YW1wbGU6Ci0gKiA8cHJlPjxjb2RlPgotICogIE1hcCBtYXAgPSBuZXcgQ2FzZUluc2Vuc2l0aXZlTWFwKCk7Ci0gKiAgbWFwLnB1dCgiT25lIiwgIk9uZSIpOwotICogIG1hcC5wdXQoIlR3byIsICJUd28iKTsKLSAqICBtYXAucHV0KG51bGwsICJUaHJlZSIpOwotICogIG1hcC5wdXQoIm9uZSIsICJGb3VyIik7Ci0gKiA8L2NvZGU+PC9wcmU+Ci0gKiBjcmVhdGVzIGEgPGNvZGU+Q2FzZUluc2Vuc2l0aXZlTWFwPC9jb2RlPiB3aXRoIHRocmVlIGVudHJpZXMuPGJyPgotICogPGNvZGU+bWFwLmdldChudWxsKTwvY29kZT4gcmV0dXJucyA8Y29kZT4iVGhyZWUiPC9jb2RlPiBhbmQgPGNvZGU+bWFwLmdldCgiT05FIik8L2NvZGU+Ci0gKiByZXR1cm5zIDxjb2RlPiJGb3VyIi48L2NvZGU+ICBUaGUgPGNvZGU+U2V0PC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT5rZXlTZXQoKTwvY29kZT4KLSAqIGVxdWFscyA8Y29kZT57Im9uZSIsICJ0d28iLCBudWxsfS48L2NvZGU+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IENhc2VJbnNlbnNpdGl2ZU1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKgotICogQGF1dGhvciBDb21tb25zLUNvbGxlY3Rpb25zIHRlYW0KLSAqLwotcHVibGljIGNsYXNzIENhc2VJbnNlbnNpdGl2ZU1hcCBleHRlbmRzIEFic3RyYWN0SGFzaGVkTWFwIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgewotCi0gICAgLyoqIFNlcmlhbGlzYXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDc0NjU1OTE3MzY5Mjk5NDU2TDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgbWFwIHdpdGggZGVmYXVsdCBzaXplIGFuZCBsb2FkIGZhY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FzZUluc2Vuc2l0aXZlTWFwKCkgewotICAgICAgICBzdXBlcihERUZBVUxUX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBERUZBVUxUX1RIUkVTSE9MRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5LiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQotICAgICAqLwotICAgIHB1YmxpYyBDYXNlSW5zZW5zaXRpdmVNYXAoaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKLSAgICAgKiBsb2FkIGZhY3Rvci4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eQotICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yICB0aGUgbG9hZCBmYWN0b3IKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFjdG9yIGlzIGxlc3MgdGhhbiB6ZXJvCi0gICAgICovCi0gICAgcHVibGljIENhc2VJbnNlbnNpdGl2ZU1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3Rvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY29weWluZyBlbGVtZW50cyBmcm9tIGFub3RoZXIgbWFwLgotICAgICAqIDxwPgotICAgICAqIEtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBzdHJpbmdzLCB3aGljaCBtYXkgY2F1c2UKLSAgICAgKiBzb21lIGVudHJpZXMgdG8gYmUgcmVtb3ZlZCAoaWYgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGtleXMgZGlmZmVyCi0gICAgICogb25seSBieSBjaGFyYWN0ZXIgY2FzZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNvcHkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDYXNlSW5zZW5zaXRpdmVNYXAoTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZXMgY29udmVydEtleSgpIGZyb20ge0BsaW5rIEFic3RyYWN0SGFzaGVkTWFwfSB0byBjb252ZXJ0IGtleXMgdG8gCi0gICAgICogbG93ZXIgY2FzZS4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIG51bGwgaWYga2V5IGlzIG51bGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSBjb252ZXJ0Ci0gICAgICogQHJldHVybiB0aGUgY29udmVydGVkIGtleQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgY29udmVydEtleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RIYXNoZWRNYXAuTlVMTDsKLSAgICAgICAgfQotICAgIH0gICAKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbG9uZXMgdGhlIG1hcCB3aXRob3V0IGNsb25pbmcgdGhlIGtleXMgb3IgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgbWFwIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIGRvV3JpdGVPYmplY3Qob3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgZG9SZWFkT2JqZWN0KGluKTsKLSAgICB9Ci0gCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0NvbXBvc2l0ZU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Db21wb3NpdGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTlkM2ViYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0NvbXBvc2l0ZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Db2xsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uQ29tcG9zaXRlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LkNvbXBvc2l0ZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYSBtYXAgb2Ygb3RoZXIgbWFwcyB0byBwcm92aWRlIGEgc2luZ2xlIHVuaWZpZWQgdmlldy4KLSAqIDxwPgotICogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgbWFwIHdpbGwgYWN0dWFsbHkgYmUgbWFkZSBvbiB0aGUgZGVjb3JhdGVkIG1hcC4KLSAqIEFkZCBhbmQgcmVtb3ZlIG9wZXJhdGlvbnMgcmVxdWlyZSB0aGUgdXNlIG9mIGEgcGx1Z2dhYmxlIHN0cmF0ZWd5LiBJZiBubwotICogc3RyYXRlZ3kgaXMgcHJvdmlkZWQgdGhlbiBhZGQgYW5kIHJlbW92ZSBhcmUgdW5zdXBwb3J0ZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IENvbXBvc2l0ZU1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKgotICogQGF1dGhvciBCcmlhbiBNY0NhbGxpc3RlcgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTWFwIGltcGxlbWVudHMgTWFwIHsKLQotICAgIC8qKiBBcnJheSBvZiBhbGwgbWFwcyBpbiB0aGUgY29tcG9zaXRlICovCi0gICAgcHJpdmF0ZSBNYXBbXSBjb21wb3NpdGU7Ci0KLSAgICAvKiogSGFuZGxlIG11dGF0aW9uIG9wZXJhdGlvbnMgKi8KLSAgICBwcml2YXRlIE1hcE11dGF0b3IgbXV0YXRvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHksIENvbXBvc2l0ZU1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9zaXRlTWFwKCkgewotICAgICAgICB0aGlzKG5ldyBNYXBbXXt9LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ29tcG9zaXRlTWFwIHdpdGggdHdvIGNvbXBvc2l0ZWQgTWFwIGluc3RhbmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb25lICB0aGUgZmlyc3QgTWFwIHRvIGJlIGNvbXBvc2l0ZWQKLSAgICAgKiBAcGFyYW0gdHdvICB0aGUgc2Vjb25kIE1hcCB0byBiZSBjb21wb3NpdGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBrZXkgY29sbGlzaW9uCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZU1hcChNYXAgb25lLCBNYXAgdHdvKSB7Ci0gICAgICAgIHRoaXMobmV3IE1hcFtde29uZSwgdHdvfSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbXBvc2l0ZU1hcCB3aXRoIHR3byBjb21wb3NpdGVkIE1hcCBpbnN0YW5jZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9uZSAgdGhlIGZpcnN0IE1hcCB0byBiZSBjb21wb3NpdGVkCi0gICAgICogQHBhcmFtIHR3byAgdGhlIHNlY29uZCBNYXAgdG8gYmUgY29tcG9zaXRlZAotICAgICAqIEBwYXJhbSBtdXRhdG9yICBNYXBNdXRhdG9yIHRvIGJlIHVzZWQgZm9yIG11dGF0aW9uIG9wZXJhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9zaXRlTWFwKE1hcCBvbmUsIE1hcCB0d28sIE1hcE11dGF0b3IgbXV0YXRvcikgewotICAgICAgICB0aGlzKG5ldyBNYXBbXXtvbmUsIHR3b30sIG11dGF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb21wb3NpdGVNYXAgd2hpY2ggY29tcG9zaXRlcyBhbGwgb2YgdGhlIE1hcCBpbnN0YW5jZXMgaW4gdGhlCi0gICAgICogYXJndW1lbnQuIEl0IGNvcGllcyB0aGUgYXJndW1lbnQgYXJyYXksIGl0IGRvZXMgbm90IHVzZSBpdCBkaXJlY3RseS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlICB0aGUgTWFwcyB0byBiZSBjb21wb3NpdGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBrZXkgY29sbGlzaW9uCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZU1hcChNYXBbXSBjb21wb3NpdGUpIHsKLSAgICAgICAgdGhpcyhjb21wb3NpdGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb21wb3NpdGVNYXAgd2hpY2ggY29tcG9zaXRlcyBhbGwgb2YgdGhlIE1hcCBpbnN0YW5jZXMgaW4gdGhlCi0gICAgICogYXJndW1lbnQuIEl0IGNvcGllcyB0aGUgYXJndW1lbnQgYXJyYXksIGl0IGRvZXMgbm90IHVzZSBpdCBkaXJlY3RseS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlICBNYXBzIHRvIGJlIGNvbXBvc2l0ZWQKLSAgICAgKiBAcGFyYW0gbXV0YXRvciAgTWFwTXV0YXRvciB0byBiZSB1c2VkIGZvciBtdXRhdGlvbiBvcGVyYXRpb25zCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZU1hcChNYXBbXSBjb21wb3NpdGUsIE1hcE11dGF0b3IgbXV0YXRvcikgewotICAgICAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotICAgICAgICB0aGlzLmNvbXBvc2l0ZSA9IG5ldyBNYXBbMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSBjb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9zaXRlZChjb21wb3NpdGVbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIE1hcE11dGF0b3IgdG8gYmUgdXNlZCBieSBtdXRhdGlvbiBvcGVyYXRpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtdXRhdG9yICB0aGUgTWFwTXV0YXRvciB0byBiZSB1c2VkIGZvciBtdXRhdGlvbiBkZWxlZ2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TXV0YXRvcihNYXBNdXRhdG9yIG11dGF0b3IpIHsKLSAgICAgICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGFkZGl0aW9uYWwgTWFwIHRvIHRoZSBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgTWFwIHRvIGJlIGFkZGVkIHRvIHRoZSBjb21wb3NpdGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGtleSBjb2xsaXNpb24gYW5kIHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICBNYXBNdXRhdG9yIHNldCB0byBoYW5kbGUgaXQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbXBvc2l0ZWQoTWFwIG1hcCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBjb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gaW50ZXJzZWN0ID0gQ29sbGVjdGlvblV0aWxzLmludGVyc2VjdGlvbih0aGlzLmNvbXBvc2l0ZVtpXS5rZXlTZXQoKSwgbWFwLmtleVNldCgpKTsKLSAgICAgICAgICAgIGlmIChpbnRlcnNlY3Quc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5tdXRhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2V5IGNvbGxpc2lvbiBhZGRpbmcgTWFwIHRvIENvbXBvc2l0ZU1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdG9yLnJlc29sdmVDb2xsaXNpb24odGhpcywgdGhpcy5jb21wb3NpdGVbaV0sIG1hcCwgaW50ZXJzZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWFwW10gdGVtcCA9IG5ldyBNYXBbdGhpcy5jb21wb3NpdGUubGVuZ3RoICsgMV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5jb21wb3NpdGUsIDAsIHRlbXAsIDAsIHRoaXMuY29tcG9zaXRlLmxlbmd0aCk7Ci0gICAgICAgIHRlbXBbdGVtcC5sZW5ndGggLSAxXSA9IG1hcDsKLSAgICAgICAgdGhpcy5jb21wb3NpdGUgPSB0ZW1wOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBNYXAgZnJvbSB0aGUgY29tcG9zaXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIE1hcCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4gVGhlIHJlbW92ZWQgTWFwIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG1hcCBpcyBub3QgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwIHJlbW92ZUNvbXBvc2l0ZWQoTWFwIG1hcCkgewotICAgICAgICBpbnQgc2l6ZSA9IHRoaXMuY29tcG9zaXRlLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZVtpXS5lcXVhbHMobWFwKSkgewotICAgICAgICAgICAgICAgIE1hcFtdIHRlbXAgPSBuZXcgTWFwW3NpemUgLSAxXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tcG9zaXRlLCAwLCB0ZW1wLCAwLCBpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tcG9zaXRlLCBpICsgMSwgdGVtcCwgaSwgc2l6ZSAtIGkgLSAxKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZSA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmNsZWFyKCk8L2NvZGU+IG9uIGFsbCBjb21wb3NpdGVkIE1hcHMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgY29tcG9zaXRlZCBNYXBzIGRvIG5vdCBzdXBwb3J0IGNsZWFyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuY29tcG9zaXRlLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZVtpXS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBrZXkuICBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgYW5kIG9ubHkgaWYKLSAgICAgKiB0aGlzIG1hcCBjb250YWlucyBhdCBhIG1hcHBpbmcgZm9yIGEga2V5IDx0dD5rPC90dD4gc3VjaCB0aGF0Ci0gICAgICogPHR0PihrZXk9PW51bGwgPyBrPT1udWxsIDoga2V5LmVxdWFscyhrKSk8L3R0Pi4gIChUaGVyZSBjYW4gYmUKLSAgICAgKiBhdCBtb3N0IG9uZSBzdWNoIG1hcHBpbmcuKQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAga2V5IHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZC4KLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkCi0gICAgICogICAgICAgICBrZXkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSBmb3IKLSAgICAgKiAJCSAgdGhpcyBtYXAgKG9wdGlvbmFsKS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgPHR0Pm51bGw8L3R0PiBhbmQgdGhpcyBtYXAKLSAgICAgKiAgICAgICAgICAgIGRvZXMgbm90IG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PiBrZXlzIChvcHRpb25hbCkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5jb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZVtpXS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgbWFwcyBvbmUgb3IgbW9yZSBrZXlzIHRvIHRoZQotICAgICAqIHNwZWNpZmllZCB2YWx1ZS4gIE1vcmUgZm9ybWFsbHksIHJldHVybnMgPHR0PnRydWU8L3R0PiBpZiBhbmQgb25seSBpZgotICAgICAqIHRoaXMgbWFwIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtYXBwaW5nIHRvIGEgdmFsdWUgPHR0PnY8L3R0PiBzdWNoIHRoYXQKLSAgICAgKiA8dHQ+KHZhbHVlPT1udWxsID8gdj09bnVsbCA6IHZhbHVlLmVxdWFscyh2KSk8L3R0Pi4gIFRoaXMgb3BlcmF0aW9uCi0gICAgICogd2lsbCBwcm9iYWJseSByZXF1aXJlIHRpbWUgbGluZWFyIGluIHRoZSBtYXAgc2l6ZSBmb3IgbW9zdAotICAgICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgPHR0Pk1hcDwvdHQ+IGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIG1hcCBpcyB0byBiZSB0ZXN0ZWQuCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUKLSAgICAgKiAgICAgICAgIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlIGZvcgotICAgICAqIAkJICB0aGlzIG1hcCAob3B0aW9uYWwpLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIDx0dD5udWxsPC90dD4gYW5kIHRoaXMgbWFwCi0gICAgICogICAgICAgICAgICBkb2VzIG5vdCBub3QgcGVybWl0IDx0dD5udWxsPC90dD4gdmFsdWVzIChvcHRpb25hbCkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuY29tcG9zaXRlLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb21wb3NpdGVbaV0uY29udGFpbnNWYWx1ZSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgRWFjaCBlbGVtZW50Ci0gICAgICogaW4gdGhlIHJldHVybmVkIHNldCBpcyBhIDxjb2RlPk1hcC5FbnRyeTwvY29kZT4uICBUaGUgc2V0IGlzIGJhY2tlZCBieSB0aGUKLSAgICAgKiBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluIHRoZSBzZXQsIGFuZCB2aWNlLXZlcnNhLgotICAgICAqIElmIHRoZSBtYXAgaXMgbW9kaWZpZWQgd2hpbGUgYW4gaXRlcmF0aW9uIG92ZXIgdGhlIHNldCBpcyBpbiBwcm9ncmVzcywKLSAgICAgKiB0aGUgcmVzdWx0cyBvZiB0aGUgaXRlcmF0aW9uIGFyZSB1bmRlZmluZWQuICBUaGUgc2V0IHN1cHBvcnRzIGVsZW1lbnQKLSAgICAgKiByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUgbWFwLCB2aWEgdGhlCi0gICAgICogPHR0Pkl0ZXJhdG9yLnJlbW92ZTwvdHQ+LCA8dHQ+U2V0LnJlbW92ZTwvdHQ+LCA8dHQ+cmVtb3ZlQWxsPC90dD4sCi0gICAgICogPHR0PnJldGFpbkFsbDwvdHQ+IGFuZCA8dHQ+Y2xlYXI8L3R0PiBvcGVyYXRpb25zLiAgSXQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqIHRoZSA8dHQ+YWRkPC90dD4gb3IgPHR0PmFkZEFsbDwvdHQ+IG9wZXJhdGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+Q29tcG9zaXRlU2V0PC9jb2RlPiB3aGljaAotICAgICAqIGNvbXBvc2l0ZXMgdGhlIGVudHJ5IHNldHMgZnJvbSBhbGwgb2YgdGhlIGNvbXBvc2l0ZWQgbWFwcy4KLSAgICAgKgotICAgICAqIEBzZWUgQ29tcG9zaXRlU2V0Ci0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBtYXBwaW5ncyBjb250YWluZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgQ29tcG9zaXRlU2V0IGVudHJpZXMgPSBuZXcgQ29tcG9zaXRlU2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLmNvbXBvc2l0ZS5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgZW50cmllcy5hZGRDb21wb3NpdGVkKHRoaXMuY29tcG9zaXRlW2ldLmVudHJ5U2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIG1hcCBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LiAgUmV0dXJucwotICAgICAqIDx0dD5udWxsPC90dD4gaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleS4gIEEgcmV0dXJuCi0gICAgICogdmFsdWUgb2YgPHR0Pm51bGw8L3R0PiBkb2VzIG5vdCA8aT5uZWNlc3NhcmlseTwvaT4gaW5kaWNhdGUgdGhhdCB0aGUKLSAgICAgKiBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhlIGtleTsgaXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIG1hcAotICAgICAqIGV4cGxpY2l0bHkgbWFwcyB0aGUga2V5IHRvIDx0dD5udWxsPC90dD4uICBUaGUgPHR0PmNvbnRhaW5zS2V5PC90dD4KLSAgICAgKiBvcGVyYXRpb24gbWF5IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgdHdvIGNhc2VzLgotICAgICAqCi0gICAgICogPHA+TW9yZSBmb3JtYWxseSwgaWYgdGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gYSBrZXkKLSAgICAgKiA8dHQ+azwvdHQ+IHRvIGEgdmFsdWUgPHR0PnY8L3R0PiBzdWNoIHRoYXQgPHR0PihrZXk9PW51bGwgPyBrPT1udWxsIDoKLSAgICAgKiBrZXkuZXF1YWxzKGspKTwvdHQ+LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgPHR0PnY8L3R0Pjsgb3RoZXJ3aXNlCi0gICAgICogaXQgcmV0dXJucyA8dHQ+bnVsbDwvdHQ+LiAgKFRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBzdWNoIG1hcHBpbmcuKQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIG1hcCBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LCBvcgotICAgICAqCSAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSBmb3IKLSAgICAgKiAJCSAgdGhpcyBtYXAgKG9wdGlvbmFsKS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGtleSBpcyA8dHQ+bnVsbDwvdHQ+IGFuZCB0aGlzIG1hcCBkb2VzIG5vdAotICAgICAqCQkgIG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PiBrZXlzIChvcHRpb25hbCkuCi0gICAgICoKLSAgICAgKiBAc2VlICNjb250YWluc0tleShPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5jb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZVtpXS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zaXRlW2ldLmdldChrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8ga2V5LXZhbHVlIG1hcHBpbmdzLgotICAgICAqCi0gICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIGtleS12YWx1ZSBtYXBwaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5jb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5jb21wb3NpdGVbaV0uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgVGhlIHNldCBpcwotICAgICAqIGJhY2tlZCBieSB0aGUgbWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBtYXAgYXJlIHJlZmxlY3RlZCBpbiB0aGUgc2V0LCBhbmQKLSAgICAgKiB2aWNlLXZlcnNhLiAgSWYgdGhlIG1hcCBpcyBtb2RpZmllZCB3aGlsZSBhbiBpdGVyYXRpb24gb3ZlciB0aGUgc2V0IGlzCi0gICAgICogaW4gcHJvZ3Jlc3MsIHRoZSByZXN1bHRzIG9mIHRoZSBpdGVyYXRpb24gYXJlIHVuZGVmaW5lZC4gIFRoZSBzZXQKLSAgICAgKiBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tCi0gICAgICogdGhlIG1hcCwgdmlhIHRoZSA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sIDx0dD5TZXQucmVtb3ZlPC90dD4sCi0gICAgICogPHR0PnJlbW92ZUFsbDwvdHQ+IDx0dD5yZXRhaW5BbGw8L3R0PiwgYW5kIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbnMuCi0gICAgICogSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWRkIG9yIDx0dD5hZGRBbGw8L3R0PiBvcGVyYXRpb25zLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIDxjb2RlPkNvbXBvc2l0ZVNldDwvY29kZT4gd2hpY2gKLSAgICAgKiBjb21wb3NpdGVzIHRoZSBrZXkgc2V0cyBmcm9tIGFsbCBvZiB0aGUgY29tcG9zaXRlZCBtYXBzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNldCB2aWV3IG9mIHRoZSBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgQ29tcG9zaXRlU2V0IGtleXMgPSBuZXcgQ29tcG9zaXRlU2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLmNvbXBvc2l0ZS5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAga2V5cy5hZGRDb21wb3NpdGVkKHRoaXMuY29tcG9zaXRlW2ldLmtleVNldCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4ga2V5czsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBtYXAKLSAgICAgKiAob3B0aW9uYWwgb3BlcmF0aW9uKS4gIElmIHRoZSBtYXAgcHJldmlvdXNseSBjb250YWluZWQgYSBtYXBwaW5nIGZvcgotICAgICAqIHRoaXMga2V5LCB0aGUgb2xkIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuICAoQSBtYXAKLSAgICAgKiA8dHQ+bTwvdHQ+IGlzIHNhaWQgdG8gY29udGFpbiBhIG1hcHBpbmcgZm9yIGEga2V5IDx0dD5rPC90dD4gaWYgYW5kIG9ubHkKLSAgICAgKiBpZiB7QGxpbmsgI2NvbnRhaW5zS2V5KE9iamVjdCkgbS5jb250YWluc0tleShrKX0gd291bGQgcmV0dXJuCi0gICAgICogPHR0PnRydWU8L3R0Pi4pKQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+Ci0gICAgICoJICAgICAgIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuICBBIDx0dD5udWxsPC90dD4gcmV0dXJuIGNhbgotICAgICAqCSAgICAgICBhbHNvIGluZGljYXRlIHRoYXQgdGhlIG1hcCBwcmV2aW91c2x5IGFzc29jaWF0ZWQgPHR0Pm51bGw8L3R0PgotICAgICAqCSAgICAgICB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBpZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKLSAgICAgKgkgICAgICAgPHR0Pm51bGw8L3R0PiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIG5vIE1hcE11dGF0b3IgaGFzIGJlZW4gc3BlY2lmaWVkCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlCi0gICAgICogCSAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzb21lIGFzcGVjdCBvZiB0aGlzIGtleSBvciB2YWx1ZQotICAgICAqCSAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRoaXMgbWFwIGRvZXMgbm90IHBlcm1pdCA8dHQ+bnVsbDwvdHQ+Ci0gICAgICogICAgICAgICAgICBrZXlzIG9yIHZhbHVlcywgYW5kIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlIGlzCi0gICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodGhpcy5tdXRhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm8gbXV0YXRvciBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5tdXRhdG9yLnB1dCh0aGlzLCB0aGlzLmNvbXBvc2l0ZSwga2V5LCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvcGllcyBhbGwgb2YgdGhlIG1hcHBpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAgdG8gdGhpcyBtYXAKLSAgICAgKiAob3B0aW9uYWwgb3BlcmF0aW9uKS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gdGhhdAotICAgICAqIG9mIGNhbGxpbmcge0BsaW5rICNwdXQoT2JqZWN0LE9iamVjdCkgcHV0KGssIHYpfSBvbiB0aGlzIG1hcCBvbmNlCi0gICAgICogZm9yIGVhY2ggbWFwcGluZyBmcm9tIGtleSA8dHQ+azwvdHQ+IHRvIHZhbHVlIDx0dD52PC90dD4gaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIG1hcC4gIFRoZSBiZWhhdmlvciBvZiB0aGlzIG9wZXJhdGlvbiBpcyB1bnNwZWNpZmllZCBpZiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgbWFwIGlzIG1vZGlmaWVkIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwIE1hcHBpbmdzIHRvIGJlIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5wdXRBbGw8L3R0PiBtZXRob2QgaXMKLSAgICAgKiAJCSAgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBvZiBhIGtleSBvciB2YWx1ZSBpbiB0aGUKLSAgICAgKiAJICAgICAgICAgIHNwZWNpZmllZCBtYXAgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdG9yZWQgaW4gdGhpcyBtYXAuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzb21lIGFzcGVjdCBvZiBhIGtleSBvciB2YWx1ZSBpbiB0aGUKLSAgICAgKgkgICAgICAgICAgc3BlY2lmaWVkIG1hcCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRoZSBzcGVjaWZpZWQgbWFwIGlzIDx0dD5udWxsPC90dD4sIG9yIGlmCi0gICAgICogICAgICAgICB0aGlzIG1hcCBkb2VzIG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PiBrZXlzIG9yIHZhbHVlcywgYW5kIHRoZQotICAgICAqICAgICAgICAgc3BlY2lmaWVkIG1hcCBjb250YWlucyA8dHQ+bnVsbDwvdHQ+IGtleXMgb3IgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7Ci0gICAgICAgIGlmICh0aGlzLm11dGF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJObyBtdXRhdG9yIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubXV0YXRvci5wdXRBbGwodGhpcywgdGhpcy5jb21wb3NpdGUsIG1hcCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBtYXAgaWYgaXQgaXMgcHJlc2VudAotICAgICAqIChvcHRpb25hbCBvcGVyYXRpb24pLiAgIE1vcmUgZm9ybWFsbHksIGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZwotICAgICAqIGZyb20ga2V5IDx0dD5rPC90dD4gdG8gdmFsdWUgPHR0PnY8L3R0PiBzdWNoIHRoYXQKLSAgICAgKiA8Y29kZT4oa2V5PT1udWxsID8gIGs9PW51bGwgOiBrZXkuZXF1YWxzKGspKTwvY29kZT4sIHRoYXQgbWFwcGluZwotICAgICAqIGlzIHJlbW92ZWQuICAoVGhlIG1hcCBjYW4gY29udGFpbiBhdCBtb3N0IG9uZSBzdWNoIG1hcHBpbmcuKQotICAgICAqCi0gICAgICogPHA+UmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIG1hcCBwcmV2aW91c2x5IGFzc29jaWF0ZWQgdGhlIGtleSwgb3IKLSAgICAgKiA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbmVkIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LiAgKEEKLSAgICAgKiA8dHQ+bnVsbDwvdHQ+IHJldHVybiBjYW4gYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBtYXAgcHJldmlvdXNseQotICAgICAqIGFzc29jaWF0ZWQgPHR0Pm51bGw8L3R0PiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGlmIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgICAqIHN1cHBvcnRzIDx0dD5udWxsPC90dD4gdmFsdWVzLikgIFRoZSBtYXAgd2lsbCBub3QgY29udGFpbiBhIG1hcHBpbmcgZm9yCi0gICAgICogdGhlIHNwZWNpZmllZCAga2V5IG9uY2UgdGhlIGNhbGwgcmV0dXJucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCi0gICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgPHR0Pm51bGw8L3R0PgotICAgICAqCSAgICAgICBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LgotICAgICAqCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUgZm9yCi0gICAgICogCQkgIHRoZSBjb21wb3NpdGVkIG1hcCAob3B0aW9uYWwpLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGtleSBpcyA8dHQ+bnVsbDwvdHQ+IGFuZCB0aGUgY29tcG9zaXRlZCBtYXAKLSAgICAgKiAgICAgICAgICAgIGRvZXMgbm90IG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PiBrZXlzIChvcHRpb25hbCkuCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgPHR0PnJlbW92ZTwvdHQ+IG1ldGhvZCBpcwotICAgICAqICAgICAgICAgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9zaXRlZCBtYXAgY29udGFpbmluZyB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBmb3IgKGludCBpID0gdGhpcy5jb21wb3NpdGUubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZVtpXS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zaXRlW2ldLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLiAgSWYgdGhlCi0gICAgICogbWFwIGNvbnRhaW5zIG1vcmUgdGhhbiA8dHQ+SW50ZWdlci5NQVhfVkFMVUU8L3R0PiBlbGVtZW50cywgcmV0dXJucwotICAgICAqIDx0dD5JbnRlZ2VyLk1BWF9WQUxVRTwvdHQ+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuY29tcG9zaXRlLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcG9zaXRlW2ldLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gIFRoZQotICAgICAqIGNvbGxlY3Rpb24gaXMgYmFja2VkIGJ5IHRoZSBtYXAsIHNvIGNoYW5nZXMgdG8gdGhlIG1hcCBhcmUgcmVmbGVjdGVkIGluCi0gICAgICogdGhlIGNvbGxlY3Rpb24sIGFuZCB2aWNlLXZlcnNhLiAgSWYgdGhlIG1hcCBpcyBtb2RpZmllZCB3aGlsZSBhbgotICAgICAqIGl0ZXJhdGlvbiBvdmVyIHRoZSBjb2xsZWN0aW9uIGlzIGluIHByb2dyZXNzLCB0aGUgcmVzdWx0cyBvZiB0aGUKLSAgICAgKiBpdGVyYXRpb24gYXJlIHVuZGVmaW5lZC4gIFRoZSBjb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQgcmVtb3ZhbCwKLSAgICAgKiB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUgbWFwLCB2aWEgdGhlCi0gICAgICogPHR0Pkl0ZXJhdG9yLnJlbW92ZTwvdHQ+LCA8dHQ+Q29sbGVjdGlvbi5yZW1vdmU8L3R0PiwKLSAgICAgKiA8dHQ+cmVtb3ZlQWxsPC90dD4sIDx0dD5yZXRhaW5BbGw8L3R0PiBhbmQgPHR0PmNsZWFyPC90dD4gb3BlcmF0aW9ucy4KLSAgICAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhZGQgb3IgPHR0PmFkZEFsbDwvdHQ+IG9wZXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29tcG9zaXRlQ29sbGVjdGlvbiBrZXlzID0gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuY29tcG9zaXRlLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBrZXlzLmFkZENvbXBvc2l0ZWQodGhpcy5jb21wb3NpdGVbaV0udmFsdWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBrZXlzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBNYXAgZXF1YWxzIGFub3RoZXIgYXMgcGVyIHRoZSBNYXAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcHMgYXJlIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG9iajsKLSAgICAgICAgICAgIHJldHVybiAodGhpcy5lbnRyeVNldCgpLmVxdWFscyhtYXAuZW50cnlTZXQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGhhc2ggY29kZSBmb3IgdGhlIE1hcCBhcyBwZXIgdGhlIE1hcCBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBjb2RlID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgY29kZSArPSBpLm5leHQoKS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb2RlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGVmaW5pdGlvbiBmb3IgYWxsIG9mIHRoZSBpbmRldGVybWluYXRlCi0gICAgICogbXV0YXRvcnMgaW4gYSBDb21wb3NpdGVNYXAsIGFzIHdlbGwgYXMgcHJvdmlkaW5nIGEgaG9vayBmb3IKLSAgICAgKiBjYWxsYmFja3Mgb24ga2V5IGNvbGxpc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTWFwTXV0YXRvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgYSBuZXcgQ29tcG9zaXRlZCBNYXAgcmVzdWx0cyBpbiBhCi0gICAgICAgICAqIGtleSBjb2xsaXNpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb21wb3NpdGUgIHRoZSBDb21wb3NpdGVNYXAgd2l0aCB0aGUgY29sbGlzaW9uCi0gICAgICAgICAqIEBwYXJhbSBleGlzdGluZyAgdGhlIE1hcCBhbHJlYWR5IGluIHRoZSBjb21wb3NpdGUgd2hpY2ggY29udGFpbnMgdGhlCi0gICAgICAgICAqICAgICAgICBvZmZlbmRpbmcga2V5Ci0gICAgICAgICAqIEBwYXJhbSBhZGRlZCAgdGhlIE1hcCBiZWluZyBhZGRlZAotICAgICAgICAgKiBAcGFyYW0gaW50ZXJzZWN0ICB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBrZXlzZXRzIG9mIHRoZSBleGlzdGluZyBhbmQgYWRkZWQgbWFwcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVzb2x2ZUNvbGxpc2lvbigKLSAgICAgICAgICAgIENvbXBvc2l0ZU1hcCBjb21wb3NpdGUsIE1hcCBleGlzdGluZywgTWFwIGFkZGVkLCBDb2xsZWN0aW9uIGludGVyc2VjdCk7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIENvbXBvc2l0ZU1hcC5wdXQoKSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1hcCAgdGhlIENvbXBvc2l0ZU1hcCB3aGljaCBpcyBiZWluZyBtb2RpZmllZAotICAgICAgICAgKiBAcGFyYW0gY29tcG9zaXRlZCAgYXJyYXkgb2YgTWFwcyBpbiB0aGUgQ29tcG9zaXRlTWFwIGJlaW5nIG1vZGlmaWVkCi0gICAgICAgICAqIEBwYXJhbSBrZXkgIGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmUgYXNzb2NpYXRlZC4KLSAgICAgICAgICogQHBhcmFtIHZhbHVlICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yIDx0dD5udWxsPC90dD4KLSAgICAgICAgICoJICAgICAgIGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuICBBIDx0dD5udWxsPC90dD4gcmV0dXJuIGNhbgotICAgICAgICAgKgkgICAgICAgYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBtYXAgcHJldmlvdXNseSBhc3NvY2lhdGVkIDx0dD5udWxsPC90dD4KLSAgICAgICAgICoJICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotICAgICAgICAgKgkgICAgICAgPHR0Pm51bGw8L3R0PiB2YWx1ZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbm90IGRlZmluZWQKLSAgICAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlCi0gICAgICAgICAqIAkgICAgICAgICAgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdG9yZWQgaW4gdGhpcyBtYXAuCi0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWUgYXNwZWN0IG9mIHRoaXMga2V5IG9yIHZhbHVlCi0gICAgICAgICAqCSAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aGlzIG1hcCBkb2VzIG5vdCBwZXJtaXQgPHR0Pm51bGw8L3R0PgotICAgICAgICAgKiAgICAgICAgICAgIGtleXMgb3IgdmFsdWVzLCBhbmQgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUgaXMKLSAgICAgICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBwdXQoQ29tcG9zaXRlTWFwIG1hcCwgTWFwW10gY29tcG9zaXRlZCwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgQ29tcG9zaXRlTWFwLnB1dEFsbCgpIG1ldGhvZCBpcyBpbnZva2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFwICB0aGUgQ29tcG9zaXRlTWFwIHdoaWNoIGlzIGJlaW5nIG1vZGlmaWVkCi0gICAgICAgICAqIEBwYXJhbSBjb21wb3NpdGVkICBhcnJheSBvZiBNYXBzIGluIHRoZSBDb21wb3NpdGVNYXAgYmVpbmcgbW9kaWZpZWQKLSAgICAgICAgICogQHBhcmFtIG1hcFRvQWRkICBNYXBwaW5ncyB0byBiZSBzdG9yZWQgaW4gdGhpcyBDb21wb3NpdGVNYXAKLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBub3QgZGVmaW5lZAotICAgICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUKLSAgICAgICAgICogCSAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0b3JlZCBpbiB0aGlzIG1hcC4KLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBhc3BlY3Qgb2YgdGhpcyBrZXkgb3IgdmFsdWUKLSAgICAgICAgICoJICAgICAgICAgIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RvcmVkIGluIHRoaXMgbWFwLgotICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRoaXMgbWFwIGRvZXMgbm90IHBlcm1pdCA8dHQ+bnVsbDwvdHQ+Ci0gICAgICAgICAqICAgICAgICAgICAga2V5cyBvciB2YWx1ZXMsIGFuZCB0aGUgc3BlY2lmaWVkIGtleSBvciB2YWx1ZSBpcwotICAgICAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoQ29tcG9zaXRlTWFwIG1hcCwgTWFwW10gY29tcG9zaXRlZCwgTWFwIG1hcFRvQWRkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0RlZmF1bHRlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9EZWZhdWx0ZWRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNmNmYzZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0RlZmF1bHRlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5Db25zdGFudFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5GYWN0b3J5VHJhbnNmb3JtZXI7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+TWFwPC9jb2RlPiByZXR1cm5pbmcgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBtYXAKLSAqIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVlc3RlZCBrZXkuCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHtAbGluayAjZ2V0KE9iamVjdCl9IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIGtleSB0aGF0IGRvZXMgbm90Ci0gKiBleGlzdCBpbiB0aGUgbWFwLCB0aGlzIG1hcCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBzcGVjaWZpZWQgaW4KLSAqIHRoZSBjb25zdHJ1Y3Rvci9mYWN0b3J5LiBPbmx5IHRoZSBnZXQgbWV0aG9kIGlzIGFsdGVyZWQsIHNvIHRoZQotICoge0BsaW5rIE1hcCNjb250YWluc0tleShPYmplY3QpfSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBrZXkgcmVhbGx5Ci0gKiBpcyBpbiB0aGUgbWFwIG9yIG5vdC4KLSAqIDxwPgotICogVGhlIGRlZmF1bHRlZCB2YWx1ZSBpcyBub3QgYWRkZWQgdG8gdGhlIG1hcC4KLSAqIENvbXBhcmUgdGhpcyBiZWhhdmlvdXIgd2l0aCB7QGxpbmsgTGF6eU1hcH0sIHdoaWNoIGRvZXMgYWRkIHRoZSB2YWx1ZQotICogdG8gdGhlIG1hcCAodmlhIGEgVHJhbnNmb3JtZXIpLgotICogPHA+Ci0gKiBGb3IgaW5zdGFuY2U6Ci0gKiA8cHJlPgotICogTWFwIG1hcCA9IG5ldyBEZWZhdWx0ZWRNYXAoIk5VTEwiKTsKLSAqIE9iamVjdCBvYmogPSBtYXAuZ2V0KCJTdXJuYW1lIik7Ci0gKiAvLyBvYmogPT0gIk5VTEwiCi0gKiA8L3ByZT4KLSAqIEFmdGVyIHRoZSBhYm92ZSBjb2RlIGlzIGV4ZWN1dGVkIHRoZSBtYXAgaXMgc3RpbGwgZW1wdHkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IERlZmF1bHRlZE1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFJhZmFlbCBVLkMuIEFmb25zbwotICogQHNlZSBMYXp5TWFwCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0ZWRNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1hcERlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIE1hcCwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOTY5ODYyODc0NTgyN0w7Ci0KLSAgICAvKiogVGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBpZiB0aGUgbWFwIGRvZXMgbm90IGNvbnRhaW4gYSBrZXkgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHZhbHVlOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGRlZmF1bHRpbmcgbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgcmV0dXJuZWQgd2hlbiBhIG1pc3Npbmcga2V5IGlzIGZvdW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gd2hlbiB0aGUga2V5IGlzIG5vdCBmb3VuZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgVHJhbnNmb3JtZXIpIHsKLSAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENvbnN0YW50VHJhbnNmb3JtZXIuZ2V0SW5zdGFuY2UoZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRlZE1hcChtYXAsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgZGVmYXVsdGluZyBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZhY3Rvcnkgc3BlY2lmaWVkIGlzIGNhbGxlZCB3aGVuIGEgbWlzc2luZyBrZXkgaXMgZm91bmQuCi0gICAgICogVGhlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2YgdGhlIG1hcCBnZXQoa2V5KSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgb3IgZmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCwgRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdGVkTWFwKG1hcCwgRmFjdG9yeVRyYW5zZm9ybWVyLmdldEluc3RhbmNlKGZhY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBkZWZhdWx0aW5nIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgc3BlY2lmaWVkIGlzIGNhbGxlZCB3aGVuIGEgbWlzc2luZyBrZXkgaXMgZm91bmQuCi0gICAgICogVGhlIGtleSBpcyBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyIGFzIHRoZSBpbnB1dCwgYW5kIHRoZSByZXN1bHQKLSAgICAgKiB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2YgdGhlIG1hcCBnZXQoa2V5KSBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgb3IgZmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCwgVHJhbnNmb3JtZXIgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRyYW5zZm9ybWVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0ZWRNYXAobWFwLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSA8Y29kZT5EZWZhdWx0ZWRNYXA8L2NvZGU+IHRoYXQgZGVjb3JhdGVzCi0gICAgICogYSA8Y29kZT5IYXNoTWFwPC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgb2JqZWN0IHBhc3NlZCBpbiB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBtYXAgd2hlbmV2ZXIgYW4KLSAgICAgKiB1bmtub3duIGtleSBpcyByZXF1ZXN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIHdoZW4gdGhlIGtleSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdGVkTWFwKE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgc3VwZXIobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBUcmFuc2Zvcm1lcikgewotICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ29uc3RhbnRUcmFuc2Zvcm1lci5nZXRJbnN0YW5jZShkZWZhdWx0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHVzZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBvciB0cmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERlZmF1bHRlZE1hcChNYXAgbWFwLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgbWFwIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbiAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgbWFwID0gKE1hcCkgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB2YWx1ZSBmb3Iga2V5IGlmIGtleSBpcyBub3QgY3VycmVudGx5IGluIHRoZSBtYXAKLSAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShrZXkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUcmFuc2Zvcm1lcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFRyYW5zZm9ybWVyKSB2YWx1ZSkudHJhbnNmb3JtKGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvLyBubyBuZWVkIHRvIHdyYXAga2V5U2V0LCBlbnRyeVNldCBvciB2YWx1ZXMgYXMgdGhleSBhcmUgdmlld3Mgb2YKLSAgICAvLyBleGlzdGluZyBtYXAgZW50cmllcyAtIHlvdSBjYW4ndCBkbyBhIG1hcC1zdHlsZSBnZXQgb24gdGhlbS4KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZpeGVkU2l6ZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjNjMTc0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Cb3VuZGVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLlVubW9kaWZpYWJsZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldC5Vbm1vZGlmaWFibGVTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+TWFwPC9jb2RlPiB0byBmaXggdGhlIHNpemUsIHByZXZlbnRpbmcgYWRkL3JlbW92ZS4KLSAqIDxwPgotICogQW55IGFjdGlvbiB0aGF0IHdvdWxkIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbWFwIGlzIGRpc2FsbG93ZWQuCi0gKiBUaGUgcHV0IG1ldGhvZCBpcyBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nCi0gKiBrZXkgaG93ZXZlci4KLSAqIDxwPgotICogSWYgdHJ5aW5nIHRvIHJlbW92ZSBvciBjbGVhciB0aGUgbWFwLCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpcwotICogdGhyb3duLiBJZiB0cnlpbmcgdG8gcHV0IGEgbmV3IG1hcHBpbmcgaW50byB0aGUgbWFwLCBhbiAKLSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoaXMgaXMgYmVjYXVzZSB0aGUgcHV0IG1ldGhvZCBjYW4gCi0gKiBzdWNjZWVkIGlmIHRoZSBtYXBwaW5nJ3Mga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAsIHNvIHRoZSBwdXQgbWV0aG9kCi0gKiBpcyBub3QgYWx3YXlzIHVuc3VwcG9ydGVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBGaXhlZFNpemVNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gd3JhcCB0aGlzIG1hcAotICogdXNpbmcge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRNYXAoTWFwKX0uIFRoaXMgY2xhc3MgbWF5IHRocm93IAotICogZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIEZpeGVkU2l6ZU1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0TWFwRGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgTWFwLCBCb3VuZGVkTWFwLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0NTA5MjcyMDgxMTYxNzkzMTZMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgZml4ZWQgc2l6ZSBtYXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZU1hcChtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRml4ZWRTaXplTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBuZXcga2V5L3ZhbHVlIHBhaXIgLSBNYXAgaXMgZml4ZWQgc2l6ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwVG9Db3B5KSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXBUb0NvcHkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIGlmIChtYXBUb0NvcHkuY29udGFpbnNLZXkoaXQubmV4dCgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBwdXQgbmV3IGtleS92YWx1ZSBwYWlyIC0gTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtYXAucHV0QWxsKG1hcFRvQ29weSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gbWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIC8vIHVubW9kaWZpYWJsZSBzZXQgd2lsbCBzdGlsbCBhbGxvdyBtb2RpZmljYXRpb24gdmlhIE1hcC5FbnRyeSBvYmplY3RzCi0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IG1hcC5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gbWFwLnZhbHVlcygpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlQ29sbGVjdGlvbi5kZWNvcmF0ZShjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbWF4U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKTsKLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplU29ydGVkTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZpeGVkU2l6ZVNvcnRlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTFkYjU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvRml4ZWRTaXplU29ydGVkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJvdW5kZWRNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRNYXA8L2NvZGU+IHRvIGZpeCB0aGUgc2l6ZSBibG9ja2luZyBhZGQvcmVtb3ZlLgotICogPHA+Ci0gKiBBbnkgYWN0aW9uIHRoYXQgd291bGQgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBtYXAgaXMgZGlzYWxsb3dlZC4KLSAqIFRoZSBwdXQgbWV0aG9kIGlzIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcKLSAqIGtleSBob3dldmVyLgotICogPHA+Ci0gKiBJZiB0cnlpbmcgdG8gcmVtb3ZlIG9yIGNsZWFyIHRoZSBtYXAsIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlzCi0gKiB0aHJvd24uIElmIHRyeWluZyB0byBwdXQgYSBuZXcgbWFwcGluZyBpbnRvIHRoZSBtYXAsIGFuIAotICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBwdXQgbWV0aG9kIGNhbiAKLSAqIHN1Y2NlZWQgaWYgdGhlIG1hcHBpbmcncyBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hcCwgc28gdGhlIHB1dCBtZXRob2QKLSAqIGlzIG5vdCBhbHdheXMgdW5zdXBwb3J0ZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IEZpeGVkU2l6ZVNvcnRlZE1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZFNvcnRlZE1hcH0uIFRoaXMgY2xhc3MgbWF5IHRocm93IAotICogZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIEZpeGVkU2l6ZVNvcnRlZE1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0U29ydGVkTWFwRGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgU29ydGVkTWFwLCBCb3VuZGVkTWFwLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMxMjYwMTk2MjQ1MTE2ODM2NTNMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgZml4ZWQgc2l6ZSBzb3J0ZWQgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGRlY29yYXRlKFNvcnRlZE1hcCBtYXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpeGVkU2l6ZVNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgbWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNvcnRlZE1hcCBnZXRTb3J0ZWRNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoU29ydGVkTWFwKSBtYXA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBuZXcga2V5L3ZhbHVlIHBhaXIgLSBNYXAgaXMgZml4ZWQgc2l6ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwVG9Db3B5KSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXBUb0NvcHkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIGlmIChtYXBUb0NvcHkuY29udGFpbnNLZXkoaXQubmV4dCgpKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBwdXQgbmV3IGtleS92YWx1ZSBwYWlyIC0gTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtYXAucHV0QWxsKG1hcFRvQ29weSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWFwIGlzIGZpeGVkIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gbWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IG1hcC5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gbWFwLnZhbHVlcygpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlQ29sbGVjdGlvbi5kZWNvcmF0ZShjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFNvcnRlZE1hcCBzdWJNYXAoT2JqZWN0IGZyb21LZXksIE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkuc3ViTWFwKGZyb21LZXksIHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIGhlYWRNYXAoT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS5oZWFkTWFwKHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHRhaWxNYXAoT2JqZWN0IGZyb21LZXkpIHsKLSAgICAgICAgU29ydGVkTWFwIG1hcCA9IGdldFNvcnRlZE1hcCgpLnRhaWxNYXAoZnJvbUtleSk7Ci0gICAgICAgIHJldHVybiBuZXcgRml4ZWRTaXplU29ydGVkTWFwKG1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBzaXplKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0ZsYXQzTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZjkwN2IuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9GbGF0M01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkl0ZXJhYmxlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUmVzZXR0YWJsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5TWFwSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5NYXA8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgc3RvcmVzIGRhdGEgaW4gc2ltcGxlIGZpZWxkcyB1bnRpbAotICogdGhlIHNpemUgaXMgZ3JlYXRlciB0aGFuIDMuCi0gKiA8cD4KLSAqIFRoaXMgbWFwIGlzIGRlc2lnbmVkIGZvciBwZXJmb3JtYW5jZSBhbmQgY2FuIG91dHN0cmlwIEhhc2hNYXAuCi0gKiBJdCBhbHNvIGhhcyBnb29kIGdhcmJhZ2UgY29sbGVjdGlvbiBjaGFyYWN0ZXJpc3RpY3MuCi0gKiA8dWw+Ci0gKiA8bGk+T3B0aW1pc2VkIGZvciBvcGVyYXRpb24gYXQgc2l6ZSAzIG9yIGxlc3MuCi0gKiA8bGk+U3RpbGwgd29ya3Mgd2VsbCBvbmNlIHNpemUgMyBleGNlZWRlZC4KLSAqIDxsaT5HZXRzIGF0IHNpemUgMyBvciBsZXNzIGFyZSBhYm91dCAwLTEwJSBmYXN0ZXIgdGhhbiBIYXNoTWFwLAotICogPGxpPlB1dHMgYXQgc2l6ZSAzIG9yIGxlc3MgYXJlIG92ZXIgNCB0aW1lcyBmYXN0ZXIgdGhhbiBIYXNoTWFwLgotICogPGxpPlBlcmZvcm1hbmNlIDUlIHNsb3dlciB0aGFuIEhhc2hNYXAgb25jZSBzaXplIDMgZXhjZWVkZWQgb25jZS4KLSAqIDwvdWw+Ci0gKiBUaGUgZGVzaWduIHVzZXMgdHdvIGRpc3RpbmN0IG1vZGVzIG9mIG9wZXJhdGlvbiAtIGZsYXQgYW5kIGRlbGVnYXRlLgotICogV2hpbGUgdGhlIG1hcCBpcyBzaXplIDMgb3IgbGVzcywgb3BlcmF0aW9ucyBtYXAgc3RyYWlnaHQgb250byBmaWVsZHMgdXNpbmcKLSAqIHN3aXRjaCBzdGF0ZW1lbnRzLiBPbmNlIHNpemUgNCBpcyByZWFjaGVkLCB0aGUgbWFwIHN3aXRjaGVzIHRvIGRlbGVnYXRlIG1vZGUKLSAqIGFuZCBvbmx5IHN3aXRjaGVzIGJhY2sgd2hlbiBjbGVhcmVkLiBJbiBkZWxlZ2F0ZSBtb2RlLCBhbGwgb3BlcmF0aW9ucyBhcmUKLSAqIGZvcndhcmRlZCBzdHJhaWdodCB0byBhIEhhc2hNYXAgcmVzdWx0aW5nIGluIHRoZSA1JSBwZXJmb3JtYW5jZSBsb3NzLgotICogPHA+Ci0gKiBUaGUgcGVyZm9ybWFuY2UgZ2FpbnMgb24gcHV0cyBhcmUgZHVlIHRvIG5vdCBuZWVkaW5nIHRvIGNyZWF0ZSBhIE1hcCBFbnRyeQotICogb2JqZWN0LiBUaGlzIGlzIGEgbGFyZ2Ugc2F2aW5nIG5vdCBvbmx5IGluIHBlcmZvcm1hbmNlIGJ1dCBpbiBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFdoaWxzdCBpbiBmbGF0IG1vZGUgdGhpcyBtYXAgaXMgYWxzbyBlYXN5IGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gZGlzcGF0Y2guCi0gKiBUaGlzIGlzIGJlY2F1c2UgaXQgY29udGFpbnMgbm8gY29tcGxleCBvYmplY3RzIG9yIGFycmF5cyB3aGljaCBzbG93IHRoZSBwcm9ncmVzcy4KLSAqIDxwPgotICogRG8gbm90IHVzZSA8Y29kZT5GbGF0M01hcDwvY29kZT4gaWYgdGhlIHNpemUgaXMgbGlrZWx5IHRvIGdyb3cgYmV5b25kIDMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IEZsYXQzTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgRmxhdDNNYXAgaW1wbGVtZW50cyBJdGVyYWJsZU1hcCwgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NzAxMDg3NDE5NzQxOTI4Mjk2TDsKLQotICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGUgbWFwLCB1c2VkIHdoaWxlIGluIGZsYXQgbW9kZSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBzaXplOwotICAgIC8qKiBIYXNoLCB1c2VkIHdoaWxlIGluIGZsYXQgbW9kZSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoMTsKLSAgICAvKiogSGFzaCwgdXNlZCB3aGlsZSBpbiBmbGF0IG1vZGUgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaDI7Ci0gICAgLyoqIEhhc2gsIHVzZWQgd2hpbGUgaW4gZmxhdCBtb2RlICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2gzOwotICAgIC8qKiBLZXksIHVzZWQgd2hpbGUgaW4gZmxhdCBtb2RlICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IGtleTE7Ci0gICAgLyoqIEtleSwgdXNlZCB3aGlsZSBpbiBmbGF0IG1vZGUgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3Qga2V5MjsKLSAgICAvKiogS2V5LCB1c2VkIHdoaWxlIGluIGZsYXQgbW9kZSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBrZXkzOwotICAgIC8qKiBWYWx1ZSwgdXNlZCB3aGlsZSBpbiBmbGF0IG1vZGUgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgdmFsdWUxOwotICAgIC8qKiBWYWx1ZSwgdXNlZCB3aGlsZSBpbiBmbGF0IG1vZGUgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgdmFsdWUyOwotICAgIC8qKiBWYWx1ZSwgdXNlZCB3aGlsZSBpbiBmbGF0IG1vZGUgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgdmFsdWUzOwotICAgIC8qKiBNYXAsIHVzZWQgd2hpbGUgaW4gZGVsZWdhdGUgbW9kZSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IEFic3RyYWN0SGFzaGVkTWFwIGRlbGVnYXRlTWFwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEZsYXQzTWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNvcHlpbmcgZWxlbWVudHMgZnJvbSBhbm90aGVyIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gY29weQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEZsYXQzTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUga2V5IHNwZWNpZmllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLCBudWxsIGlmIG5vIG1hdGNoCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLmdldChrZXkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAgICAgLy8gZHJvcCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MyA9PSBudWxsKSByZXR1cm4gdmFsdWUzOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0gbnVsbCkgcmV0dXJuIHZhbHVlMjsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkxID09IG51bGwpIHJldHVybiB2YWx1ZTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSBrZXkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNoMyA9PSBoYXNoQ29kZSAmJiBrZXkuZXF1YWxzKGtleTMpKSByZXR1cm4gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDIgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkyKSkgcmV0dXJuIHZhbHVlMjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2gxID09IGhhc2hDb2RlICYmIGtleS5lcXVhbHMoa2V5MSkpIHJldHVybiB2YWx1ZTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFwIGlzIGN1cnJlbnRseSBlbXB0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBpcyBjdXJyZW50bHkgc2l6ZSB6ZXJvCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChzaXplKCkgPT0gMCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1hcC5jb250YWluc0tleShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkzID09IG51bGwpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIGludCBoYXNoQ29kZSA9IGtleS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeyAgLy8gZHJvcCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNoMyA9PSBoYXNoQ29kZSAmJiBrZXkuZXF1YWxzKGtleTMpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2gyID09IGhhc2hDb2RlICYmIGtleS5lcXVhbHMoa2V5MikpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDEgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkxKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWUzKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHZhbHVlMikpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyh2YWx1ZTEpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFB1dHMgYSBrZXktdmFsdWUgbWFwcGluZyBpbnRvIHRoaXMgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcHJldmlvdXNseSBtYXBwZWQgdG8gdGhpcyBrZXksIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgbWFwcGluZwotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeyAgLy8gZHJvcCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUxOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSBrZXkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsgIC8vIGRyb3AgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDMgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2gyID09IGhhc2hDb2RlICYmIGtleS5lcXVhbHMoa2V5MikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNoMSA9PSBoYXNoQ29kZSAmJiBrZXkuZXF1YWxzKGtleTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZCA9IHZhbHVlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gYWRkIG5ldyBtYXBwaW5nCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjb252ZXJ0VG9NYXAoKTsKLSAgICAgICAgICAgICAgICBkZWxlZ2F0ZU1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgaGFzaDMgPSAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgICAgIGtleTMgPSBrZXk7Ci0gICAgICAgICAgICAgICAgdmFsdWUzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaGFzaDIgPSAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgICAgIGtleTIgPSBrZXk7Ci0gICAgICAgICAgICAgICAgdmFsdWUyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaGFzaDEgPSAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgICAgIGtleTEgPSBrZXk7Ci0gICAgICAgICAgICAgICAgdmFsdWUxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIGFsbCB0aGUgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAgaW50byB0aGlzIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGFkZAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXApIHsKLSAgICAgICAgaW50IHNpemUgPSBtYXAuc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlbGVnYXRlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlTWFwLnB1dEFsbChtYXApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRUb01hcCgpOwotICAgICAgICAgICAgZGVsZWdhdGVNYXAucHV0QWxsKG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZmxhdCBtYXAgZGF0YSB0byBhIG1hcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29udmVydFRvTWFwKCkgewotICAgICAgICBkZWxlZ2F0ZU1hcCA9IGNyZWF0ZURlbGVnYXRlTWFwKCk7Ci0gICAgICAgIHN3aXRjaCAoc2l6ZSkgeyAgLy8gZHJvcCB0aHJvdWdoCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgZGVsZWdhdGVNYXAucHV0KGtleTMsIHZhbHVlMyk7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgZGVsZWdhdGVNYXAucHV0KGtleTIsIHZhbHVlMik7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgZGVsZWdhdGVNYXAucHV0KGtleTEsIHZhbHVlMSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNpemUgPSAwOwotICAgICAgICBoYXNoMSA9IGhhc2gyID0gaGFzaDMgPSAwOwotICAgICAgICBrZXkxID0ga2V5MiA9IGtleTMgPSBudWxsOwotICAgICAgICB2YWx1ZTEgPSB2YWx1ZTIgPSB2YWx1ZTMgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbWFwIHVzZWQgZm9yIHN0b3JhZ2Ugd2hlbiBpbiBkZWxlZ2F0aW9uIG1vZGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQgbWFwIGltcGxlbWVudGF0aW9uLgotICAgICAqIE5vdCBldmVyeSBBYnN0cmFjdEhhc2hlZE1hcCBpcyBzdWl0YWJsZSwgaWRlbnRpdHkgYW5kIHJlZmVyZW5jZSBiYXNlZCBtYXBzCi0gICAgICogd291bGQgYmUgcG9vciBjaG9pY2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBBYnN0cmFjdEhhc2hlZE1hcCBvciBzdWJjbGFzcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdEhhc2hlZE1hcCBjcmVhdGVEZWxlZ2F0ZU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoZWRNYXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbWFwcGluZyBmcm9tIHRoaXMgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBtYXBwaW5nIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUgcmVtb3ZlZCBrZXksIG51bGwgaWYga2V5IG5vdCBpbiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVNYXAucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsgIC8vIGRyb3AgdGhyb3VnaAotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleTMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZCA9IHZhbHVlMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleTMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDIgPSBoYXNoMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleTIgPSBrZXkzOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUyID0gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5MyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNoMSA9IGhhc2gzOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5MSA9IGtleTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNoMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXkzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5MiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNoMSA9IGhhc2gyOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5MSA9IGtleTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNoMiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXkyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUxOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5MSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSBrZXkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsgIC8vIGRyb3AgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDMgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNoMiA9PSBoYXNoQ29kZSAmJiBrZXkuZXF1YWxzKGtleTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZCA9IHZhbHVlMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoMiA9IGhhc2gzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTIgPSBrZXkzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2gxID09IGhhc2hDb2RlICYmIGtleS5lcXVhbHMoa2V5MSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gxID0gaGFzaDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MSA9IGtleTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUxID0gdmFsdWUzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2gyID09IGhhc2hDb2RlICYmIGtleS5lcXVhbHMoa2V5MikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkID0gdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDEgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDEgPSBoYXNoMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkxID0ga2V5MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaDEgPT0gaGFzaENvZGUgJiYga2V5LmVxdWFscyhrZXkxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSB2YWx1ZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBtYXAsIHJlc2V0dGluZyB0aGUgc2l6ZSB0byB6ZXJvIGFuZCBudWxsaWZ5aW5nIHJlZmVyZW5jZXMKLSAgICAgKiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gaXNzdWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVsZWdhdGVNYXAuY2xlYXIoKTsgIC8vIHNob3VsZCBhaWQgZ2MKLSAgICAgICAgICAgIGRlbGVnYXRlTWFwID0gbnVsbDsgIC8vIHN3aXRjaCBiYWNrIHRvIGZsYXQgbW9kZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBoYXNoMSA9IGhhc2gyID0gaGFzaDMgPSAwOwotICAgICAgICAgICAga2V5MSA9IGtleTIgPSBrZXkzID0gbnVsbDsKLSAgICAgICAgICAgIHZhbHVlMSA9IHZhbHVlMiA9IHZhbHVlMyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvdmVyIHRoZSBtYXAuCi0gICAgICogQ2hhbmdlcyBtYWRlIHRvIHRoZSBpdGVyYXRvciBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogPHA+Ci0gICAgICogQSBNYXBJdGVyYXRvciByZXR1cm5zIHRoZSBrZXlzIGluIHRoZSBtYXAuIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVudAotICAgICAqIG1ldGhvZHMgdG8gZ2V0IHRoZSBrZXkgYW5kIHZhbHVlLCBhbmQgc2V0IHRoZSB2YWx1ZS4KLSAgICAgKiBJdCBhdm9pZHMgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIGVudHJ5U2V0L2tleVNldC92YWx1ZXMgb2JqZWN0LgotICAgICAqIEl0IGFsc28gYXZvaWRzIGNyZWF0aW5nIHRoZSBNYXAgRW50cnkgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1hcC5tYXBJdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFbXB0eU1hcEl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmxhdE1hcEl0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsYXRNYXBJdGVyYXRvcgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBGbGF0TWFwSXRlcmF0b3IgaW1wbGVtZW50cyBNYXBJdGVyYXRvciwgUmVzZXR0YWJsZUl0ZXJhdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGbGF0M01hcCBwYXJlbnQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG5leHRJbmRleCA9IDA7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIEZsYXRNYXBJdGVyYXRvcihGbGF0M01hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG5leHRJbmRleCA8IHBhcmVudC5zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIGlmIChoYXNOZXh0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5OT19ORVhUX0VOVFJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhblJlbW92ZSA9IHRydWU7Ci0gICAgICAgICAgICBuZXh0SW5kZXgrKzsKLSAgICAgICAgICAgIHJldHVybiBnZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlJFTU9WRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudC5yZW1vdmUoZ2V0S2V5KCkpOwotICAgICAgICAgICAgbmV4dEluZGV4LS07Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICAgICAgaWYgKGNhblJlbW92ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuR0VUS0VZX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChuZXh0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQua2V5MzsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQua2V5MjsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQua2V5MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgbWFwIGluZGV4Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgaWYgKGNhblJlbW92ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuR0VUVkFMVUVfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG5leHRJbmRleCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC52YWx1ZTM7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LnZhbHVlMjsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudmFsdWUxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBtYXAgaW5kZXgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoY2FuUmVtb3ZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5TRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBvbGQgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgc3dpdGNoIChuZXh0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQudmFsdWUzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBwYXJlbnQudmFsdWUyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBwYXJlbnQudmFsdWUxID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2xkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG5leHRJbmRleCA9IDA7Ci0gICAgICAgICAgICBjYW5SZW1vdmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkl0ZXJhdG9yWyIgKyBnZXRLZXkoKSArICI9IiArIGdldFZhbHVlKCkgKyAiXSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiSXRlcmF0b3JbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW50cnlTZXQgdmlldyBvZiB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgdmlldyBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogVGhlIE1hcCBFbnRyeSBpcyBub3QgYW4gaW5kZXBlbmRlbnQgb2JqZWN0IGFuZCBjaGFuZ2VzIGFzIHRoZSAKLSAgICAgKiBpdGVyYXRvciBwcm9ncmVzc2VzLgotICAgICAqIFRvIHNpbXBseSBpdGVyYXRlIHRocm91Z2ggdGhlIGVudHJpZXMsIHVzZSB7QGxpbmsgI21hcEl0ZXJhdG9yKCl9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVudHJ5U2V0IHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldCh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW50cnlTZXQKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRmxhdDNNYXAgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgRW50cnlTZXQoRmxhdDNNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBwYXJlbnQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBvYmo7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHBhcmVudC5jb250YWluc0tleShrZXkpOwotICAgICAgICAgICAgcGFyZW50LnJlbW92ZShrZXkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQuZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZGVsZWdhdGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldEl0ZXJhdG9yKHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeVNldEl0ZXJhdG9yIGFuZCBNYXBFbnRyeQotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBFbnRyeVNldEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IsIE1hcC5FbnRyeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRmxhdDNNYXAgcGFyZW50OwotICAgICAgICBwcml2YXRlIGludCBuZXh0SW5kZXggPSAwOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBFbnRyeVNldEl0ZXJhdG9yKEZsYXQzTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV4dEluZGV4IDwgcGFyZW50LnNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgaWYgKGhhc05leHQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLk5PX05FWFRfRU5UUlkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FuUmVtb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgIG5leHRJbmRleCsrOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAoY2FuUmVtb3ZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5SRU1PVkVfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGdldEtleSgpKTsKLSAgICAgICAgICAgIG5leHRJbmRleC0tOwotICAgICAgICAgICAgY2FuUmVtb3ZlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLkdFVEtFWV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAobmV4dEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmtleTM7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmtleTI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmtleTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIG1hcCBpbmRleCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLkdFVFZBTFVFX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChuZXh0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudmFsdWUzOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC52YWx1ZTI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LnZhbHVlMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgbWFwIGluZGV4Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGNhblJlbW92ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuU0VUVkFMVUVfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3Qgb2xkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHN3aXRjaCAobmV4dEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LnZhbHVlMyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LnZhbHVlMiA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LnZhbHVlMSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWFwLkVudHJ5IG90aGVyID0gKE1hcC5FbnRyeSkgb2JqOwotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGdldEtleSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ID09IG51bGwgPyBvdGhlci5nZXRLZXkoKSA9PSBudWxsIDoga2V5LmVxdWFscyhvdGhlci5nZXRLZXkoKSkpICYmCi0gICAgICAgICAgICAgICAgICAgKHZhbHVlID09IG51bGwgPyBvdGhlci5nZXRWYWx1ZSgpID09IG51bGwgOiB2YWx1ZS5lcXVhbHMob3RoZXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgaWYgKGNhblJlbW92ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGdldEtleSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgICAgICAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIGlmIChjYW5SZW1vdmUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUga2V5U2V0IHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgdG8gdGhlIHZpZXcgYWZmZWN0IHRoaXMgbWFwLgotICAgICAqIFRvIHNpbXBseSBpdGVyYXRlIHRocm91Z2ggdGhlIGtleXMsIHVzZSB7QGxpbmsgI21hcEl0ZXJhdG9yKCl9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleVNldCB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVNYXAua2V5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXQodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogS2V5U2V0Ci0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIEtleVNldCBleHRlbmRzIEFic3RyYWN0U2V0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGbGF0M01hcCBwYXJlbnQ7Ci0gICAgICAgIAotICAgICAgICBLZXlTZXQoRmxhdDNNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBwYXJlbnQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jb250YWluc0tleShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gcGFyZW50LmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgaWYgKHBhcmVudC5kZWxlZ2F0ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5kZWxlZ2F0ZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXRJdGVyYXRvcihwYXJlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogS2V5U2V0SXRlcmF0b3IKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgS2V5U2V0SXRlcmF0b3IgZXh0ZW5kcyBFbnRyeVNldEl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIEtleVNldEl0ZXJhdG9yKEZsYXQzTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHN1cGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRLZXkoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgdmlldyBvZiB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgdmlldyBhZmZlY3QgdGhpcyBtYXAuCi0gICAgICogVG8gc2ltcGx5IGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLCB1c2Uge0BsaW5rICNtYXBJdGVyYXRvcigpfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgdmlldwotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1hcC52YWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWx1ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGbGF0M01hcCBwYXJlbnQ7Ci0gICAgICAgIAotICAgICAgICBWYWx1ZXMoRmxhdDNNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBwYXJlbnQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgaWYgKHBhcmVudC5kZWxlZ2F0ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5kZWxlZ2F0ZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXNJdGVyYXRvcihwYXJlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsdWVzSXRlcmF0b3IKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgVmFsdWVzSXRlcmF0b3IgZXh0ZW5kcyBFbnRyeVNldEl0ZXJhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIFZhbHVlc0l0ZXJhdG9yKEZsYXQzTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHN1cGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlSW50KHNpemUoKSk7Ci0gICAgICAgIGZvciAoTWFwSXRlcmF0b3IgaXQgPSBtYXBJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoaXQubmV4dCgpKTsgIC8vIGtleQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGl0LmdldFZhbHVlKCkpOyAgLy8gdmFsdWUKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIGlmIChjb3VudCA+IDMpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlTWFwID0gY3JlYXRlRGVsZWdhdGVNYXAoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gY291bnQ7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgICAgIHB1dChpbi5yZWFkT2JqZWN0KCksIGluLnJlYWRPYmplY3QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2xvbmVzIHRoZSBtYXAgd2l0aG91dCBjbG9uaW5nIHRoZSBrZXlzIG9yIHZhbHVlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNsb25lCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZsYXQzTWFwIGNsb25lZCA9IChGbGF0M01hcCkgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgICAgIGlmIChjbG9uZWQuZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsb25lZC5kZWxlZ2F0ZU1hcCA9IChIYXNoZWRNYXApIGNsb25lZC5kZWxlZ2F0ZU1hcC5jbG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsb25lZDsKLSAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIG1hcCB3aXRoIGFub3RoZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLmVxdWFscyhvYmopOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNYXAgb3RoZXIgPSAoTWFwKSBvYmo7Ci0gICAgICAgIGlmIChzaXplICE9IG90aGVyLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgT2JqZWN0IG90aGVyVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci5jb250YWluc0tleShrZXkzKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyVmFsdWUgPSBvdGhlci5nZXQoa2V5Myk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTMgPT0gbnVsbCA/IG90aGVyVmFsdWUgIT0gbnVsbCA6ICF2YWx1ZTMuZXF1YWxzKG90aGVyVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci5jb250YWluc0tleShrZXkyKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyVmFsdWUgPSBvdGhlci5nZXQoa2V5Mik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCA/IG90aGVyVmFsdWUgIT0gbnVsbCA6ICF2YWx1ZTIuZXF1YWxzKG90aGVyVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci5jb250YWluc0tleShrZXkxKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyVmFsdWUgPSBvdGhlci5nZXQoa2V5MSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCA/IG90aGVyVmFsdWUgIT0gbnVsbCA6ICF2YWx1ZTEuZXF1YWxzKG90aGVyVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzdGFuZGFyZCBNYXAgaGFzaENvZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIGRlZmluZWQgaW4gdGhlIE1hcCBpbnRlcmZhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAoZGVsZWdhdGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWFwLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgc3dpdGNoIChzaXplKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICB0b3RhbCArPSAoaGFzaDMgXiAodmFsdWUzID09IG51bGwgPyAwIDogdmFsdWUzLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICB0b3RhbCArPSAoaGFzaDIgXiAodmFsdWUyID09IG51bGwgPyAwIDogdmFsdWUyLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB0b3RhbCArPSAoaGFzaDEgXiAodmFsdWUxID09IG51bGwgPyAwIDogdmFsdWUxLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwIGFzIGEgU3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1hcC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAie30iOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ3snKTsKLSAgICAgICAgc3dpdGNoIChzaXplKSB7ICAvLyBkcm9wIHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKChrZXkzID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiBrZXkzKSk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKHZhbHVlMyA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDogdmFsdWUzKSk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGtleTIgPT0gdGhpcyA/ICIodGhpcyBNYXApIiA6IGtleTIpKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgodmFsdWUyID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiB2YWx1ZTIpKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoa2V5MSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDoga2V5MSkpOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCh2YWx1ZTEgPT0gdGhpcyA/ICIodGhpcyBNYXApIiA6IHZhbHVlMSkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9IYXNoZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvSGFzaGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkMTQ0NDUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9IYXNoZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgPGNvZGU+TWFwPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGFsdGVybmF0aXZlCi0gKiB0byA8Y29kZT5IYXNoTWFwPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpbXByb3ZlcyBvbiB0aGUgSkRLMS40IEhhc2hNYXAgYnkgYWRkaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3IgTWFwSXRlcmF0b3J9Ci0gKiBmdW5jdGlvbmFsaXR5IGFuZCBtYW55IG1ldGhvZHMgZm9yIHN1YmNsYXNzaW5nLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBIYXNoZWRNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gd3JhcCB0aGlzIG1hcAotICogdXNpbmcge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRNYXAoTWFwKX0uIFRoaXMgY2xhc3MgbWF5IHRocm93IAotICogZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBIYXNoZWRNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEhhc2hlZE1hcCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpc2F0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTc4ODE5OTIzMTAzODcyMTA0MEw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBtYXAgd2l0aCBkZWZhdWx0IHNpemUgYW5kIGxvYWQgZmFjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBIYXNoZWRNYXAoKSB7Ci0gICAgICAgIHN1cGVyKERFRkFVTFRfQ0FQQUNJVFksIERFRkFVTFRfTE9BRF9GQUNUT1IsIERFRkFVTFRfVEhSRVNIT0xEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkuIAotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICovCi0gICAgcHVibGljIEhhc2hlZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAotICAgICAqIGxvYWQgZmFjdG9yLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbGVzcyB0aGFuIHplcm8KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaGVkTWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBjb3B5aW5nIGVsZW1lbnRzIGZyb20gYW5vdGhlciBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNvcHkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBIYXNoZWRNYXAoTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbG9uZXMgdGhlIG1hcCB3aXRob3V0IGNsb25pbmcgdGhlIGtleXMgb3IgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBkb1dyaXRlT2JqZWN0KG91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGRvUmVhZE9iamVjdChpbik7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9JZGVudGl0eU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9JZGVudGl0eU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjYwNGMxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvSWRlbnRpdHlNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgPGNvZGU+TWFwPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1hdGNoZXMga2V5cyBhbmQgdmFsdWVzIGJhc2VkCi0gKiBvbiA8Y29kZT49PTwvY29kZT4gbm90IDxjb2RlPmVxdWFscygpPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBtYXAgd2lsbCB2aW9sYXRlIHRoZSBkZXRhaWwgb2YgdmFyaW91cyBNYXAgYW5kIG1hcCB2aWV3IGNvbnRyYWN0cy4KLSAqIEFzIGEgZ2VuZXJhbCBydWxlLCBkb24ndCBjb21wYXJlIHRoaXMgbWFwIHRvIG90aGVyIG1hcHMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IElkZW50aXR5TWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqCi0gKiBAYXV0aG9yIGphdmEgdXRpbCBIYXNoTWFwCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEhhc2hlZE1hcCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpc2F0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDI4NDkzNDk1MjI0MzAyMzI5TDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgbWFwIHdpdGggZGVmYXVsdCBzaXplIGFuZCBsb2FkIGZhY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSWRlbnRpdHlNYXAoKSB7Ci0gICAgICAgIHN1cGVyKERFRkFVTFRfQ0FQQUNJVFksIERFRkFVTFRfTE9BRF9GQUNUT1IsIERFRkFVTFRfVEhSRVNIT0xEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkuIAotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICovCi0gICAgcHVibGljIElkZW50aXR5TWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCi0gICAgICogbG9hZCBmYWN0b3IuIAotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkKLSAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBsZXNzIHRoYW4gemVybwotICAgICAqLwotICAgIHB1YmxpYyBJZGVudGl0eU1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3Rvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY29weWluZyBlbGVtZW50cyBmcm9tIGFub3RoZXIgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgSWRlbnRpdHlNYXAoTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkgc3BlY2lmaWVkLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgaWRlbnRpdHkgaGFzaCBjb2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZ2V0IGEgaGFzaCBjb2RlIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShrZXkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28ga2V5cyBmb3IgZXF1YWxzLgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyA8Y29kZT49PTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkgdG8gY29tcGFyZQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleSB0byBjb21wYXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIGJ5IGlkZW50aXR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbEtleShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLSAgICAgICAgcmV0dXJuIChrZXkxID09IGtleTIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gdmFsdWVzIGZvciBlcXVhbHMuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIDxjb2RlPj09PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUxICB0aGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZQotICAgICAqIEBwYXJhbSB2YWx1ZTIgIHRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCBieSBpZGVudGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxWYWx1ZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0gICAgICAgIHJldHVybiAodmFsdWUxID09IHZhbHVlMik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZW50cnkgdG8gc3RvcmUgdGhlIGRhdGEuCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGFuIElkZW50aXR5RW50cnkgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5leHQgIHRoZSBuZXh0IGVudHJ5IGluIHNlcXVlbmNlCi0gICAgICogQHBhcmFtIGhhc2hDb2RlICB0aGUgaGFzaCBjb2RlIHRvIHVzZQotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc3RvcmUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZW50cnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaEVudHJ5IGNyZWF0ZUVudHJ5KEhhc2hFbnRyeSBuZXh0LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5RW50cnkobmV4dCwgaGFzaENvZGUsIGtleSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSGFzaEVudHJ5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJZGVudGl0eUVudHJ5IGV4dGVuZHMgSGFzaEVudHJ5IHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBJZGVudGl0eUVudHJ5KEhhc2hFbnRyeSBuZXh0LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgc3VwZXIobmV4dCwgaGFzaENvZGUsIGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWFwLkVudHJ5IG90aGVyID0gKE1hcC5FbnRyeSkgb2JqOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgKGdldEtleSgpID09IG90aGVyLmdldEtleSgpKSAmJgotICAgICAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG90aGVyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGdldEtleSgpKSBeCi0gICAgICAgICAgICAgICAgICAgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENsb25lcyB0aGUgbWFwIHdpdGhvdXQgY2xvbmluZyB0aGUga2V5cyBvciB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjbG9uZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgbWFwIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIGRvV3JpdGVPYmplY3Qob3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgZG9SZWFkT2JqZWN0KGluKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xSVU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MUlVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk3OTIzNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xSVU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQm91bmRlZE1hcDsKLQotLyoqCi0gKiBBIDxjb2RlPk1hcDwvY29kZT4gaW1wbGVtZW50YXRpb24gd2l0aCBhIGZpeGVkIG1heGltdW0gc2l6ZSB3aGljaCByZW1vdmVzCi0gKiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSBpZiBhbiBlbnRyeSBpcyBhZGRlZCB3aGVuIGZ1bGwuCi0gKiA8cD4KLSAqIFRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGFsZ29yaXRobSB3b3JrcyBvbiB0aGUgZ2V0IGFuZCBwdXQgb3BlcmF0aW9ucyBvbmx5LgotICogSXRlcmF0aW9uIG9mIGFueSBraW5kLCBpbmNsdWRpbmcgc2V0dGluZyB0aGUgdmFsdWUgYnkgaXRlcmF0aW9uLCBkb2VzIG5vdAotICogY2hhbmdlIHRoZSBvcmRlci4gUXVlcmllcyBzdWNoIGFzIGNvbnRhaW5zS2V5IGFuZCBjb250YWluc1ZhbHVlIG9yIGFjY2VzcwotICogdmlhIHZpZXdzIGFsc28gZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIuCi0gKiA8cD4KLSAqIFRoZSBtYXAgaW1wbGVtZW50cyA8Y29kZT5PcmRlcmVkTWFwPC9jb2RlPiBhbmQgZW50cmllcyBtYXkgYmUgcXVlcmllZCB1c2luZwotICogdGhlIGJpZGlyZWN0aW9uYWwgPGNvZGU+T3JkZXJlZE1hcEl0ZXJhdG9yPC9jb2RlPi4gVGhlIG9yZGVyIHJldHVybmVkIGlzCi0gKiBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC4gSXRlcmF0b3JzIGZyb20gbWFwIHZpZXdzIGNhbiAKLSAqIGFsc28gYmUgY2FzdCB0byA8Y29kZT5PcmRlcmVkSXRlcmF0b3I8L2NvZGU+IGlmIHJlcXVpcmVkLgotICogPHA+Ci0gKiBBbGwgdGhlIGF2YWlsYWJsZSBpdGVyYXRvcnMgY2FuIGJlIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IGJ5IGNhc3RpbmcgdG8KLSAqIDxjb2RlPlJlc2V0dGFibGVJdGVyYXRvcjwvY29kZT4gYW5kIGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IExSVU1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4ncyB3aGVuIGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcy4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAgKHByZXZpb3VzbHkgaW4gbWFpbiBwYWNrYWdlIHYxLjApCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIE1vcmdhbiBEZWxhZ3JhbmdlCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBNaWtlIFBldHR5cGllY2UKLSAqIEBhdXRob3IgTWFyaW8gSXZhbmtvdml0cwotICovCi1wdWJsaWMgY2xhc3MgTFJVTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaW5rZWRNYXAgaW1wbGVtZW50cyBCb3VuZGVkTWFwLCBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Ci0gICAgCi0gICAgLyoqIFNlcmlhbGlzYXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTIxMTQ2NDM0ODg5NTUyMThMOwotICAgIC8qKiBEZWZhdWx0IG1heGltdW0gc2l6ZSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1NJWkUgPSAxMDA7Ci0gICAgCi0gICAgLyoqIE1heGltdW0gc2l6ZSAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBtYXhTaXplOwotICAgIC8qKiBTY2FuIGJlaGF2aW91ciAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzY2FuVW50aWxSZW1vdmFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IG1hcCB3aXRoIGEgbWF4aW11bSBzaXplIG9mIDEwMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTFJVTWFwKCkgewotICAgICAgICB0aGlzKERFRkFVTFRfTUFYX1NJWkUsIERFRkFVTFRfTE9BRF9GQUNUT1IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIG1heGltdW0gc2l6ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhTaXplICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWF4aW11bSBzaXplIGlzIGxlc3MgdGhhbiBvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgTFJVTWFwKGludCBtYXhTaXplKSB7Ci0gICAgICAgIHRoaXMobWF4U2l6ZSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBtYXhpbXVtIHNpemUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF4U2l6ZSAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWFwCi0gICAgICogQHBhcmFtIHNjYW5VbnRpbFJlbW92YWJsZSAgc2NhbiB1bnRpbCBhIHJlbW92ZWFibGUgZW50cnkgaXMgZm91bmQsIGRlZmF1bHQgZmFsc2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWF4aW11bSBzaXplIGlzIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgTFJVTWFwKGludCBtYXhTaXplLCBib29sZWFuIHNjYW5VbnRpbFJlbW92YWJsZSkgewotICAgICAgICB0aGlzKG1heFNpemUsIERFRkFVTFRfTE9BRF9GQUNUT1IsIHNjYW5VbnRpbFJlbW92YWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAotICAgICAqIGxvYWQgZmFjdG9yLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhTaXplICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXAsIC0xIGZvciBubyBsaW1pdCwKLSAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1heGltdW0gc2l6ZSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFjdG9yIGlzIGxlc3MgdGhhbiB6ZXJvCi0gICAgICovCi0gICAgcHVibGljIExSVU1hcChpbnQgbWF4U2l6ZSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgICAgICB0aGlzKG1heFNpemUsIGxvYWRGYWN0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCi0gICAgICogbG9hZCBmYWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF4U2l6ZSAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWFwLCAtMSBmb3Igbm8gbGltaXQsCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvcgotICAgICAqIEBwYXJhbSBzY2FuVW50aWxSZW1vdmFibGUgIHNjYW4gdW50aWwgYSByZW1vdmVhYmxlIGVudHJ5IGlzIGZvdW5kLCBkZWZhdWx0IGZhbHNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1heGltdW0gc2l6ZSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFjdG9yIGlzIGxlc3MgdGhhbiB6ZXJvCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIExSVU1hcChpbnQgbWF4U2l6ZSwgZmxvYXQgbG9hZEZhY3RvciwgYm9vbGVhbiBzY2FuVW50aWxSZW1vdmFibGUpIHsKLSAgICAgICAgc3VwZXIoKG1heFNpemUgPCAxID8gREVGQVVMVF9DQVBBQ0lUWSA6IG1heFNpemUpLCBsb2FkRmFjdG9yKTsKLSAgICAgICAgaWYgKG1heFNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMUlVNYXAgbWF4IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7Ci0gICAgICAgIHRoaXMuc2NhblVudGlsUmVtb3ZhYmxlID0gc2NhblVudGlsUmVtb3ZhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNvcHlpbmcgZWxlbWVudHMgZnJvbSBhbm90aGVyIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWF4aW11bSBzaXplIGlzIHNldCBmcm9tIHRoZSBtYXAncyBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5Ci0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIExSVU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHRoaXMobWFwLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY29weWluZyBlbGVtZW50cyBmcm9tIGFub3RoZXIgbWFwLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgbWF4aW11bSBzaXplIGlzIHNldCBmcm9tIHRoZSBtYXAncyBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5Ci0gICAgICogQHBhcmFtIHNjYW5VbnRpbFJlbW92YWJsZSAgc2NhbiB1bnRpbCBhIHJlbW92ZWFibGUgZW50cnkgaXMgZm91bmQsIGRlZmF1bHQgZmFsc2UKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgZW1wdHkKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgTFJVTWFwKE1hcCBtYXAsIGJvb2xlYW4gc2NhblVudGlsUmVtb3ZhYmxlKSB7Ci0gICAgICAgIHRoaXMobWFwLnNpemUoKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUiwgc2NhblVudGlsUmVtb3ZhYmxlKTsKLSAgICAgICAgcHV0QWxsKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUga2V5IHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBjaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUga2V5IGluIHRoZSBtYXAgdG8gdGhlCi0gICAgICogbW9zdCByZWNlbnRseSB1c2VkIHBvc2l0aW9uIChmaXJzdCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleQotICAgICAqIEByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSwgbnVsbCBpZiBubyBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgTGlua0VudHJ5IGVudHJ5ID0gKExpbmtFbnRyeSkgZ2V0RW50cnkoa2V5KTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIG1vdmVUb01SVShlbnRyeSk7Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyBhbiBlbnRyeSB0byB0aGUgTVJVIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyB0aGUgdXBkYXRlZCBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIHVwZGF0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1vdmVUb01SVShMaW5rRW50cnkgZW50cnkpIHsKLSAgICAgICAgaWYgKGVudHJ5LmFmdGVyICE9IGhlYWRlcikgewotICAgICAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgICAgIC8vIHJlbW92ZQotICAgICAgICAgICAgZW50cnkuYmVmb3JlLmFmdGVyID0gZW50cnkuYWZ0ZXI7Ci0gICAgICAgICAgICBlbnRyeS5hZnRlci5iZWZvcmUgPSBlbnRyeS5iZWZvcmU7Ci0gICAgICAgICAgICAvLyBhZGQgZmlyc3QKLSAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gaGVhZGVyOwotICAgICAgICAgICAgZW50cnkuYmVmb3JlID0gaGVhZGVyLmJlZm9yZTsKLSAgICAgICAgICAgIGhlYWRlci5iZWZvcmUuYWZ0ZXIgPSBlbnRyeTsKLSAgICAgICAgICAgIGhlYWRlci5iZWZvcmUgPSBlbnRyeTsKLSAgICAgICAgfSBlbHNlIGlmIChlbnRyeSA9PSBoZWFkZXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IG1vdmUgaGVhZGVyIHRvIE1SVSIgKwotICAgICAgICAgICAgICAgICIgKHBsZWFzZSByZXBvcnQgdGhpcyB0byBjb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmcpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBhbiBleGlzdGluZyBrZXktdmFsdWUgbWFwcGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1vdmVzIHRoZSB1cGRhdGVkIGVudHJ5IHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QKLSAgICAgKiB1c2luZyB7QGxpbmsgI21vdmVUb01SVShBYnN0cmFjdExpbmtlZE1hcC5MaW5rRW50cnkpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byB1cGRhdGUKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgIHRoZSBuZXcgdmFsdWUgdG8gc3RvcmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbnRyeShIYXNoRW50cnkgZW50cnksIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBtb3ZlVG9NUlUoKExpbmtFbnRyeSkgZW50cnkpOyAgLy8gaGFuZGxlcyBtb2RDb3VudAotICAgICAgICBlbnRyeS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcga2V5LXZhbHVlIG1hcHBpbmcgaW50byB0aGlzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB0aGUgTFJVIHNpemUgYW5kIGRldGVybWluZXMgd2hldGhlciB0bwotICAgICAqIGRpc2NhcmQgYW4gZW50cnkgb3Igbm90IHVzaW5nIHtAbGluayAjcmVtb3ZlTFJVKEFic3RyYWN0TGlua2VkTWFwLkxpbmtFbnRyeSl9LgotICAgICAqIDxwPgotICAgICAqIEZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEgdGhpcyBtZXRob2QgdXNlcyB7QGxpbmsgI2lzRnVsbCgpfSByYXRoZXIKLSAgICAgKiB0aGFuIGFjY2Vzc2luZyA8Y29kZT5zaXplPC9jb2RlPiBhbmQgPGNvZGU+bWF4U2l6ZTwvY29kZT4gZGlyZWN0bHkuCi0gICAgICogSXQgYWxzbyBoYW5kbGVzIHRoZSBzY2FuVW50aWxSZW1vdmFibGUgZnVuY3Rpb25hbGl0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGFzaEluZGV4ICB0aGUgaW5kZXggaW50byB0aGUgZGF0YSBhcnJheSB0byBzdG9yZSBhdAotICAgICAqIEBwYXJhbSBoYXNoQ29kZSAgdGhlIGhhc2ggY29kZSBvZiB0aGUga2V5IHRvIGFkZAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZyhpbnQgaGFzaEluZGV4LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoaXNGdWxsKCkpIHsKLSAgICAgICAgICAgIExpbmtFbnRyeSByZXVzZSA9IGhlYWRlci5hZnRlcjsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlTFJVRW50cnkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzY2FuVW50aWxSZW1vdmFibGUpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAocmV1c2UgIT0gaGVhZGVyICYmIHJldXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZUxSVShyZXVzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxSVUVudHJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldXNlID0gcmV1c2UuYWZ0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXVzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRW50cnkuYWZ0ZXI9bnVsbCwgaGVhZGVyLmFmdGVyIiArIGhlYWRlci5hZnRlciArICIgaGVhZGVyLmJlZm9yZSIgKyBoZWFkZXIuYmVmb3JlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIga2V5PSIgKyBrZXkgKyAiIHZhbHVlPSIgKyB2YWx1ZSArICIgc2l6ZT0iICsgc2l6ZSArICIgbWF4U2l6ZT0iICsgbWF4U2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIga2V5cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhhdCB5b3UgaGF2ZSB1c2VkIHN5bmNocm9uaXphdGlvbiBwcm9wZXJseS4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgSWYgc28sIHRoZW4gcGxlYXNlIHJlcG9ydCB0aGlzIHRvIGNvbW1vbnMtZGV2QGpha2FydGEuYXBhY2hlLm9yZyBhcyBhIGJ1Zy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbW92ZUxSVUVudHJ5ID0gcmVtb3ZlTFJVKHJldXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlbW92ZUxSVUVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJldXNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXVzZT1udWxsLCBoZWFkZXIuYWZ0ZXI9IiArIGhlYWRlci5hZnRlciArICIgaGVhZGVyLmJlZm9yZSIgKyBoZWFkZXIuYmVmb3JlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIga2V5PSIgKyBrZXkgKyAiIHZhbHVlPSIgKyB2YWx1ZSArICIgc2l6ZT0iICsgc2l6ZSArICIgbWF4U2l6ZT0iICsgbWF4U2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIga2V5cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhhdCB5b3UgaGF2ZSB1c2VkIHN5bmNocm9uaXphdGlvbiBwcm9wZXJseS4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgSWYgc28sIHRoZW4gcGxlYXNlIHJlcG9ydCB0aGlzIHRvIGNvbW1vbnMtZGV2QGpha2FydGEuYXBhY2hlLm9yZyBhcyBhIGJ1Zy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV1c2VNYXBwaW5nKHJldXNlLCBoYXNoSW5kZXgsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuYWRkTWFwcGluZyhoYXNoSW5kZXgsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmFkZE1hcHBpbmcoaGFzaEluZGV4LCBoYXNoQ29kZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV1c2VzIGFuIGVudHJ5IGJ5IHJlbW92aW5nIGl0IGFuZCBtb3ZpbmcgaXQgdG8gYSBuZXcgcGxhY2UgaW4gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHtAbGluayAjcmVtb3ZlRW50cnl9LCB7QGxpbmsgI3JldXNlRW50cnl9IGFuZCB7QGxpbmsgI2FkZEVudHJ5fS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byByZXVzZQotICAgICAqIEBwYXJhbSBoYXNoSW5kZXggIHRoZSBpbmRleCBpbnRvIHRoZSBkYXRhIGFycmF5IHRvIHN0b3JlIGF0Ci0gICAgICogQHBhcmFtIGhhc2hDb2RlICB0aGUgaGFzaCBjb2RlIG9mIHRoZSBrZXkgdG8gYWRkCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBhZGQKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBhZGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXVzZU1hcHBpbmcoTGlua0VudHJ5IGVudHJ5LCBpbnQgaGFzaEluZGV4LCBpbnQgaGFzaENvZGUsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAvLyBmaW5kIHRoZSBlbnRyeSBiZWZvcmUgdGhlIGVudHJ5IHNwZWNpZmllZCBpbiB0aGUgaGFzaCB0YWJsZQotICAgICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBwYXJhbWV0ZXJzIChleGNlcHQgdGhlIGZpcnN0KSByZWZlciB0byB0aGUgbmV3IGVudHJ5LAotICAgICAgICAvLyBub3QgdGhlIG9sZCBvbmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCByZW1vdmVJbmRleCA9IGhhc2hJbmRleChlbnRyeS5oYXNoQ29kZSwgZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgSGFzaEVudHJ5W10gdG1wID0gZGF0YTsgIC8vIG1heSBwcm90ZWN0IGFnYWluc3Qgc29tZSBzeW5jIGlzc3VlcwotICAgICAgICAgICAgSGFzaEVudHJ5IGxvb3AgPSB0bXBbcmVtb3ZlSW5kZXhdOwotICAgICAgICAgICAgSGFzaEVudHJ5IHByZXZpb3VzID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChsb29wICE9IGVudHJ5ICYmIGxvb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbG9vcDsKLSAgICAgICAgICAgICAgICBsb29wID0gbG9vcC5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxvb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFbnRyeS5uZXh0PW51bGwsIGRhdGFbcmVtb3ZlSW5kZXhdPSIgKyBkYXRhW3JlbW92ZUluZGV4XSArICIgcHJldmlvdXM9IiArIHByZXZpb3VzICsKLSAgICAgICAgICAgICAgICAgICAgIiBrZXk9IiArIGtleSArICIgdmFsdWU9IiArIHZhbHVlICsgIiBzaXplPSIgKyBzaXplICsgIiBtYXhTaXplPSIgKyBtYXhTaXplICsKLSAgICAgICAgICAgICAgICAgICAgIiBQbGVhc2UgY2hlY2sgdGhhdCB5b3VyIGtleXMgYXJlIGltbXV0YWJsZSwgYW5kIHRoYXQgeW91IGhhdmUgdXNlZCBzeW5jaHJvbml6YXRpb24gcHJvcGVybHkuIiArCi0gICAgICAgICAgICAgICAgICAgICIgSWYgc28sIHRoZW4gcGxlYXNlIHJlcG9ydCB0aGlzIHRvIGNvbW1vbnMtZGV2QGpha2FydGEuYXBhY2hlLm9yZyBhcyBhIGJ1Zy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmV1c2UgdGhlIGVudHJ5Ci0gICAgICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICAgICAgcmVtb3ZlRW50cnkoZW50cnksIHJlbW92ZUluZGV4LCBwcmV2aW91cyk7Ci0gICAgICAgICAgICByZXVzZUVudHJ5KGVudHJ5LCBoYXNoSW5kZXgsIGhhc2hDb2RlLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGFkZEVudHJ5KGVudHJ5LCBoYXNoSW5kZXgpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk5QRSwgZW50cnk9IiArIGVudHJ5ICsgIiBlbnRyeUlzSGVhZGVyPSIgKyAoZW50cnk9PWhlYWRlcikgKwotICAgICAgICAgICAgICAgICAgICAiIGtleT0iICsga2V5ICsgIiB2YWx1ZT0iICsgdmFsdWUgKyAiIHNpemU9IiArIHNpemUgKyAiIG1heFNpemU9IiArIG1heFNpemUgKwotICAgICAgICAgICAgICAgICAgICAiIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIga2V5cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhhdCB5b3UgaGF2ZSB1c2VkIHN5bmNocm9uaXphdGlvbiBwcm9wZXJseS4iICsKLSAgICAgICAgICAgICAgICAgICAgIiBJZiBzbywgdGhlbiBwbGVhc2UgcmVwb3J0IHRoaXMgdG8gY29tbW9ucy1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIGFzIGEgYnVnLiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN1YmNsYXNzIG1ldGhvZCB0byBjb250cm9sIHJlbW92YWwgb2YgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkgZnJvbSB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZS4gQSBzdWJjbGFzcyBtYXkgd2lzaCB0bwotICAgICAqIHByb3ZpZGUgY2xlYW51cCBvZiByZXNvdXJjZXMgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkLiBGb3IgZXhhbXBsZToKLSAgICAgKiA8cHJlPgotICAgICAqIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZUxSVShMaW5rRW50cnkgZW50cnkpIHsKLSAgICAgKiAgIHJlbGVhc2VSZXNvdXJjZXMoZW50cnkuZ2V0VmFsdWUoKSk7ICAvLyByZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5IGVudHJ5Ci0gICAgICogICByZXR1cm4gdHJ1ZTsgIC8vIGFjdHVhbGx5IGRlbGV0ZSBlbnRyeQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIG1heSBjaG9vc2UgdG8gbm90IHJlbW92ZSB0aGUgZW50cnkgb3Igc2VsZWN0aXZlbHkKLSAgICAgKiBrZWVwIGNlcnRhaW4gTFJVIGVudHJpZXMuIEZvciBleGFtcGxlOgotICAgICAqIDxwcmU+Ci0gICAgICogcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTFJVKExpbmtFbnRyeSBlbnRyeSkgewotICAgICAqICAgaWYgKGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiU3lzdGVtLiIpKSB7Ci0gICAgICogICAgIHJldHVybiBmYWxzZTsgIC8vIGVudHJ5IG5vdCByZW1vdmVkIGZyb20gTFJVTWFwCi0gICAgICogICB9IGVsc2UgewotICAgICAqICAgICByZXR1cm4gdHJ1ZTsgIC8vIGFjdHVhbGx5IGRlbGV0ZSBlbnRyeQotICAgICAqICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiBUaGUgZWZmZWN0IG9mIHJldHVybmluZyBmYWxzZSBpcyBkZXBlbmRlbnQgb24gdGhlIHNjYW5VbnRpbFJlbW92YWJsZSBmbGFnLgotICAgICAqIElmIHRoZSBmbGFnIGlzIHRydWUsIHRoZSBuZXh0IExSVSBlbnRyeSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBhbmQgc28gb24KLSAgICAgKiB1bnRpbCBvbmUgcmV0dXJucyBmYWxzZSBhbmQgaXMgcmVtb3ZlZCwgb3IgZXZlcnkgZW50cnkgaW4gdGhlIG1hcCBoYXMgYmVlbiBwYXNzZWQuCi0gICAgICogSWYgdGhlIHNjYW5VbnRpbFJlbW92YWJsZSBmbGFnIGlzIGZhbHNlLCB0aGUgbWFwIHdpbGwgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUuCi0gICAgICogPHA+Ci0gICAgICogTk9URTogQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAgcGFzc2VkIHRoZSB3cm9uZyBlbnRyeSB0byB0aGlzIG1ldGhvZC4KLSAgICAgKiBUaGlzIGlzIGZpeGVkIGluIHZlcnNpb24gMy4xIG9ud2FyZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gYmUgcmVtb3ZlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZUxSVShMaW5rRW50cnkgZW50cnkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmdWxsIGFuZCBubyBuZXcgbWFwcGluZ3MgY2FuIGJlIGFkZGVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFwIGlzIGZ1bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKSB7Ci0gICAgICAgIHJldHVybiAoc2l6ZSA+PSBtYXhTaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hcCAodGhlIGJvdW5kKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSBtYXAgY2FuIGhvbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG1heFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtYXhTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhpcyBMUlVNYXAgd2lsbCBzY2FuIHVudGlsIGEgcmVtb3ZhYmxlIGVudHJ5IGlzIGZvdW5kIHdoZW4gdGhlCi0gICAgICogbWFwIGlzIGZ1bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtYXAgc2NhbnMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjYW5VbnRpbFJlbW92YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHNjYW5VbnRpbFJlbW92YWJsZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2xvbmVzIHRoZSBtYXAgd2l0aG91dCBjbG9uaW5nIHRoZSBrZXlzIG9yIHZhbHVlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNsb25lCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgZG9Xcml0ZU9iamVjdChvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBkb1JlYWRPYmplY3QoaW4pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGRhdGEgbmVjZXNzYXJ5IGZvciA8Y29kZT5wdXQoKTwvY29kZT4gdG8gd29yayBpbiBkZXNlcmlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Xcml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGVJbnQobWF4U2l6ZSk7Ci0gICAgICAgIHN1cGVyLmRvV3JpdGVPYmplY3Qob3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgZGF0YSBuZWNlc3NhcnkgZm9yIDxjb2RlPnB1dCgpPC9jb2RlPiB0byB3b3JrIGluIHRoZSBzdXBlcmNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvUmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgbWF4U2l6ZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgc3VwZXIuZG9SZWFkT2JqZWN0KGluKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xhenlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGF6eU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGNiZmUzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGF6eU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkZhY3RvcnlUcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5NYXA8L2NvZGU+IHRvIGNyZWF0ZSBvYmplY3RzIGluIHRoZSBtYXAgb24gZGVtYW5kLgotICogPHA+Ci0gKiBXaGVuIHRoZSB7QGxpbmsgI2dldChPYmplY3QpfSBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBrZXkgdGhhdCBkb2VzIG5vdAotICogZXhpc3QgaW4gdGhlIG1hcCwgdGhlIGZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdC4gVGhlIGNyZWF0ZWQKLSAqIG9iamVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAgdXNpbmcgdGhlIHJlcXVlc3RlZCBrZXkuCi0gKiA8cD4KLSAqIEZvciBpbnN0YW5jZToKLSAqIDxwcmU+Ci0gKiBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpIHsKLSAqICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIHsKLSAqICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7Ci0gKiAgICAgfQotICogfQotICogTWFwIGxhenkgPSBMYXp5Lm1hcChuZXcgSGFzaE1hcCgpLCBmYWN0b3J5KTsKLSAqIE9iamVjdCBvYmogPSBsYXp5LmdldCgiTk9XIik7Ci0gKiA8L3ByZT4KLSAqCi0gKiBBZnRlciB0aGUgYWJvdmUgY29kZSBpcyBleGVjdXRlZCwgPGNvZGU+b2JqPC9jb2RlPiB3aWxsIGNvbnRhaW4KLSAqIGEgbmV3IDxjb2RlPkRhdGU8L2NvZGU+IGluc3RhbmNlLiBGdXJ0aGVybW9yZSwgdGhhdCA8Y29kZT5EYXRlPC9jb2RlPgotICogaW5zdGFuY2UgaXMgbWFwcGVkIHRvIHRoZSAiTk9XIiBrZXkgaW4gdGhlIG1hcC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgTGF6eU1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICovCi1wdWJsaWMgY2xhc3MgTGF6eU1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0TWFwRGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgTWFwLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc5OTA5NTY0MDI1NjQyMDY3NDBMOwotCi0gICAgLyoqIFRoZSBmYWN0b3J5IHRvIHVzZSB0byBjb25zdHJ1Y3QgZWxlbWVudHMgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgVHJhbnNmb3JtZXIgZmFjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGxhemlseSBpbnN0YW50aWF0ZWQgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgdGhlIGZhY3RvcnkgdG8gdXNlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIG9yIGZhY3RvcnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGRlY29yYXRlKE1hcCBtYXAsIEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICByZXR1cm4gbmV3IExhenlNYXAobWFwLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBsYXppbHkgaW5zdGFudGlhdGVkIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGZhY3RvcnkgIHRoZSBmYWN0b3J5IHRvIHVzZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBvciBmYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBkZWNvcmF0ZShNYXAgbWFwLCBUcmFuc2Zvcm1lciBmYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGF6eU1hcChtYXAsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGZhY3RvcnkgIHRoZSBmYWN0b3J5IHRvIHVzZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBvciBmYWN0b3J5IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGF6eU1hcChNYXAgbWFwLCBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gRmFjdG9yeVRyYW5zZm9ybWVyLmdldEluc3RhbmNlKGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgdGhlIGZhY3RvcnkgdG8gdXNlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIG9yIGZhY3RvcnkgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBMYXp5TWFwKE1hcCBtYXAsIFRyYW5zZm9ybWVyIGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBjcmVhdGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgbWFwCi0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZmFjdG9yeS50cmFuc2Zvcm0oa2V5KTsKLSAgICAgICAgICAgIG1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvLyBubyBuZWVkIHRvIHdyYXAga2V5U2V0LCBlbnRyeVNldCBvciB2YWx1ZXMgYXMgdGhleSBhcmUgdmlld3Mgb2YKLSAgICAvLyBleGlzdGluZyBtYXAgZW50cmllcyAtIHlvdSBjYW4ndCBkbyBhIG1hcC1zdHlsZSBnZXQgb24gdGhlbS4KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTGF6eVNvcnRlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MYXp5U29ydGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiNzQyNzQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MYXp5U29ydGVkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNvcnRlZE1hcDwvY29kZT4gdG8gY3JlYXRlIG9iamVjdHMgaW4gdGhlIG1hcCBvbiBkZW1hbmQuCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHtAbGluayAjZ2V0KE9iamVjdCl9IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIGtleSB0aGF0IGRvZXMgbm90Ci0gKiBleGlzdCBpbiB0aGUgbWFwLCB0aGUgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0LiBUaGUgY3JlYXRlZAotICogb2JqZWN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1hcCB1c2luZyB0aGUgcmVxdWVzdGVkIGtleS4KLSAqIDxwPgotICogRm9yIGluc3RhbmNlOgotICogPHByZT4KLSAqIEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCkgewotICogICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotICogICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKLSAqICAgICB9Ci0gKiB9Ci0gKiBTb3J0ZWRNYXAgbGF6eSA9IExhenkuc29ydGVkTWFwKG5ldyBIYXNoTWFwKCksIGZhY3RvcnkpOwotICogT2JqZWN0IG9iaiA9IGxhenkuZ2V0KCJOT1ciKTsKLSAqIDwvcHJlPgotICoKLSAqIEFmdGVyIHRoZSBhYm92ZSBjb2RlIGlzIGV4ZWN1dGVkLCA8Y29kZT5vYmo8L2NvZGU+IHdpbGwgY29udGFpbgotICogYSBuZXcgPGNvZGU+RGF0ZTwvY29kZT4gaW5zdGFuY2UuIEZ1cnRoZXJtb3JlLCB0aGF0IDxjb2RlPkRhdGU8L2NvZGU+Ci0gKiBpbnN0YW5jZSBpcyBtYXBwZWQgdG8gdGhlICJOT1ciIGtleSBpbiB0aGUgbWFwLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBMYXp5U29ydGVkTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkU29ydGVkTWFwfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIFBhdWwgSmFjawotICovCi1wdWJsaWMgY2xhc3MgTGF6eVNvcnRlZE1hcAotICAgICAgICBleHRlbmRzIExhenlNYXAKLSAgICAgICAgaW1wbGVtZW50cyBTb3J0ZWRNYXAgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3MTUzMjIxODM2MTc2NTg5MzNMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbGF6aWx5IGluc3RhbnRpYXRlZCBzb3J0ZWQgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgdGhlIGZhY3RvcnkgdG8gdXNlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIG9yIGZhY3RvcnkgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGRlY29yYXRlKFNvcnRlZE1hcCBtYXAsIEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICByZXR1cm4gbmV3IExhenlTb3J0ZWRNYXAobWFwLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBsYXppbHkgaW5zdGFudGlhdGVkIHNvcnRlZCBtYXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgb3IgZmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgZGVjb3JhdGUoU29ydGVkTWFwIG1hcCwgVHJhbnNmb3JtZXIgZmFjdG9yeSkgewotICAgICAgICByZXR1cm4gbmV3IExhenlTb3J0ZWRNYXAobWFwLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgb3IgZmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhenlTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCwgRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKG1hcCwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5ICB0aGUgZmFjdG9yeSB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgb3IgZmFjdG9yeSBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExhenlTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCwgVHJhbnNmb3JtZXIgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihtYXAsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXAgYmVpbmcgZGVjb3JhdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkTWFwIGdldFNvcnRlZE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRNYXApIG1hcDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmZpcnN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBsYXN0S2V5KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkubGFzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCBzdWJNYXAoT2JqZWN0IGZyb21LZXksIE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkuc3ViTWFwKGZyb21LZXksIHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBMYXp5U29ydGVkTWFwKG1hcCwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCBoZWFkTWFwKE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkuaGVhZE1hcCh0b0tleSk7Ci0gICAgICAgIHJldHVybiBuZXcgTGF6eVNvcnRlZE1hcChtYXAsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgdGFpbE1hcChPYmplY3QgZnJvbUtleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkudGFpbE1hcChmcm9tS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBMYXp5U29ydGVkTWFwKG1hcCwgZmFjdG9yeSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpbmtlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaW5rZWRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBmODA1Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpbmtlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5Vbm1vZGlmaWFibGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVW5tb2RpZmlhYmxlTGlzdDsKLQotLyoqCi0gKiBBIDxjb2RlPk1hcDwvY29kZT4gaW1wbGVtZW50YXRpb24gdGhhdCBtYWludGFpbnMgdGhlIG9yZGVyIG9mIHRoZSBlbnRyaWVzLgotICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvcmRlciBpcyBtYWludGFpbmVkIGJ5IG9yaWdpbmFsIGluc2VydGlvbi4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpbXByb3ZlcyBvbiB0aGUgSkRLMS40IExpbmtlZEhhc2hNYXAgYnkgYWRkaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3IgTWFwSXRlcmF0b3J9Ci0gKiBmdW5jdGlvbmFsaXR5LCBhZGRpdGlvbmFsIGNvbnZlbmllbmNlIG1ldGhvZHMgYW5kIGFsbG93aW5nCi0gKiBiaWRpcmVjdGlvbmFsIGl0ZXJhdGlvbi4gSXQgYWxzbyBpbXBsZW1lbnRzIDxjb2RlPk9yZGVyZWRNYXA8L2NvZGU+LgotICogSW4gYWRkaXRpb24sIG5vbi1pbnRlcmZhY2UgbWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIHRoZSBtYXAgYnkgaW5kZXguCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5vcmRlcmVkTWFwSXRlcmF0b3IoKTwvY29kZT4gbWV0aG9kIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gYQotICogYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4gVGhlIGl0ZXJhdG9ycyBmcm9tIHRoZSBvdGhlciB2aWV3cyBjYW4gYWxzbyBiZSBjYXN0Ci0gKiB0byA8Y29kZT5PcmRlcmVkSXRlcmF0b3I8L2NvZGU+IGlmIHJlcXVpcmVkLgotICogPHA+Ci0gKiBBbGwgdGhlIGF2YWlsYWJsZSBpdGVyYXRvcnMgY2FuIGJlIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IGJ5IGNhc3RpbmcgdG8KLSAqIDxjb2RlPlJlc2V0dGFibGVJdGVyYXRvcjwvY29kZT4gYW5kIGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGRlc2lnbmVkIHRvIGJlIHN1YmNsYXNzZWQsIHdpdGggbG90cyBvZiB1c2VmdWwKLSAqIG1ldGhvZHMgZXhwb3NlZC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgTGlua2VkTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgTGlua2VkTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaW5rZWRNYXAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXNhdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTA3NzIzNDMyMzUyMTE2MTA2Nkw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBtYXAgd2l0aCBkZWZhdWx0IHNpemUgYW5kIGxvYWQgZmFjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBMaW5rZWRNYXAoKSB7Ci0gICAgICAgIHN1cGVyKERFRkFVTFRfQ0FQQUNJVFksIERFRkFVTFRfTE9BRF9GQUNUT1IsIERFRkFVTFRfVEhSRVNIT0xEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkuIAotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCi0gICAgICovCi0gICAgcHVibGljIExpbmtlZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAotICAgICAqIGxvYWQgZmFjdG9yLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbGVzcyB0aGFuIHplcm8KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlua2VkTWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBjb3B5aW5nIGVsZW1lbnRzIGZyb20gYW5vdGhlciBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGNvcHkKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBMaW5rZWRNYXAoTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDbG9uZXMgdGhlIG1hcCB3aXRob3V0IGNsb25pbmcgdGhlIGtleXMgb3IgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBkb1dyaXRlT2JqZWN0KG91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGRvUmVhZE9iamVjdChpbik7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIGtleSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRFbnRyeShpbmRleCkuZ2V0S2V5KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRFbnRyeShpbmRleCkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBmaW5kIHRoZSBpbmRleCBvZgotICAgICAqIEByZXR1cm4gdGhlIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IGtleSkgewotICAgICAgICBrZXkgPSBjb252ZXJ0S2V5KGtleSk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChMaW5rRW50cnkgZW50cnkgPSBoZWFkZXIuYWZ0ZXI7IGVudHJ5ICE9IGhlYWRlcjsgZW50cnkgPSBlbnRyeS5hZnRlciwgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXNFcXVhbEtleShrZXksIGVudHJ5LmtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRoZSA8Y29kZT5rZXk8L2NvZGU+LAotICAgICAqICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0ZWQKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHJlbW92ZShnZXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHVubW9kaWZpYWJsZSBMaXN0IHZpZXcgb2YgdGhlIGtleXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlIGJlY2F1c2UgY2hhbmdlcyB0byB0aGUgdmFsdWVzIG9mCi0gICAgICogdGhlIGxpc3QgKHVzaW5nIHtAbGluayBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI3NldChPYmplY3QpfSkgd2lsbAotICAgICAqIGVmZmVjdGl2ZWx5IHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgbGlzdCBhbmQgcmVpbnNlcnQgdGhhdCB2YWx1ZSBhdAotICAgICAqIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHdoaWNoIGlzIGFuIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcgdGhlCi0gICAgICogdmFsdWUgb2YgYSBsaXN0LiAgVGhpcyBvY2N1cnMgYmVjYXVzZSBjaGFuZ2luZyB0aGUga2V5LCBjaGFuZ2VzIHdoZW4gdGhlCi0gICAgICogbWFwcGluZyBpcyBhZGRlZCB0byB0aGUgbWFwIGFuZCB0aHVzIHdoZXJlIGl0IGFwcGVhcnMgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBtZXRob2QgaXMgdG8gdXNlIHtAbGluayAja2V5U2V0KCl9LgotICAgICAqCi0gICAgICogQHNlZSAja2V5U2V0KCkKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmRlcmVkIGxpc3Qgb2Yga2V5cy4gIAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGFzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRNYXBMaXN0KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3QgdmlldyBvZiBtYXAuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExpbmtlZE1hcExpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3QgewotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlua2VkTWFwIHBhcmVudDsKLSAgICAgICAgCi0gICAgICAgIExpbmtlZE1hcExpc3QoTGlua2VkTWFwIHBhcmVudCkgewotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNvbnRhaW5zS2V5KG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5pbmRleE9mKG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5pbmRleE9mKG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5rZXlTZXQoKS5jb250YWluc0FsbChjb2xsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5rZXlTZXQoKS50b0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5rZXlTZXQoKS50b0FycmF5KGFycmF5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUl0ZXJhdG9yLmRlY29yYXRlKHBhcmVudC5rZXlTZXQoKS5pdGVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmRlY29yYXRlKHN1cGVyLmxpc3RJdGVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoaW50IGZyb21JbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUxpc3RJdGVyYXRvci5kZWNvcmF0ZShzdXBlci5saXN0SXRlcmF0b3IoZnJvbUluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleEluY2x1c2l2ZSwgaW50IHRvSW5kZXhFeGNsdXNpdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVMaXN0LmRlY29yYXRlKHN1cGVyLnN1Ykxpc3QoZnJvbUluZGV4SW5jbHVzaXZlLCB0b0luZGV4RXhjbHVzaXZlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL0xpc3RPcmRlcmVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhZmMzN2IuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9MaXN0T3JkZXJlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmtleXZhbHVlLkFic3RyYWN0TWFwRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVW5tb2RpZmlhYmxlTGlzdDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYSA8Y29kZT5NYXA8L2NvZGU+IHRvIGVuc3VyZSB0aGF0IHRoZSBvcmRlciBvZiBhZGRpdGlvbiBpcyByZXRhaW5lZAotICogdXNpbmcgYSA8Y29kZT5MaXN0PC9jb2RlPiB0byBtYWludGFpbiBvcmRlci4KLSAqIDxwPgotICogVGhlIG9yZGVyIHdpbGwgYmUgdXNlZCB2aWEgdGhlIGl0ZXJhdG9ycyBhbmQgdG9BcnJheSBtZXRob2RzIG9uIHRoZSB2aWV3cy4KLSAqIFRoZSBvcmRlciBpcyBhbHNvIHJldHVybmVkIGJ5IHRoZSA8Y29kZT5NYXBJdGVyYXRvcjwvY29kZT4uCi0gKiBUaGUgPGNvZGU+b3JkZXJlZE1hcEl0ZXJhdG9yKCk8L2NvZGU+IG1ldGhvZCBhY2Nlc3NlcyBhbiBpdGVyYXRvciB0aGF0IGNhbgotICogaXRlcmF0ZSBib3RoIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgbWFwLgotICogSW4gYWRkaXRpb24sIG5vbi1pbnRlcmZhY2UgbWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIHRoZSBtYXAgYnkgaW5kZXguCi0gKiA8cD4KLSAqIElmIGFuIG9iamVjdCBpcyBhZGRlZCB0byB0aGUgTWFwIGZvciBhIHNlY29uZCB0aW1lLCBpdCB3aWxsIHJlbWFpbiBpbiB0aGUKLSAqIG9yaWdpbmFsIHBvc2l0aW9uIGluIHRoZSBpdGVyYXRpb24uCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IExpc3RPcmRlcmVkTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBIZW5yaSBZYW5kZWxsCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBNYXR0IEJlbnNvbgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE9yZGVyZWRNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1hcERlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIE9yZGVyZWRNYXAsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjcyODE3Nzc1MTg1MTAwMzc1MEw7Ci0KLSAgICAvKiogSW50ZXJuYWwgbGlzdCB0byBob2xkIHRoZSBzZXF1ZW5jZSBvZiBvYmplY3RzICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3QgaW5zZXJ0T3JkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gb3JkZXJlZCBtYXAuCi0gICAgICogPHA+Ci0gICAgICogQW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBpcyB1c2VkIHRvIHJldGFpbiBvcmRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9yZGVyZWRNYXAgZGVjb3JhdGUoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gbmV3IExpc3RPcmRlcmVkTWFwKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgPGNvZGU+TGlzdE9yZGVyZWRNYXA8L2NvZGU+IHRoYXQgZGVjb3JhdGVzCi0gICAgICogYSA8Y29kZT5IYXNoTWFwPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdE9yZGVyZWRNYXAoKSB7Ci0gICAgICAgIHRoaXMobmV3IEhhc2hNYXAoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RPcmRlcmVkTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICAgICAgaW5zZXJ0T3JkZXIuYWRkQWxsKGdldE1hcCgpLmtleVNldCgpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnQgT3JkZXJlZE1hcAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgTWFwSXRlcmF0b3IgbWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBvcmRlcmVkTWFwSXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3JkZXJlZE1hcEl0ZXJhdG9yIG9yZGVyZWRNYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXN0T3JkZXJlZE1hcEl0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IGtleSBpbiB0aGlzIG1hcCBieSBpbnNlcnQgb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBrZXkgY3VycmVudGx5IGluIHRoaXMgbWFwCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoaXMgbWFwIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgaWYgKHNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiTWFwIGlzIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc2VydE9yZGVyLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsYXN0IGtleSBpbiB0aGlzIG1hcCBieSBpbnNlcnQgb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAKLSAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtYXAgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIGlmIChzaXplKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1hcCBpcyBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnNlcnRPcmRlci5nZXQoc2l6ZSgpIC0gMSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5leHQga2V5IHRvIHRoZSBvbmUgc3BlY2lmaWVkIHVzaW5nIGluc2VydCBvcmRlci4KLSAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIGxpc3Qgc2VhcmNoIHRvIGZpbmQgdGhlIGtleSBhbmQgaXMgTyhuKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGZpbmQgcHJldmlvdXMgZm9yCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBrZXksIG51bGwgaWYgbm8gbWF0Y2ggb3IgYXQgc3RhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBpbnQgaW5kZXggPSBpbnNlcnRPcmRlci5pbmRleE9mKGtleSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGluc2VydE9yZGVyLmdldChpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZXZpb3VzIGtleSB0byB0aGUgb25lIHNwZWNpZmllZCB1c2luZyBpbnNlcnQgb3JkZXIuCi0gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSBsaXN0IHNlYXJjaCB0byBmaW5kIHRoZSBrZXkgYW5kIGlzIE8obikuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBmaW5kIHByZXZpb3VzIGZvcgotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGtleSwgbnVsbCBpZiBubyBtYXRjaCBvciBhdCBzdGFydAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBpbnQgaW5kZXggPSBpbnNlcnRPcmRlci5pbmRleE9mKGtleSk7Ci0gICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBpbnNlcnRPcmRlci5nZXQoaW5kZXggLSAxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChnZXRNYXAoKS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAvLyByZS1hZGRpbmcgZG9lc24ndCBjaGFuZ2Ugb3JkZXIKLSAgICAgICAgICAgIHJldHVybiBnZXRNYXAoKS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBhZGQsIHNvIGFkZCB0byBib3RoIG1hcCBhbmQgbGlzdAotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldE1hcCgpLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGluc2VydE9yZGVyLmFkZChrZXkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZ2V0TWFwKCkucmVtb3ZlKGtleSk7Ci0gICAgICAgIGluc2VydE9yZGVyLnJlbW92ZShrZXkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBnZXRNYXAoKS5jbGVhcigpOwotICAgICAgICBpbnNlcnRPcmRlci5jbGVhcigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmlldyBvdmVyIHRoZSBrZXlzIGluIHRoZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIENvbGxlY3Rpb24gd2lsbCBiZSBvcmRlcmVkIGJ5IG9iamVjdCBpbnNlcnRpb24gaW50byB0aGUgbWFwLgotICAgICAqCi0gICAgICogQHNlZSAja2V5TGlzdCgpCi0gICAgICogQHJldHVybiB0aGUgZnVsbHkgbW9kaWZpYWJsZSBjb2xsZWN0aW9uIHZpZXcgb3ZlciB0aGUga2V5cwotICAgICAqLwotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IEtleVNldFZpZXcodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgb3ZlciB0aGUga2V5cyBpbiB0aGUgbWFwIGFzIGEgTGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTGlzdCB3aWxsIGJlIG9yZGVyZWQgYnkgb2JqZWN0IGluc2VydGlvbiBpbnRvIHRoZSBtYXAuCi0gICAgICogVGhlIExpc3QgaXMgdW5tb2RpZmlhYmxlLgotICAgICAqCi0gICAgICogQHNlZSAja2V5U2V0KCkKLSAgICAgKiBAcmV0dXJuIHRoZSB1bm1vZGlmaWFibGUgbGlzdCB2aWV3IG92ZXIgdGhlIGtleXMKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBrZXlMaXN0KCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTGlzdC5kZWNvcmF0ZShpbnNlcnRPcmRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgb3ZlciB0aGUgdmFsdWVzIGluIHRoZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIENvbGxlY3Rpb24gd2lsbCBiZSBvcmRlcmVkIGJ5IG9iamVjdCBpbnNlcnRpb24gaW50byB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIEZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIsIHRoaXMgQ29sbGVjdGlvbiBjYW4gYmUgY2FzdAotICAgICAqIHRvIGEgbGlzdCwgc2VlIHtAbGluayAjdmFsdWVMaXN0KCl9Ci0gICAgICoKLSAgICAgKiBAc2VlICN2YWx1ZUxpc3QoKQotICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IG1vZGlmaWFibGUgY29sbGVjdGlvbiB2aWV3IG92ZXIgdGhlIHZhbHVlcwotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXNWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IG92ZXIgdGhlIHZhbHVlcyBpbiB0aGUgbWFwIGFzIGEgTGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgTGlzdCB3aWxsIGJlIG9yZGVyZWQgYnkgb2JqZWN0IGluc2VydGlvbiBpbnRvIHRoZSBtYXAuCi0gICAgICogVGhlIExpc3Qgc3VwcG9ydHMgcmVtb3ZlIGFuZCBzZXQsIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGFkZC4KLSAgICAgKgotICAgICAqIEBzZWUgI3ZhbHVlcygpCi0gICAgICogQHJldHVybiB0aGUgcGFydGlhbGx5IG1vZGlmaWFibGUgbGlzdCB2aWV3IG92ZXIgdGhlIHZhbHVlcwotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHZhbHVlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXNWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IG92ZXIgdGhlIGVudHJpZXMgaW4gdGhlIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgU2V0IHdpbGwgYmUgb3JkZXJlZCBieSBvYmplY3QgaW5zZXJ0aW9uIGludG8gdGhlIG1hcC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IG1vZGlmaWFibGUgc2V0IHZpZXcgb3ZlciB0aGUgZW50cmllcwotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRWaWV3KHRoaXMsIHRoaXMuaW5zZXJ0T3JkZXIpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNYXAgYXMgYSBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgTWFwIGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuICJ7fSI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmLmFwcGVuZCgneycpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChrZXkgPT0gdGhpcyA/ICIodGhpcyBNYXApIiA6IGtleSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHZhbHVlID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGtleSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB0aGUga2V5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGluc2VydE9yZGVyLmdldChpbmRleCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXQoaW5zZXJ0T3JkZXIuZ2V0KGluZGV4KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZmluZCB0aGUgaW5kZXggb2YKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCwgb3IgLTEgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGluc2VydE9yZGVyLmluZGV4T2Yoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggb2YgdGhlIHZhbHVlIHRvIHNldAotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIGF0IHRoYXQgaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBpbnNlcnRPcmRlci5nZXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gcHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1dHMgYSBrZXktdmFsdWUgbWFwcGluZyBpbnRvIHRoZSBtYXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWFwIGFscmVhZHkgY29udGFpbnMgdGhlIGtleSwgdGhlbiB0aGUgb3JpZ2luYWwgbWFwcGluZwotICAgICAqIGlzIHJlbW92ZWQgYW5kIHRoZSBuZXcgbWFwcGluZyBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqIFRoZSByZW1vdmUgbWF5IGNoYW5nZSB0aGUgZWZmZWN0IG9mIHRoZSBpbmRleC4gVGhlIGluZGV4IGlzCi0gICAgICogYWx3YXlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGh1cyB0aGUgc3RlcHMgYXJlOiAoMSkgcmVtb3ZlIHRoZSBleGlzdGluZyBrZXktdmFsdWUgbWFwcGluZywKLSAgICAgKiB0aGVuICgyKSBpbnNlcnQgdGhlIG5ldyBrZXktdmFsdWUgbWFwcGluZyBhdCB0aGUgcG9zaXRpb24gaXQKLSAgICAgKiB3b3VsZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaGFkIHRoZSByZW1vdmUgbm90IG9jdXJyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgbWFwcGluZyBzaG91bGQgYmUgaW5zZXJ0ZWQKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBwcmV2aW91c2x5IG1hcHBlZCB0byB0aGUga2V5Ci0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChpbnQgaW5kZXgsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBNYXAgbSA9IGdldE1hcCgpOwotICAgICAgICBpZiAobS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIGludCBwb3MgPSBpbnNlcnRPcmRlci5pbmRleE9mKGtleSk7Ci0gICAgICAgICAgICBpbnNlcnRPcmRlci5yZW1vdmUocG9zKTsKLSAgICAgICAgICAgIGlmIChwb3MgPCBpbmRleCkgewotICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRPcmRlci5hZGQoaW5kZXgsIGtleSk7Ci0gICAgICAgICAgICBtLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnNlcnRPcmRlci5hZGQoaW5kZXgsIGtleSk7Ci0gICAgICAgICAgICBtLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4ICB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0ZWQKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHJlbW92ZShnZXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHVubW9kaWZpYWJsZSBMaXN0IHZpZXcgb2YgdGhlIGtleXMgd2hpY2ggY2hhbmdlcyBhcyB0aGUgbWFwIGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlIGJlY2F1c2UgY2hhbmdlcyB0byB0aGUgdmFsdWVzIG9mCi0gICAgICogdGhlIGxpc3QgKHVzaW5nIHtAbGluayBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI3NldChPYmplY3QpfSkgd2lsbAotICAgICAqIGVmZmVjdGl2ZWx5IHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgbGlzdCBhbmQgcmVpbnNlcnQgdGhhdCB2YWx1ZSBhdAotICAgICAqIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHdoaWNoIGlzIGFuIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcgdGhlCi0gICAgICogdmFsdWUgb2YgYSBsaXN0LiAgVGhpcyBvY2N1cnMgYmVjYXVzZSBjaGFuZ2luZyB0aGUga2V5LCBjaGFuZ2VzIHdoZW4gdGhlCi0gICAgICogbWFwcGluZyBpcyBhZGRlZCB0byB0aGUgbWFwIGFuZCB0aHVzIHdoZXJlIGl0IGFwcGVhcnMgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBtZXRob2QgaXMgdG8gdXNlIHRoZSBiZXR0ZXIgbmFtZWQKLSAgICAgKiB7QGxpbmsgI2tleUxpc3QoKX0gb3Ige0BsaW5rICNrZXlTZXQoKX0uCi0gICAgICoKLSAgICAgKiBAc2VlICNrZXlMaXN0KCkKLSAgICAgKiBAc2VlICNrZXlTZXQoKQotICAgICAqIEByZXR1cm4gVGhlIG9yZGVyZWQgbGlzdCBvZiBrZXlzLiAgCi0gICAgICovCi0gICAgcHVibGljIExpc3QgYXNMaXN0KCkgewotICAgICAgICByZXR1cm4ga2V5TGlzdCgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBzdGF0aWMgY2xhc3MgVmFsdWVzVmlldyBleHRlbmRzIEFic3RyYWN0TGlzdCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdE9yZGVyZWRNYXAgcGFyZW50OwotCi0gICAgICAgIFZhbHVlc1ZpZXcoTGlzdE9yZGVyZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHRoaXMucGFyZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0SXRlcmF0b3JEZWNvcmF0b3IocGFyZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKSkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldFZhbHVlKGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2V0VmFsdWUoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnJlbW92ZShpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgc3RhdGljIGNsYXNzIEtleVNldFZpZXcgZXh0ZW5kcyBBYnN0cmFjdFNldCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdE9yZGVyZWRNYXAgcGFyZW50OwotCi0gICAgICAgIEtleVNldFZpZXcoTGlzdE9yZGVyZWRNYXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY29udGFpbnNLZXkodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudC5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yKHBhcmVudC5lbnRyeVNldCgpLml0ZXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKE1hcC5FbnRyeSkgc3VwZXIubmV4dCgpKS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgRW50cnlTZXRWaWV3IGV4dGVuZHMgQWJzdHJhY3RTZXQgewotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3RPcmRlcmVkTWFwIHBhcmVudDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGluc2VydE9yZGVyOwotICAgICAgICBwcml2YXRlIFNldCBlbnRyeVNldDsKLQotICAgICAgICBwdWJsaWMgRW50cnlTZXRWaWV3KExpc3RPcmRlcmVkTWFwIHBhcmVudCwgTGlzdCBpbnNlcnRPcmRlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICAgICAgdGhpcy5pbnNlcnRPcmRlciA9IGluc2VydE9yZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXQgZ2V0RW50cnlTZXQoKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnlTZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudHJ5U2V0ID0gcGFyZW50LmdldE1hcCgpLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW50cnlTZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RW50cnlTZXQoKS5jb250YWlucyhvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RW50cnlTZXQoKS5jb250YWluc0FsbChjb2xsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwLkVudHJ5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdldEVudHJ5U2V0KCkuY29udGFpbnMob2JqKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSAoKE1hcC5FbnRyeSkgb2JqKS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHRoaXMucGFyZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRFbnRyeVNldCgpLmVxdWFscyhvYmopOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEVudHJ5U2V0KCkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RW50cnlTZXQoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpc3RPcmRlcmVkSXRlcmF0b3IocGFyZW50LCBpbnNlcnRPcmRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHN0YXRpYyBjbGFzcyBMaXN0T3JkZXJlZEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvckRlY29yYXRvciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdE9yZGVyZWRNYXAgcGFyZW50OwotICAgICAgICBwcml2YXRlIE9iamVjdCBsYXN0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIExpc3RPcmRlcmVkSXRlcmF0b3IoTGlzdE9yZGVyZWRNYXAgcGFyZW50LCBMaXN0IGluc2VydE9yZGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihpbnNlcnRPcmRlci5pdGVyYXRvcigpKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gc3VwZXIubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0T3JkZXJlZE1hcEVudHJ5KHBhcmVudCwgbGFzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBzdXBlci5yZW1vdmUoKTsKLSAgICAgICAgICAgIHBhcmVudC5nZXRNYXAoKS5yZW1vdmUobGFzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHN0YXRpYyBjbGFzcyBMaXN0T3JkZXJlZE1hcEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RNYXBFbnRyeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdE9yZGVyZWRNYXAgcGFyZW50OwotICAgICAgICAKLSAgICAgICAgTGlzdE9yZGVyZWRNYXBFbnRyeShMaXN0T3JkZXJlZE1hcCBwYXJlbnQsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHN1cGVyKGtleSwgbnVsbCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRNYXAoKS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgc3RhdGljIGNsYXNzIExpc3RPcmRlcmVkTWFwSXRlcmF0b3IgaW1wbGVtZW50cyBPcmRlcmVkTWFwSXRlcmF0b3IsIFJlc2V0dGFibGVJdGVyYXRvciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdE9yZGVyZWRNYXAgcGFyZW50OwotICAgICAgICBwcml2YXRlIExpc3RJdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbGFzdCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWFkYWJsZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgTGlzdE9yZGVyZWRNYXBJdGVyYXRvcihMaXN0T3JkZXJlZE1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBwYXJlbnQuaW5zZXJ0T3JkZXIubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcmVhZGFibGUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gaXRlcmF0b3IucHJldmlvdXMoKTsKLSAgICAgICAgICAgIHJlYWRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAocmVhZGFibGUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEFic3RyYWN0SGFzaGVkTWFwLlJFTU9WRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgcGFyZW50Lm1hcC5yZW1vdmUobGFzdCk7Ci0gICAgICAgICAgICByZWFkYWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIGlmIChyZWFkYWJsZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuR0VUS0VZX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgaWYgKHJlYWRhYmxlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5HRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0KGxhc3QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKHJlYWRhYmxlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5TRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQubWFwLnB1dChsYXN0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgaXRlcmF0b3IgPSBwYXJlbnQuaW5zZXJ0T3JkZXIubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgICAgIHJlYWRhYmxlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBpZiAocmVhZGFibGUgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiSXRlcmF0b3JbIiArIGdldEtleSgpICsgIj0iICsgZ2V0VmFsdWUoKSArICJdIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJdGVyYXRvcltdIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlLZXlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlLZXlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjllMmU3My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpS2V5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5JdGVyYWJsZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmtleXZhbHVlLk11bHRpS2V5OwotCi0vKioKLSAqIEEgPGNvZGU+TWFwPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbXVsdGlwbGUga2V5cyB0byBtYXAgdGhlIHZhbHVlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gdXNlcyBtdWx0aXBsZSBrZXlzIHRvIG1hcCB0byBhIHZhbHVlLgotICogVGhlIGJlc3Qgd2F5IHRvIHVzZSB0aGlzIGNsYXNzIGlzIHZpYSB0aGUgYWRkaXRpb25hbCBtYXAtc3R5bGUgbWV0aG9kcy4KLSAqIFRoZXNlIHByb3ZpZGUgPGNvZGU+Z2V0PC9jb2RlPiwgPGNvZGU+Y29udGFpbnNLZXk8L2NvZGU+LCA8Y29kZT5wdXQ8L2NvZGU+IGFuZAotICogPGNvZGU+cmVtb3ZlPC9jb2RlPiBmb3IgaW5kaXZpZHVhbCBrZXlzIHdoaWNoIG9wZXJhdGUgd2l0aG91dCBleHRyYSBvYmplY3QgY3JlYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBhZGRpdGlvbmFsIG1ldGhvZHMgYXJlIHRoZSBtYWluIGludGVyZmFjZSBvZiB0aGlzIG1hcC4KLSAqIEFzIHN1Y2gsIHlvdSB3aWxsIG5vdCBub3JtYWxseSBob2xkIHRoaXMgbWFwIGluIGEgdmFyaWFibGUgb2YgdHlwZSA8Y29kZT5NYXA8L2NvZGU+LgotICogPHA+Ci0gKiBUaGUgbm9ybWFsIG1hcCBtZXRob2RzIHRha2UgaW4gYW5kIHJldHVybiBhIHtAbGluayBNdWx0aUtleX0uCi0gKiBJZiB5b3UgdHJ5IHRvIHVzZSA8Y29kZT5wdXQoKTwvY29kZT4gd2l0aCBhbnkgb3RoZXIgb2JqZWN0IHR5cGUgYQotICogPGNvZGU+Q2xhc3NDYXN0RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uIElmIHlvdSB0cnkgdG8gdXNlIDxjb2RlPm51bGw8L2NvZGU+IGFzCi0gKiB0aGUga2V5IGluIDxjb2RlPnB1dCgpPC9jb2RlPiBhIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCi0gKiA8cD4KLSAqIFRoaXMgbWFwIGlzIGltcGxlbWVudGVkIGFzIGEgZGVjb3JhdG9yIG9mIGEgPGNvZGU+QWJzdHJhY3RIYXNoZWRNYXA8L2NvZGU+IHdoaWNoCi0gKiBlbmFibGVzIGV4dHJhIGJlaGF2aW91ciB0byBiZSBhZGRlZCBlYXNpbHkuCi0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+TXVsdGlLZXlNYXAuZGVjb3JhdGUobmV3IExpbmtlZE1hcCgpKTwvY29kZT4gY3JlYXRlcyBhbiBvcmRlcmVkIG1hcC4KLSAqIDxsaT48Y29kZT5NdWx0aUtleU1hcC5kZWNvcmF0ZShuZXcgTFJVTWFwKCkpPC9jb2RlPiBjcmVhdGVzIGFuIGxlYXN0IHJlY2VudGx5IHVzZWQgbWFwLgotICogPGxpPjxjb2RlPk11bHRpS2V5TWFwLmRlY29yYXRlKG5ldyBSZWZlcmVuY2VNYXAoKSk8L2NvZGU+IGNyZWF0ZXMgYSBnYXJiYWdlIGNvbGxlY3RvciBzZW5zaXRpdmUgbWFwLgotICogPC91bD4KLSAqIE5vdGUgdGhhdCA8Y29kZT5JZGVudGl0eU1hcDwvY29kZT4gYW5kIDxjb2RlPlJlZmVyZW5jZUlkZW50aXR5TWFwPC9jb2RlPiBhcmUgdW5zdWl0YWJsZQotICogZm9yIHVzZSBhcyB0aGUga2V5IGNvbXBhcmlzb24gd291bGQgd29yayBvbiB0aGUgd2hvbGUgTXVsdGlLZXksIG5vdCB0aGUgZWxlbWVudHMgd2l0aGluLgotICogPHA+Ci0gKiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciBhIGxlYXN0IHJlY2VudGx5IHVzZWQgY2FjaGUgdGhhdCB1c2VzIGEgU3RyaW5nIGFpcmxpbmUgY29kZQotICogYW5kIGEgTG9jYWxlIHRvIGxvb2t1cCB0aGUgYWlybGluZSdzIG5hbWU6Ci0gKiA8cHJlPgotICogcHJpdmF0ZSBNdWx0aUtleU1hcCBjYWNoZSA9IE11bHRpS2V5TWFwLmRlY29yYXRlKG5ldyBMUlVNYXAoNTApKTsKLSAqIAotICogcHVibGljIFN0cmluZyBnZXRBaXJsaW5lTmFtZShTdHJpbmcgY29kZSwgU3RyaW5nIGxvY2FsZSkgewotICogICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGNhY2hlLmdldChjb2RlLCBsb2NhbGUpOwotICogICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gKiAgICAgbmFtZSA9IGdldEFpcmxpbmVOYW1lRnJvbURCKGNvZGUsIGxvY2FsZSk7Ci0gKiAgICAgY2FjaGUucHV0KGNvZGUsIGxvY2FsZSwgbmFtZSk7Ci0gKiAgIH0KLSAqICAgcmV0dXJuIG5hbWU7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgTXVsdGlLZXlNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGlzIGNsYXNzIG1heSB0aHJvdyBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQKLSAqIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjkgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUtleU1hcAotICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhYmxlTWFwLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGlzYXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzg4MTk5MjMxMDM4NzIxMDQwTDsKLQotICAgIC8qKiBUaGUgZGVjb3JhdGVkIG1hcCAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdEhhc2hlZE1hcCBtYXA7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogRGVjb3JhdGVzIHRoZSBzcGVjaWZpZWQgbWFwIHRvIGFkZCB0aGUgTXVsdGlLZXlNYXAgQVBJIGFuZCBmYXN0IHF1ZXJ5LgotICAgICAqIFRoZSBtYXAgbXVzdCBub3QgYmUgbnVsbCBhbmQgbXVzdCBiZSBlbXB0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG5vdCBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsIG9yIG5vdCBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTXVsdGlLZXlNYXAgZGVjb3JhdGUoQWJzdHJhY3RIYXNoZWRNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWFwIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcCBtdXN0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUtleU1hcChtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBNdWx0aUtleU1hcCB0aGF0IGRlY29yYXRlcyBhIDxjb2RlPkhhc2hlZE1hcDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE11bHRpS2V5TWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtYXAgPSBuZXcgSGFzaGVkTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBkZWNvcmF0ZXMgdGhlIHNwZWNpZmllZCBtYXAgYW5kIGlzIGNhbGxlZCBmcm9tCi0gICAgICoge0BsaW5rICNkZWNvcmF0ZShBYnN0cmFjdEhhc2hlZE1hcCl9LgotICAgICAqIFRoZSBtYXAgbXVzdCBub3QgYmUgbnVsbCBhbmQgc2hvdWxkIGJlIGVtcHR5IG9yIG9ubHkgY29udGFpbiB2YWxpZCBrZXlzLgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgcGVyZm9ybXMgbm8gdmFsaWRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTXVsdGlLZXlNYXAoQWJzdHJhY3RIYXNoZWRNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFwID0gbWFwOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUsIG51bGwgaWYgbm8gbWF0Y2gKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKV07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5MikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbXVsdGkta2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleTEsIGtleTIpOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnkgPSBtYXAuZGF0YVttYXAuaGFzaEluZGV4KGhhc2hDb2RlLCBtYXAuZGF0YS5sZW5ndGgpXTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5oYXNoQ29kZSA9PSBoYXNoQ29kZSAmJiBpc0VxdWFsS2V5KGVudHJ5LCBrZXkxLCBrZXkyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMgY29tYmluZWQga2V5LCBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleTEsIGtleTIpOwotICAgICAgICBpbnQgaW5kZXggPSBtYXAuaGFzaEluZGV4KGhhc2hDb2RlLCBtYXAuZGF0YS5sZW5ndGgpOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnkgPSBtYXAuZGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5MikpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1hcC51cGRhdGVFbnRyeShlbnRyeSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWFwLmFkZE1hcHBpbmcoaW5kZXgsIGhhc2hDb2RlLCBuZXcgTXVsdGlLZXkoa2V5MSwga2V5MiksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleSBmcm9tIHRoaXMgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoZSByZW1vdmVkIGtleSwgbnVsbCBpZiBrZXkgbm90IGluIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleTEsIGtleTIpOwotICAgICAgICBpbnQgaW5kZXggPSBtYXAuaGFzaEluZGV4KGhhc2hDb2RlLCBtYXAuZGF0YS5sZW5ndGgpOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnkgPSBtYXAuZGF0YVtpbmRleF07Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBwcmV2aW91cyA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5MikpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1hcC5yZW1vdmVNYXBwaW5nKGVudHJ5LCBpbmRleCwgcHJldmlvdXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaGFzaCBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLSAgICAgICAgaW50IGggPSAwOwotICAgICAgICBpZiAoa2V5MSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoIF49IGtleTEuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2V5MiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoIF49IGtleTIuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBoICs9IH4oaCA8PCA5KTsKLSAgICAgICAgaCBePSAgKGggPj4+IDE0KTsKLSAgICAgICAgaCArPSAgKGggPDwgNCk7Ci0gICAgICAgIGggXj0gIChoID4+PiAxMCk7Ci0gICAgICAgIHJldHVybiBoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoZSBrZXkgZXF1YWwgdG8gdGhlIGNvbWJpbmVkIGtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnkgIHRoZSBlbnRyeSB0byBjb21wYXJlIHRvCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBtYXRjaGVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbEtleShBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnksIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotICAgICAgICBNdWx0aUtleSBtdWx0aSA9IChNdWx0aUtleSkgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgbXVsdGkuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgICAgIChrZXkxID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMCkgPT0gbnVsbCA6IGtleTEuZXF1YWxzKG11bHRpLmdldEtleSgwKSkpICYmCi0gICAgICAgICAgICAoa2V5MiA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDEpID09IG51bGwgOiBrZXkyLmVxdWFscyhtdWx0aS5nZXRLZXkoMSkpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQgbXVsdGkta2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHBhcmFtIGtleTMgIHRoZSB0aGlyZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUsIG51bGwgaWYgbm8gbWF0Y2gKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzKSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5MSwga2V5Miwga2V5Myk7Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBlbnRyeSA9IG1hcC5kYXRhW21hcC5oYXNoSW5kZXgoaGFzaENvZGUsIG1hcC5kYXRhLmxlbmd0aCldOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyLCBrZXkzKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKV07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5Miwga2V5MykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgbXVsdGkta2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHBhcmFtIGtleTMgIHRoZSB0aGlyZCBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMgY29tYmluZWQga2V5LCBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyLCBrZXkzKTsKLSAgICAgICAgaW50IGluZGV4ID0gbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbaW5kZXhdOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBtYXAudXBkYXRlRW50cnkoZW50cnksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1hcC5hZGRNYXBwaW5nKGluZGV4LCBoYXNoQ29kZSwgbmV3IE11bHRpS2V5KGtleTEsIGtleTIsIGtleTMpLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkgZnJvbSB0aGlzIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgbWFwcGVkIHRvIHRoZSByZW1vdmVkIGtleSwgbnVsbCBpZiBrZXkgbm90IGluIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyLCBrZXkzKTsKLSAgICAgICAgaW50IGluZGV4ID0gbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbaW5kZXhdOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgcHJldmlvdXMgPSBudWxsOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTWFwcGluZyhlbnRyeSwgaW5kZXgsIHByZXZpb3VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2aW91cyA9IGVudHJ5OwotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzKSB7Ci0gICAgICAgIGludCBoID0gMDsKLSAgICAgICAgaWYgKGtleTEgIT0gbnVsbCkgewotICAgICAgICAgICAgaCBePSBrZXkxLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleTIgIT0gbnVsbCkgewotICAgICAgICAgICAgaCBePSBrZXkyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleTMgIT0gbnVsbCkgewotICAgICAgICAgICAgaCBePSBrZXkzLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaCArPSB+KGggPDwgOSk7Ci0gICAgICAgIGggXj0gIChoID4+PiAxNCk7Ci0gICAgICAgIGggKz0gIChoIDw8IDQpOwotICAgICAgICBoIF49ICAoaCA+Pj4gMTApOwotICAgICAgICByZXR1cm4gaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGUga2V5IGVxdWFsIHRvIHRoZSBjb21iaW5lZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5ICB0aGUgZW50cnkgdG8gY29tcGFyZSB0bwotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHBhcmFtIGtleTMgIHRoZSB0aGlyZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBtYXRjaGVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbEtleShBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnksIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMpIHsKLSAgICAgICAgTXVsdGlLZXkgbXVsdGkgPSAoTXVsdGlLZXkpIGVudHJ5LmdldEtleSgpOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIG11bHRpLnNpemUoKSA9PSAzICYmCi0gICAgICAgICAgICAoa2V5MSA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDApID09IG51bGwgOiBrZXkxLmVxdWFscyhtdWx0aS5nZXRLZXkoMCkpKSAmJgotICAgICAgICAgICAgKGtleTIgPT0gbnVsbCA/IG11bHRpLmdldEtleSgxKSA9PSBudWxsIDoga2V5Mi5lcXVhbHMobXVsdGkuZ2V0S2V5KDEpKSkgJiYKLSAgICAgICAgICAgIChrZXkzID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMikgPT0gbnVsbCA6IGtleTMuZXF1YWxzKG11bHRpLmdldEtleSgyKSkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEBwYXJhbSBrZXk0ICB0aGUgZm91cnRoIGtleQotICAgICAqIEByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSwgbnVsbCBpZiBubyBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMsIE9iamVjdCBrZXk0KSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5MSwga2V5Miwga2V5Mywga2V5NCk7Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBlbnRyeSA9IG1hcC5kYXRhW21hcC5oYXNoSW5kZXgoaGFzaENvZGUsIG1hcC5kYXRhLmxlbmd0aCldOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIGtleQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMsIE9iamVjdCBrZXk0KSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5MSwga2V5Miwga2V5Mywga2V5NCk7Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBlbnRyeSA9IG1hcC5kYXRhW21hcC5oYXNoSW5kZXgoaGFzaENvZGUsIG1hcC5kYXRhLmxlbmd0aCldOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc3RvcmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBwcmV2aW91c2x5IG1hcHBlZCB0byB0aGlzIGNvbWJpbmVkIGtleSwgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleTEsIGtleTIsIGtleTMsIGtleTQpOwotICAgICAgICBpbnQgaW5kZXggPSBtYXAuaGFzaEluZGV4KGhhc2hDb2RlLCBtYXAuZGF0YS5sZW5ndGgpOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnkgPSBtYXAuZGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5Miwga2V5Mywga2V5NCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1hcC51cGRhdGVFbnRyeShlbnRyeSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWFwLmFkZE1hcHBpbmcoaW5kZXgsIGhhc2hDb2RlLCBuZXcgTXVsdGlLZXkoa2V5MSwga2V5Miwga2V5Mywga2V5NCksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleSBmcm9tIHRoaXMgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHBhcmFtIGtleTMgIHRoZSB0aGlyZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5NCAgdGhlIGZvdXJ0aCBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHJlbW92ZWQga2V5LCBudWxsIGlmIGtleSBub3QgaW4gbWFwCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyLCBrZXkzLCBrZXk0KTsKLSAgICAgICAgaW50IGluZGV4ID0gbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbaW5kZXhdOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgcHJldmlvdXMgPSBudWxsOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTWFwcGluZyhlbnRyeSwgaW5kZXgsIHByZXZpb3VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2aW91cyA9IGVudHJ5OwotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEBwYXJhbSBrZXk0ICB0aGUgZm91cnRoIGtleQotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzLCBPYmplY3Qga2V5NCkgewotICAgICAgICBpbnQgaCA9IDA7Ci0gICAgICAgIGlmIChrZXkxICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5MS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5Mi5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5My5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXk0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5NC5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGggKz0gfihoIDw8IDkpOwotICAgICAgICBoIF49ICAoaCA+Pj4gMTQpOwotICAgICAgICBoICs9ICAoaCA8PCA0KTsKLSAgICAgICAgaCBePSAgKGggPj4+IDEwKTsKLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhlIGtleSBlcXVhbCB0byB0aGUgY29tYmluZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBrZXkgbWF0Y2hlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxLZXkoQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5LCBPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzLCBPYmplY3Qga2V5NCkgewotICAgICAgICBNdWx0aUtleSBtdWx0aSA9IChNdWx0aUtleSkgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgbXVsdGkuc2l6ZSgpID09IDQgJiYKLSAgICAgICAgICAgIChrZXkxID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMCkgPT0gbnVsbCA6IGtleTEuZXF1YWxzKG11bHRpLmdldEtleSgwKSkpICYmCi0gICAgICAgICAgICAoa2V5MiA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDEpID09IG51bGwgOiBrZXkyLmVxdWFscyhtdWx0aS5nZXRLZXkoMSkpKSAmJgotICAgICAgICAgICAgKGtleTMgPT0gbnVsbCA/IG11bHRpLmdldEtleSgyKSA9PSBudWxsIDoga2V5My5lcXVhbHMobXVsdGkuZ2V0S2V5KDIpKSkgJiYKLSAgICAgICAgICAgIChrZXk0ID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMykgPT0gbnVsbCA6IGtleTQuZXF1YWxzKG11bHRpLmdldEtleSgzKSkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEBwYXJhbSBrZXk0ICB0aGUgZm91cnRoIGtleQotICAgICAqIEBwYXJhbSBrZXk1ICB0aGUgZmlmdGgga2V5Ci0gICAgICogQHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLCBudWxsIGlmIG5vIG1hdGNoCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQsIE9iamVjdCBrZXk1KSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5MSwga2V5Miwga2V5Mywga2V5NCwga2V5NSk7Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBlbnRyeSA9IG1hcC5kYXRhW21hcC5oYXNoSW5kZXgoaGFzaENvZGUsIG1hcC5kYXRhLmxlbmd0aCldOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQsIGtleTUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHBhcmFtIGtleTUgIHRoZSBmaWZ0aCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQsIE9iamVjdCBrZXk1KSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IGhhc2goa2V5MSwga2V5Miwga2V5Mywga2V5NCwga2V5NSk7Ci0gICAgICAgIEFic3RyYWN0SGFzaGVkTWFwLkhhc2hFbnRyeSBlbnRyeSA9IG1hcC5kYXRhW21hcC5oYXNoSW5kZXgoaGFzaENvZGUsIG1hcC5kYXRhLmxlbmd0aCldOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQsIGtleTUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIG11bHRpLWtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHBhcmFtIGtleTUgIHRoZSBmaWZ0aCBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzdG9yZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMgY29tYmluZWQga2V5LCBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzLCBPYmplY3Qga2V5NCwgT2JqZWN0IGtleTUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBoYXNoKGtleTEsIGtleTIsIGtleTMsIGtleTQsIGtleTUpOwotICAgICAgICBpbnQgaW5kZXggPSBtYXAuaGFzaEluZGV4KGhhc2hDb2RlLCBtYXAuZGF0YS5sZW5ndGgpOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnkgPSBtYXAuZGF0YVtpbmRleF07Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaGFzaENvZGUgPT0gaGFzaENvZGUgJiYgaXNFcXVhbEtleShlbnRyeSwga2V5MSwga2V5Miwga2V5Mywga2V5NCwga2V5NSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1hcC51cGRhdGVFbnRyeShlbnRyeSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWFwLmFkZE1hcHBpbmcoaW5kZXgsIGhhc2hDb2RlLCBuZXcgTXVsdGlLZXkoa2V5MSwga2V5Miwga2V5Mywga2V5NCwga2V5NSksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG11bHRpLWtleSBmcm9tIHRoaXMgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkxICB0aGUgZmlyc3Qga2V5Ci0gICAgICogQHBhcmFtIGtleTIgIHRoZSBzZWNvbmQga2V5Ci0gICAgICogQHBhcmFtIGtleTMgIHRoZSB0aGlyZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5NCAgdGhlIGZvdXJ0aCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5NSAgdGhlIGZpZnRoIGtleQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUgcmVtb3ZlZCBrZXksIG51bGwgaWYga2V5IG5vdCBpbiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIsIE9iamVjdCBrZXkzLCBPYmplY3Qga2V5NCwgT2JqZWN0IGtleTUpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gaGFzaChrZXkxLCBrZXkyLCBrZXkzLCBrZXk0LCBrZXk1KTsKLSAgICAgICAgaW50IGluZGV4ID0gbWFwLmhhc2hJbmRleChoYXNoQ29kZSwgbWFwLmRhdGEubGVuZ3RoKTsKLSAgICAgICAgQWJzdHJhY3RIYXNoZWRNYXAuSGFzaEVudHJ5IGVudHJ5ID0gbWFwLmRhdGFbaW5kZXhdOwotICAgICAgICBBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgcHJldmlvdXMgPSBudWxsOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVudHJ5Lmhhc2hDb2RlID09IGhhc2hDb2RlICYmIGlzRXF1YWxLZXkoZW50cnksIGtleTEsIGtleTIsIGtleTMsIGtleTQsIGtleTUpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTWFwcGluZyhlbnRyeSwgaW5kZXgsIHByZXZpb3VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2aW91cyA9IGVudHJ5OwotICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIHNwZWNpZmllZCBtdWx0aS1rZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEBwYXJhbSBrZXk0ICB0aGUgZm91cnRoIGtleQotICAgICAqIEBwYXJhbSBrZXk1ICB0aGUgZmlmdGgga2V5Ci0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBoYXNoKE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMsIE9iamVjdCBrZXk0LCBPYmplY3Qga2V5NSkgewotICAgICAgICBpbnQgaCA9IDA7Ci0gICAgICAgIGlmIChrZXkxICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5MS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5Mi5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5My5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXk0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5NC5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXk1ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGggXj0ga2V5NS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGggKz0gfihoIDw8IDkpOwotICAgICAgICBoIF49ICAoaCA+Pj4gMTQpOwotICAgICAgICBoICs9ICAoaCA8PCA0KTsKLSAgICAgICAgaCBePSAgKGggPj4+IDEwKTsKLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhlIGtleSBlcXVhbCB0byB0aGUgY29tYmluZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeSAgdGhlIGVudHJ5IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHBhcmFtIGtleTUgIHRoZSBmaWZ0aCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBtYXRjaGVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbEtleShBYnN0cmFjdEhhc2hlZE1hcC5IYXNoRW50cnkgZW50cnksIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMsIE9iamVjdCBrZXk0LCBPYmplY3Qga2V5NSkgewotICAgICAgICBNdWx0aUtleSBtdWx0aSA9IChNdWx0aUtleSkgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgbXVsdGkuc2l6ZSgpID09IDUgJiYKLSAgICAgICAgICAgIChrZXkxID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMCkgPT0gbnVsbCA6IGtleTEuZXF1YWxzKG11bHRpLmdldEtleSgwKSkpICYmCi0gICAgICAgICAgICAoa2V5MiA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDEpID09IG51bGwgOiBrZXkyLmVxdWFscyhtdWx0aS5nZXRLZXkoMSkpKSAmJgotICAgICAgICAgICAgKGtleTMgPT0gbnVsbCA/IG11bHRpLmdldEtleSgyKSA9PSBudWxsIDoga2V5My5lcXVhbHMobXVsdGkuZ2V0S2V5KDIpKSkgJiYKLSAgICAgICAgICAgIChrZXk0ID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMykgPT0gbnVsbCA6IGtleTQuZXF1YWxzKG11bHRpLmdldEtleSgzKSkpICYmCi0gICAgICAgICAgICAoa2V5NSA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDQpID09IG51bGwgOiBrZXk1LmVxdWFscyhtdWx0aS5nZXRLZXkoNCkpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3Mgd2hlcmUgdGhlIGZpcnN0IGtleSBpcyB0aGF0IHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCB0aGUgbWFwcGluZ3Mgd2hlcmUgdGhlIDxjb2RlPk11bHRpS2V5PC9jb2RlPgotICAgICAqIGhhcyBvbmUgb3IgbW9yZSBrZXlzLCBhbmQgdGhlIGZpcnN0IG1hdGNoZXMgdGhhdCBzcGVjaWZpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IGVsZW1lbnRzIHdlcmUgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChPYmplY3Qga2V5MSkgewotICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgIE1hcEl0ZXJhdG9yIGl0ID0gbWFwSXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgTXVsdGlLZXkgbXVsdGkgPSAoTXVsdGlLZXkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChtdWx0aS5zaXplKCkgPj0gMSAmJgotICAgICAgICAgICAgICAgIChrZXkxID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMCkgPT0gbnVsbCA6IGtleTEuZXF1YWxzKG11bHRpLmdldEtleSgwKSkpKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RpZmllZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyB3aGVyZSB0aGUgZmlyc3QgdHdvIGtleXMgYXJlIHRob3NlIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCB0aGUgbWFwcGluZ3Mgd2hlcmUgdGhlIDxjb2RlPk11bHRpS2V5PC9jb2RlPgotICAgICAqIGhhcyB0d28gb3IgbW9yZSBrZXlzLCBhbmQgdGhlIGZpcnN0IHR3byBtYXRjaCB0aG9zZSBzcGVjaWZpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IGVsZW1lbnRzIHdlcmUgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICBNYXBJdGVyYXRvciBpdCA9IG1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE11bHRpS2V5IG11bHRpID0gKE11bHRpS2V5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobXVsdGkuc2l6ZSgpID49IDIgJiYKLSAgICAgICAgICAgICAgICAoa2V5MSA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDApID09IG51bGwgOiBrZXkxLmVxdWFscyhtdWx0aS5nZXRLZXkoMCkpKSAmJgotICAgICAgICAgICAgICAgIChrZXkyID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMSkgPT0gbnVsbCA6IGtleTIuZXF1YWxzKG11bHRpLmdldEtleSgxKSkpKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RpZmllZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyB3aGVyZSB0aGUgZmlyc3QgdGhyZWUga2V5cyBhcmUgdGhvc2Ugc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIHRoZSBtYXBwaW5ncyB3aGVyZSB0aGUgPGNvZGU+TXVsdGlLZXk8L2NvZGU+Ci0gICAgICogaGFzIHRocmVlIG9yIG1vcmUga2V5cywgYW5kIHRoZSBmaXJzdCB0aHJlZSBtYXRjaCB0aG9zZSBzcGVjaWZpZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleTEgIHRoZSBmaXJzdCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkKLSAgICAgKiBAcGFyYW0ga2V5MyAgdGhlIHRoaXJkIGtleQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgZWxlbWVudHMgd2VyZSByZW1vdmVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMpIHsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICBNYXBJdGVyYXRvciBpdCA9IG1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE11bHRpS2V5IG11bHRpID0gKE11bHRpS2V5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobXVsdGkuc2l6ZSgpID49IDMgJiYKLSAgICAgICAgICAgICAgICAoa2V5MSA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDApID09IG51bGwgOiBrZXkxLmVxdWFscyhtdWx0aS5nZXRLZXkoMCkpKSAmJgotICAgICAgICAgICAgICAgIChrZXkyID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMSkgPT0gbnVsbCA6IGtleTIuZXF1YWxzKG11bHRpLmdldEtleSgxKSkpICYmCi0gICAgICAgICAgICAgICAgKGtleTMgPT0gbnVsbCA/IG11bHRpLmdldEtleSgyKSA9PSBudWxsIDoga2V5My5lcXVhbHMobXVsdGkuZ2V0S2V5KDIpKSkpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGlmaWVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIHdoZXJlIHRoZSBmaXJzdCBmb3VyIGtleXMgYXJlIHRob3NlIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCB0aGUgbWFwcGluZ3Mgd2hlcmUgdGhlIDxjb2RlPk11bHRpS2V5PC9jb2RlPgotICAgICAqIGhhcyBmb3VyIG9yIG1vcmUga2V5cywgYW5kIHRoZSBmaXJzdCBmb3VyIG1hdGNoIHRob3NlIHNwZWNpZmllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleQotICAgICAqIEBwYXJhbSBrZXkyICB0aGUgc2Vjb25kIGtleQotICAgICAqIEBwYXJhbSBrZXkzICB0aGUgdGhpcmQga2V5Ci0gICAgICogQHBhcmFtIGtleTQgIHRoZSBmb3VydGgga2V5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIGFueSBlbGVtZW50cyB3ZXJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MywgT2JqZWN0IGtleTQpIHsKLSAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICBNYXBJdGVyYXRvciBpdCA9IG1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE11bHRpS2V5IG11bHRpID0gKE11bHRpS2V5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobXVsdGkuc2l6ZSgpID49IDQgJiYKLSAgICAgICAgICAgICAgICAoa2V5MSA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDApID09IG51bGwgOiBrZXkxLmVxdWFscyhtdWx0aS5nZXRLZXkoMCkpKSAmJgotICAgICAgICAgICAgICAgIChrZXkyID09IG51bGwgPyBtdWx0aS5nZXRLZXkoMSkgPT0gbnVsbCA6IGtleTIuZXF1YWxzKG11bHRpLmdldEtleSgxKSkpICYmCi0gICAgICAgICAgICAgICAgKGtleTMgPT0gbnVsbCA/IG11bHRpLmdldEtleSgyKSA9PSBudWxsIDoga2V5My5lcXVhbHMobXVsdGkuZ2V0S2V5KDIpKSkgJiYKLSAgICAgICAgICAgICAgICAoa2V5NCA9PSBudWxsID8gbXVsdGkuZ2V0S2V5KDMpID09IG51bGwgOiBrZXk0LmVxdWFscyhtdWx0aS5nZXRLZXkoMykpKSkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIGVuc3VyZSB0aGF0IGlucHV0IGtleXMgYXJlIHZhbGlkIE11bHRpS2V5IG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBjaGVjawotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIktleSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIE11bHRpS2V5ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBhIE11bHRpS2V5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9uZXMgdGhlIG1hcCB3aXRob3V0IGNsb25pbmcgdGhlIGtleXMgb3IgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpS2V5TWFwKChBYnN0cmFjdEhhc2hlZE1hcCkgbWFwLmNsb25lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1dHMgdGhlIGtleSBhbmQgdmFsdWUgaW50byB0aGUgbWFwLCB3aGVyZSB0aGUga2V5IG11c3QgYmUgYSBub24tbnVsbAotICAgICAqIE11bHRpS2V5IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUgbm9uLW51bGwgTXVsdGlLZXkgb2JqZWN0Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc3RvcmUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGtleQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBub3QgYSBNdWx0aUtleQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBjaGVja0tleShrZXkpOwotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYWxsIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCB0byB0aGlzIG1hcC4KLSAgICAgKiBFYWNoIGtleSBtdXN0IGJlIG5vbi1udWxsIGFuZCBhIE11bHRpS2V5IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwVG9Db3B5ICB0byB0aGlzIG1hcAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcFRvQ29weSBvciBhbnkga2V5IHdpdGhpbiBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgYW55IGtleSBpbiBtYXBUb0NvcHkgaXMgbm90IGEgTXVsdGlLZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcFRvQ29weSkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwVG9Db3B5LmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBjaGVja0tleShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIG1hcC5wdXRBbGwobWFwVG9Db3B5KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbWFwLm1hcEl0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbWFwLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1hcC5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG1hcC52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLmVxdWFscyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtYXAuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbWFwLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL011bHRpVmFsdWVNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDlmOTJmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvTXVsdGlWYWx1ZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRnVuY3RvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTXVsdGlNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuSXRlcmF0b3JDaGFpbjsKLQotLyoqCi0gKiBBIE11bHRpVmFsdWVNYXAgZGVjb3JhdGVzIGFub3RoZXIgbWFwLCBhbGxvd2luZyBpdCB0byBoYXZlCi0gKiBtb3JlIHRoYW4gb25lIHZhbHVlIGZvciBhIGtleS4KLSAqIDxwPgotICogQSA8Y29kZT5NdWx0aU1hcDwvY29kZT4gaXMgYSBNYXAgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgc2VtYW50aWNzLgotICogUHV0dGluZyBhIHZhbHVlIGludG8gdGhlIG1hcCB3aWxsIGFkZCB0aGUgdmFsdWUgdG8gYSBDb2xsZWN0aW9uIGF0IHRoYXQga2V5LgotICogR2V0dGluZyBhIHZhbHVlIHdpbGwgcmV0dXJuIGEgQ29sbGVjdGlvbiwgaG9sZGluZyBhbGwgdGhlIHZhbHVlcyBwdXQgdG8gdGhhdCBrZXkuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBkZWNvcmF0b3IsIGFsbG93aW5nIGFueSBNYXAgaW1wbGVtZW50YXRpb24KLSAqIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UuCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyB0aGUgdHlwZSBvZiBjb2xsZWN0aW9uIHVzZWQKLSAqIGZvciB0aGUgdmFsdWVzIHRvIGJlIGNvbnRyb2xsZWQuIEJ5IGRlZmF1bHQsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4KLSAqIGlzIHVzZWQsIGhvd2V2ZXIgYSA8Y29kZT5DbGFzczwvY29kZT4gdG8gaW5zdGFudGlhdGUgbWF5IGJlIHNwZWNpZmllZCwKLSAqIG9yIGEgZmFjdG9yeSB0aGF0IHJldHVybnMgYSA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBpbnN0YW5jZS4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgTXVsdGlWYWx1ZU1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoaXMgY2xhc3MgbWF5IHRocm93IGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZAotICogYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICoKLSAqIEBhdXRob3IgSmFtZXMgQ2FybWFuCi0gKiBAYXV0aG9yIENocmlzdG9waGVyIEJlcnJ5Ci0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAYXV0aG9yIFN0ZXZlIERvd25leQotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSnVsaWVuIEJ1cmV0Ci0gKiBAYXV0aG9yIFNlcmhpeSBZZXZ0dXNoZW5rbwotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAqLwotcHVibGljIGNsYXNzIE11bHRpVmFsdWVNYXAgZXh0ZW5kcyBBYnN0cmFjdE1hcERlY29yYXRvciBpbXBsZW1lbnRzIE11bHRpTWFwIHsKLQotICAgIC8qKiBUaGUgZmFjdG9yeSBmb3IgY3JlYXRpbmcgdmFsdWUgY29sbGVjdGlvbnMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5IGNvbGxlY3Rpb25GYWN0b3J5OwotICAgIC8qKiBUaGUgY2FjaGVkIHZhbHVlcy4gKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uIHZhbHVlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtYXAgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIG1hcCBhbmQKLSAgICAgKiBtYXBzIGtleXMgdG8gQXJyYXlMaXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gd3JhcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTXVsdGlWYWx1ZU1hcCBkZWNvcmF0ZShNYXAgbWFwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlWYWx1ZU1hcChtYXAsIG5ldyBSZWZsZWN0aW9uRmFjdG9yeShBcnJheUxpc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWFwIHdoaWNoIGRlY29yYXRlcyB0aGUgZ2l2ZW4gPGNvZGU+bWFwPC9jb2RlPiBhbmQKLSAgICAgKiBtYXBzIGtleXMgdG8gY29sbGVjdGlvbnMgb2YgdHlwZSA8Y29kZT5jb2xsZWN0aW9uQ2xhc3M8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byB3cmFwCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb25DbGFzcyAgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE11bHRpVmFsdWVNYXAgZGVjb3JhdGUoTWFwIG1hcCwgQ2xhc3MgY29sbGVjdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlWYWx1ZU1hcChtYXAsIG5ldyBSZWZsZWN0aW9uRmFjdG9yeShjb2xsZWN0aW9uQ2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWFwIHdoaWNoIGRlY29yYXRlcyB0aGUgZ2l2ZW4gPGNvZGU+bWFwPC9jb2RlPiBhbmQKLSAgICAgKiBjcmVhdGVzIHRoZSB2YWx1ZSBjb2xsZWN0aW9ucyB1c2luZyB0aGUgc3VwcGxpZWQgPGNvZGU+Y29sbGVjdGlvbkZhY3Rvcnk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZQotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uRmFjdG9yeSAgdGhlIGNvbGxlY3Rpb24gZmFjdG9yeSAobXVzdCByZXR1cm4gYSBDb2xsZWN0aW9uIG9iamVjdCkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNdWx0aVZhbHVlTWFwIGRlY29yYXRlKE1hcCBtYXAsIEZhY3RvcnkgY29sbGVjdGlvbkZhY3RvcnkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVZhbHVlTWFwKG1hcCwgY29sbGVjdGlvbkZhY3RvcnkpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgTXVsdGlWYWx1ZU1hcCBiYXNlZCBvbiBhIDxjb2RlPkhhc2hNYXA8L2NvZGU+IGFuZAotICAgICAqIHN0b3JpbmcgdGhlIG11bHRpcGxlIHZhbHVlcyBpbiBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVZhbHVlTWFwKCkgewotICAgICAgICB0aGlzKG5ldyBIYXNoTWFwKCksIG5ldyBSZWZsZWN0aW9uRmFjdG9yeShBcnJheUxpc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgTXVsdGlWYWx1ZU1hcCB3aGljaCBkZWNvcmF0ZXMgdGhlIGdpdmVuIDxjb2RlPm1hcDwvY29kZT4gYW5kCi0gICAgICogY3JlYXRlcyB0aGUgdmFsdWUgY29sbGVjdGlvbnMgdXNpbmcgdGhlIHN1cHBsaWVkIDxjb2RlPmNvbGxlY3Rpb25GYWN0b3J5PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbkZhY3RvcnkgIHRoZSBjb2xsZWN0aW9uIGZhY3Rvcnkgd2hpY2ggbXVzdCByZXR1cm4gYSBDb2xsZWN0aW9uIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE11bHRpVmFsdWVNYXAoTWFwIG1hcCwgRmFjdG9yeSBjb2xsZWN0aW9uRmFjdG9yeSkgewotICAgICAgICBzdXBlcihtYXApOwotICAgICAgICBpZiAoY29sbGVjdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29sbGVjdGlvbkZhY3RvcnkgPSBjb2xsZWN0aW9uRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgLy8gSWYgeW91IGJlbGlldmUgdGhhdCB5b3UgaGF2ZSBHQyBpc3N1ZXMgaGVyZSwgdHJ5IHVuY29tbWVudGluZyB0aGlzIGNvZGUKLS8vICAgICAgICBTZXQgcGFpcnMgPSBnZXRNYXAoKS5lbnRyeVNldCgpOwotLy8gICAgICAgIEl0ZXJhdG9yIHBhaXJzSXRlcmF0b3IgPSBwYWlycy5pdGVyYXRvcigpOwotLy8gICAgICAgIHdoaWxlIChwYWlyc0l0ZXJhdG9yLmhhc05leHQoKSkgewotLy8gICAgICAgICAgICBNYXAuRW50cnkga2V5VmFsdWVQYWlyID0gKE1hcC5FbnRyeSkgcGFpcnNJdGVyYXRvci5uZXh0KCk7Ci0vLyAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBrZXlWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLS8vICAgICAgICAgICAgY29sbC5jbGVhcigpOwotLy8gICAgICAgIH0KLSAgICAgICAgZ2V0TWFwKCkuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdmFsdWUgZnJvbSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIG1hcHBlZCB0byB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiBPdGhlciB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhhdCBrZXkgYXJlIHVuYWZmZWN0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGxhc3QgdmFsdWUgZm9yIGEga2V5IGlzIHJlbW92ZWQsIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiBmcm9tIGEgc3Vic2VxdWFudCA8Y29kZT5nZXQoa2V5KTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHJlbW92ZSBmcm9tCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZW1vdmVkICh3aGljaCB3YXMgcGFzc2VkIGluKSwgbnVsbCBpZiBub3RoaW5nIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXNGb3JLZXkgPSBnZXRDb2xsZWN0aW9uKGtleSk7Ci0gICAgICAgIGlmICh2YWx1ZXNGb3JLZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gdmFsdWVzRm9yS2V5LnJlbW92ZSh2YWx1ZSk7Ci0gICAgICAgIGlmIChyZW1vdmVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWVzRm9yS2V5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhlIHZhbHVlIHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGNoZWNrcyBhbGwgY29sbGVjdGlvbnMgYWdhaW5zdCBhbGwga2V5cyBmb3IgdGhlIHZhbHVlLCBhbmQgdGh1cyBjb3VsZCBiZSBzbG93LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFNldCBwYWlycyA9IGdldE1hcCgpLmVudHJ5U2V0KCk7Ci0gICAgICAgIGlmIChwYWlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgcGFpcnNJdGVyYXRvciA9IHBhaXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwYWlyc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGtleVZhbHVlUGFpciA9IChNYXAuRW50cnkpIHBhaXJzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gKENvbGxlY3Rpb24pIGtleVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGNvbGwuY29udGFpbnModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiA8cD4KLSAgICAgKiBVbmxpa2UgYSBub3JtYWwgPGNvZGU+TWFwPC9jb2RlPiB0aGUgcHJldmlvdXMgdmFsdWUgaXMgbm90IHJlcGxhY2VkLgotICAgICAqIEluc3RlYWQgdGhlIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbiBzdG9yZWQgYWdhaW5zdCB0aGUga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBzdG9yZSBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhZGRlZCBpZiB0aGUgbWFwIGNoYW5nZWQgYW5kIG51bGwgaWYgdGhlIG1hcCBkaWQgbm90IGNoYW5nZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBnZXRDb2xsZWN0aW9uKGtleSk7Ci0gICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbGwgPSBjcmVhdGVDb2xsZWN0aW9uKDEpOwotICAgICAgICAgICAgcmVzdWx0ID0gY29sbC5hZGQodmFsdWUpOwotICAgICAgICAgICAgaWYgKGNvbGwuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgYWRkIGlmIG5vbi16ZXJvIHNpemUgdG8gbWFpbnRhaW4gY2xhc3Mgc3RhdGUKLSAgICAgICAgICAgICAgICBnZXRNYXAoKS5wdXQoa2V5LCBjb2xsKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbGwuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHJlc3VsdCA/IHZhbHVlIDogbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgc3VwZXJjbGFzcyB0byBlbnN1cmUgdGhhdCBNdWx0aU1hcCBpbnN0YW5jZXMgYXJlCi0gICAgICogY29ycmVjdGx5IGhhbmRsZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgeW91IGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIG5vcm1hbCBtYXAsIGVhY2ggZW50cnkgaXMKLSAgICAgKiBhZGRlZCB1c2luZyA8Y29kZT5wdXQoT2JqZWN0LE9iamVjdCk8L2NvZGU+LgotICAgICAqIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSBtdWx0aSBtYXAsIGVhY2ggZW50cnkgaXMKLSAgICAgKiBhZGRlZCB1c2luZyA8Y29kZT5wdXRBbGwoT2JqZWN0LENvbGxlY3Rpb24pPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gY29weSAoZWl0aGVyIGEgbm9ybWFsIG9yIG11bHRpIG1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTXVsdGlNYXApIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHB1dEFsbChlbnRyeS5nZXRLZXkoKSwgY29sbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmV0dXJucyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgY29tYmluYXRpb24gb2YgdmFsdWVzIGZyb20gYWxsIGtleXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB2aWV3IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBDb2xsZWN0aW9uIHZzID0gdmFsdWVzOwotICAgICAgICByZXR1cm4gKHZzICE9IG51bGwgPyB2cyA6ICh2YWx1ZXMgPSBuZXcgVmFsdWVzKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGtleSBjb250YWlucyB0aGUgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbGwuY29udGFpbnModmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIHR5cGVjYXN0IHRoZSByZXN1bHQgb2YgPGNvZGU+Z2V0KGtleSk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBrZXksIG51bGwgaWYgbm8gbWFwcGluZwotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldENvbGxlY3Rpb24oT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKENvbGxlY3Rpb24pIGdldE1hcCgpLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24gbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBnZXQgc2l6ZSBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBrZXksIHplcm8gaWYga2V5IG5vdCBpbiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoT2JqZWN0IGtleSkgewotICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBnZXRDb2xsZWN0aW9uKGtleSk7Ci0gICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb2xsLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMgdG8gdGhlIGNvbGxlY3Rpb24gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHN0b3JlIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gdmFsdWVzICB0aGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUga2V5LCBudWxsIGlnbm9yZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtYXAgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHB1dEFsbChPYmplY3Qga2V5LCBDb2xsZWN0aW9uIHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gZ2V0Q29sbGVjdGlvbihrZXkpOwotICAgICAgICBpZiAoY29sbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb2xsID0gY3JlYXRlQ29sbGVjdGlvbih2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY29sbC5hZGRBbGwodmFsdWVzKTsKLSAgICAgICAgICAgIGlmIChjb2xsLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFkZCBpZiBub24temVybyBzaXplIHRvIG1haW50YWluIGNsYXNzIHN0YXRlCi0gICAgICAgICAgICAgICAgZ2V0TWFwKCkucHV0KGtleSwgY29sbCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGNvbGwuYWRkQWxsKHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIGZvciB0aGUgY29sbGVjdGlvbiBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGdldCBhbiBpdGVyYXRvciBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiB0aGUgY29sbGVjdGlvbiBhdCB0aGUga2V5LCBlbXB0eSBpdGVyYXRvciBpZiBrZXkgbm90IGluIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcihPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmICghY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5SXRlcmF0b3IuSU5TVEFOQ0U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlc0l0ZXJhdG9yKGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBtYXAgYnkgY291bnRpbmcgYWxsIHRoZSB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBtYXAgY291bnRpbmcgYWxsIHZhbHVlcwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdG90YWxTaXplKCkgewotICAgICAgICBpbnQgdG90YWwgPSAwOwotICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IGdldE1hcCgpLnZhbHVlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICB0b3RhbCArPSBjb2xsLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbWFwIHZhbHVlIENvbGxlY3Rpb24gY29udGFpbmVyCi0gICAgICogdXNpbmcgdGhlIGZhY3RvcnkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gcGVyZm9ybSB5b3VyIG93biBwcm9jZXNzaW5nCi0gICAgICogaW5zdGVhZCBvZiB1c2luZyB0aGUgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzaXplICB0aGUgY29sbGVjdGlvbiBzaXplIHRoYXQgaXMgYWJvdXQgdG8gYmUgYWRkZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29sbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24oaW50IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKSBjb2xsZWN0aW9uRmFjdG9yeS5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgdGhhdCBwcm92aWRlcyB0aGUgdmFsdWVzIHZpZXcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZXMgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24gewotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvckNoYWluIGNoYWluID0gbmV3IEl0ZXJhdG9yQ2hhaW4oKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBrZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgY2hhaW4uYWRkSXRlcmF0b3IobmV3IFZhbHVlc0l0ZXJhdG9yKGl0Lm5leHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBNdWx0aVZhbHVlTWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElubmVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIHZhbHVlcyBpdGVyYXRvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFZhbHVlc0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBrZXk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiB2YWx1ZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICAgICAgcHVibGljIFZhbHVlc0l0ZXJhdG9yKE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBnZXRDb2xsZWN0aW9uKGtleSk7Ci0gICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTXVsdGlWYWx1ZU1hcC50aGlzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBhIHNpbXBsZSByZWZsZWN0aW9uIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmbGVjdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBjbGF6ejsKLQotICAgICAgICBwdWJsaWMgUmVmbGVjdGlvbkZhY3RvcnkoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdG9yRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgY2xhc3M6ICIgKyBjbGF6eiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1ByZWRpY2F0ZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGQxY2UzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5NYXA8L2NvZGU+IHRvIHZhbGlkYXRlIHRoYXQgYWRkaXRpb25zCi0gKiBtYXRjaCBhIHNwZWNpZmllZCBwcmVkaWNhdGUuCi0gKiA8cD4KLSAqIFRoaXMgbWFwIGV4aXN0cyB0byBwcm92aWRlIHZhbGlkYXRpb24gZm9yIHRoZSBkZWNvcmF0ZWQgbWFwLgotICogSXQgaXMgbm9ybWFsbHkgY3JlYXRlZCB0byBkZWNvcmF0ZSBhbiBlbXB0eSBtYXAuCi0gKiBJZiBhbiBvYmplY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSBtYXAsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiA8cD4KLSAqIE9uZSB1c2FnZSB3b3VsZCBiZSB0byBlbnN1cmUgdGhhdCBubyBudWxsIGtleXMgYXJlIGFkZGVkIHRvIHRoZSBtYXAuCi0gKiA8cHJlPk1hcCBtYXAgPSBQcmVkaWNhdGVkU2V0LmRlY29yYXRlKG5ldyBIYXNoTWFwKCksIE5vdE51bGxQcmVkaWNhdGUuSU5TVEFOQ0UsIG51bGwpOzwvcHJlPgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBQcmVkaWNhdGVkTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkaWNhdGVkTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0MTI2MjI0NTYxMjg0MTUxNTZMOwotCi0gICAgLyoqIFRoZSBrZXkgcHJlZGljYXRlIHRvIHVzZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBQcmVkaWNhdGUga2V5UHJlZGljYXRlOwotICAgIC8qKiBUaGUgdmFsdWUgcHJlZGljYXRlIHRvIHVzZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBQcmVkaWNhdGUgdmFsdWVQcmVkaWNhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlQcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdmFsaWRhdGUgdGhlIGtleXMsIG51bGwgbWVhbnMgbm8gY2hlY2sKLSAgICAgKiBAcGFyYW0gdmFsdWVQcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdmFsaWRhdGUgdG8gdmFsdWVzLCBudWxsIG1lYW5zIG5vIGNoZWNrCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCwgUHJlZGljYXRlIGtleVByZWRpY2F0ZSwgUHJlZGljYXRlIHZhbHVlUHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZE1hcChtYXAsIGtleVByZWRpY2F0ZSwgdmFsdWVQcmVkaWNhdGUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGtleVByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB2YWxpZGF0ZSB0aGUga2V5cywgbnVsbCBtZWFucyBubyBjaGVjawotICAgICAqIEBwYXJhbSB2YWx1ZVByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB2YWxpZGF0ZSB0byB2YWx1ZXMsIG51bGwgbWVhbnMgbm8gY2hlY2sKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJlZGljYXRlZE1hcChNYXAgbWFwLCBQcmVkaWNhdGUga2V5UHJlZGljYXRlLCBQcmVkaWNhdGUgdmFsdWVQcmVkaWNhdGUpIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICAgICAgdGhpcy5rZXlQcmVkaWNhdGUgPSBrZXlQcmVkaWNhdGU7Ci0gICAgICAgIHRoaXMudmFsdWVQcmVkaWNhdGUgPSB2YWx1ZVByZWRpY2F0ZTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlKGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBtYXAgPSAoTWFwKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBhIGtleSB2YWx1ZSBwYWlyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gdmFsaWRhdGUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGludmFsaWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKGtleVByZWRpY2F0ZSAhPSBudWxsICYmIGtleVByZWRpY2F0ZS5ldmFsdWF0ZShrZXkpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIGtleSAtIFByZWRpY2F0ZSByZWplY3RlZCBpdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZVByZWRpY2F0ZSAhPSBudWxsICYmIHZhbHVlUHJlZGljYXRlLmV2YWx1YXRlKHZhbHVlKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCB2YWx1ZSAtIFByZWRpY2F0ZSByZWplY3RlZCBpdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gdmFsaWRhdGUgYW4gb2JqZWN0IHNldCBpbnRvIHRoZSBtYXAgdmlhIDxjb2RlPnNldFZhbHVlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGludmFsaWQKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNoZWNrU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZVByZWRpY2F0ZS5ldmFsdWF0ZSh2YWx1ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzZXQgdmFsdWUgLSBQcmVkaWNhdGUgcmVqZWN0ZWQgaXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gb25seSByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlIGlzIGEgdmFsdWUgdHJhbnNmb3JtZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmFsdWUgcHJlZGljYXRlIGlzIGluIHVzZQotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2V0VmFsdWVDaGVja2luZygpIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZVByZWRpY2F0ZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHZhbGlkYXRlKGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcFRvQ29weSkgewotICAgICAgICBJdGVyYXRvciBpdCA9IG1hcFRvQ29weS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZShrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtYXAucHV0QWxsKG1hcFRvQ29weSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1ByZWRpY2F0ZWRTb3J0ZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZFNvcnRlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjhjZjY4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUHJlZGljYXRlZFNvcnRlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkTWFwIDwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBtYXAgZXhpc3RzIHRvIHByb3ZpZGUgdmFsaWRhdGlvbiBmb3IgdGhlIGRlY29yYXRlZCBtYXAuCi0gKiBJdCBpcyBub3JtYWxseSBjcmVhdGVkIHRvIGRlY29yYXRlIGFuIGVtcHR5IG1hcC4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIG1hcCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIDxwPgotICogT25lIHVzYWdlIHdvdWxkIGJlIHRvIGVuc3VyZSB0aGF0IG5vIG51bGwga2V5cyBhcmUgYWRkZWQgdG8gdGhlIG1hcC4KLSAqIDxwcmU+U29ydGVkTWFwIG1hcCA9IFByZWRpY2F0ZWRTb3J0ZWRTZXQuZGVjb3JhdGUobmV3IFRyZWVNYXAoKSwgTm90TnVsbFByZWRpY2F0ZS5JTlNUQU5DRSwgbnVsbCk7PC9wcmU+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IFByZWRpY2F0ZWRTb3J0ZWRNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gd3JhcCB0aGlzIG1hcAotICogdXNpbmcge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTb3J0ZWRNYXB9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkaWNhdGVkU29ydGVkTWFwCi0gICAgICAgIGV4dGVuZHMgUHJlZGljYXRlZE1hcAotICAgICAgICBpbXBsZW1lbnRzIFNvcnRlZE1hcCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM1OTg0NjE3NTkzNTMwNDMzMkw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBzb3J0ZWQgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgbGlzdCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0ga2V5UHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHZhbGlkYXRlIHRoZSBrZXlzLCBudWxsIG1lYW5zIG5vIGNoZWNrCi0gICAgICogQHBhcmFtIHZhbHVlUHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHZhbGlkYXRlIHRvIHZhbHVlcywgbnVsbCBtZWFucyBubyBjaGVjawotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGRlY29yYXRlKFNvcnRlZE1hcCBtYXAsIFByZWRpY2F0ZSBrZXlQcmVkaWNhdGUsIFByZWRpY2F0ZSB2YWx1ZVByZWRpY2F0ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRNYXAobWFwLCBrZXlQcmVkaWNhdGUsIHZhbHVlUHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlQcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdmFsaWRhdGUgdGhlIGtleXMsIG51bGwgbWVhbnMgbm8gY2hlY2sKLSAgICAgKiBAcGFyYW0gdmFsdWVQcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdmFsaWRhdGUgdG8gdmFsdWVzLCBudWxsIG1lYW5zIG5vIGNoZWNrCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZWRTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCwgUHJlZGljYXRlIGtleVByZWRpY2F0ZSwgUHJlZGljYXRlIHZhbHVlUHJlZGljYXRlKSB7Ci0gICAgICAgIHN1cGVyKG1hcCwga2V5UHJlZGljYXRlLCB2YWx1ZVByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIG1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRNYXAgZ2V0U29ydGVkTWFwKCkgewotICAgICAgICByZXR1cm4gKFNvcnRlZE1hcCkgbWFwOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0S2V5KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkuZmlyc3RLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5sYXN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhcmF0b3IgY29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmNvbXBhcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHN1Yk1hcChPYmplY3QgZnJvbUtleSwgT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS5zdWJNYXAoZnJvbUtleSwgdG9LZXkpOwotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRNYXAobWFwLCBrZXlQcmVkaWNhdGUsIHZhbHVlUHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIGhlYWRNYXAoT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS5oZWFkTWFwKHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkU29ydGVkTWFwKG1hcCwga2V5UHJlZGljYXRlLCB2YWx1ZVByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCB0YWlsTWFwKE9iamVjdCBmcm9tS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS50YWlsTWFwKGZyb21LZXkpOwotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRNYXAobWFwLCBrZXlQcmVkaWNhdGUsIHZhbHVlUHJlZGljYXRlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlSWRlbnRpdHlNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlSWRlbnRpdHlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRkZDk0Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1JlZmVyZW5jZUlkZW50aXR5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotCi0vKioKLSAqIEEgPGNvZGU+TWFwPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBtYXBwaW5ncyB0byBiZQotICogcmVtb3ZlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgYW5kIG1hdGNoZXMga2V5cyBhbmQgdmFsdWVzIGJhc2VkCi0gKiBvbiA8Y29kZT49PTwvY29kZT4gbm90IDxjb2RlPmVxdWFscygpPC9jb2RlPi4KLSAqIDxwPgotICogPHA+Ci0gKiBXaGVuIHlvdSBjb25zdHJ1Y3QgYSA8Y29kZT5SZWZlcmVuY2VJZGVudGl0eU1hcDwvY29kZT4sIHlvdSBjYW4gc3BlY2lmeSB3aGF0IGtpbmQKLSAqIG9mIHJlZmVyZW5jZXMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIG1hcCdzIGtleXMgYW5kIHZhbHVlcy4KLSAqIElmIG5vbi1oYXJkIHJlZmVyZW5jZXMgYXJlIHVzZWQsIHRoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGNhbiByZW1vdmUKLSAqIG1hcHBpbmdzIGlmIGEga2V5IG9yIHZhbHVlIGJlY29tZXMgdW5yZWFjaGFibGUsIG9yIGlmIHRoZSBKVk0ncyBtZW1vcnkgaXMKLSAqIHJ1bm5pbmcgbG93LiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRoZSBkaWZmZXJlbnQgcmVmZXJlbmNlIHR5cGVzIGJlaGF2ZSwKLSAqIHNlZSB7QGxpbmsgUmVmZXJlbmNlfS4KLSAqIDxwPgotICogRGlmZmVyZW50IHR5cGVzIG9mIHJlZmVyZW5jZXMgY2FuIGJlIHNwZWNpZmllZCBmb3Iga2V5cyBhbmQgdmFsdWVzLgotICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlcyBoYXJkIGtleXMgYW5kIHNvZnQgdmFsdWVzLCBwcm92aWRpbmcgYQotICogbWVtb3J5LXNlbnNpdGl2ZSBjYWNoZS4KLSAqIDxwPgotICogVGhpcyBtYXAgaXMgc2ltaWxhciB0bwotICoge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlTWFwIFJlZmVyZW5jZU1hcH0uCi0gKiBJdCBkaWZmZXJzIGluIHRoYXQga2V5cyBhbmQgdmFsdWVzIGluIHRoaXMgY2xhc3MgYXJlIGNvbXBhcmVkIHVzaW5nIDxjb2RlPj09PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBtYXAgd2lsbCB2aW9sYXRlIHRoZSBkZXRhaWwgb2YgdmFyaW91cyBNYXAgYW5kIG1hcCB2aWV3IGNvbnRyYWN0cy4KLSAqIEFzIGEgZ2VuZXJhbCBydWxlLCBkb24ndCBjb21wYXJlIHRoaXMgbWFwIHRvIG90aGVyIG1hcHMuCi0gKiA8cD4KLSAqIFRoaXMge0BsaW5rIGphdmEudXRpbC5NYXAgTWFwfSBpbXBsZW1lbnRhdGlvbiBkb2VzIDxpPm5vdDwvaT4gYWxsb3cgbnVsbCBlbGVtZW50cy4KLSAqIEF0dGVtcHRpbmcgdG8gYWRkIGEgbnVsbCBrZXkgb3IgdmFsdWUgdG8gdGhlIG1hcCB3aWxsIHJhaXNlIGEgPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuCi0gKiBZb3UgY2FuIHVzZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcH0gdG8gCi0gKiBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYSA8Y29kZT5SZWZlcmVuY2VJZGVudGl0eU1hcDwvY29kZT4uCi0gKiBSZW1lbWJlciB0aGF0IHN5bmNocm9uaXphdGlvbiB3aWxsIG5vdCBzdG9wIHRoZSBnYXJiYWdlIGNvbGxlY3RlciByZW1vdmluZyBlbnRyaWVzLgotICogPHA+Ci0gKiBBbGwgdGhlIGF2YWlsYWJsZSBpdGVyYXRvcnMgY2FuIGJlIHJlc2V0IGJhY2sgdG8gdGhlIHN0YXJ0IGJ5IGNhc3RpbmcgdG8KLSAqIDxjb2RlPlJlc2V0dGFibGVJdGVyYXRvcjwvY29kZT4gYW5kIGNhbGxpbmcgPGNvZGU+cmVzZXQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IFJlZmVyZW5jZUlkZW50aXR5TWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICoKLSAqIEBzZWUgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UKLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wIChwcmV2aW91c2x5IGluIG1haW4gcGFja2FnZSB2Mi4xKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VJZGVudGl0eU1hcCBleHRlbmRzIEFic3RyYWN0UmVmZXJlbmNlTWFwIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTI2NjE5MDEzNDU2ODM2NTg1Mkw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlZmVyZW5jZUlkZW50aXR5TWFwPC9jb2RlPiB0aGF0IHdpbGwKLSAgICAgKiB1c2UgaGFyZCByZWZlcmVuY2VzIHRvIGtleXMgYW5kIHNvZnQgcmVmZXJlbmNlcyB0byB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZUlkZW50aXR5TWFwKCkgewotICAgICAgICBzdXBlcihIQVJELCBTT0ZULCBERUZBVUxUX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VJZGVudGl0eU1hcDwvY29kZT4gdGhhdCB3aWxsCi0gICAgICogdXNlIHRoZSBzcGVjaWZpZWQgdHlwZXMgb2YgcmVmZXJlbmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciBrZXlzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3IgdmFsdWVzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZUlkZW50aXR5TWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlKSB7Ci0gICAgICAgIHN1cGVyKGtleVR5cGUsIHZhbHVlVHlwZSwgREVGQVVMVF9DQVBBQ0lUWSwgREVGQVVMVF9MT0FEX0ZBQ1RPUiwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlSWRlbnRpdHlNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqIHVzZSB0aGUgc3BlY2lmaWVkIHR5cGVzIG9mIHJlZmVyZW5jZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3Iga2V5czsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSBwdXJnZVZhbHVlcyBzaG91bGQgdGhlIHZhbHVlIGJlIGF1dG9tYXRpY2FsbHkgcHVyZ2VkIHdoZW4gdGhlIAotICAgICAqICAga2V5IGlzIGdhcmJhZ2UgY29sbGVjdGVkIAotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VJZGVudGl0eU1hcChpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSwgYm9vbGVhbiBwdXJnZVZhbHVlcykgewotICAgICAgICBzdXBlcihrZXlUeXBlLCB2YWx1ZVR5cGUsIERFRkFVTFRfQ0FQQUNJVFksIERFRkFVTFRfTE9BRF9GQUNUT1IsIHB1cmdlVmFsdWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlZmVyZW5jZUlkZW50aXR5TWFwPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCByZWZlcmVuY2UgdHlwZXMsIGxvYWQgZmFjdG9yIGFuZCBpbml0aWFsIGNhcGFjaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIGtleXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiBAcGFyYW0gdmFsdWVUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciB2YWx1ZXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IGZvciB0aGUgbWFwCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VJZGVudGl0eU1hcChpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSwgaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIHN1cGVyKGtleVR5cGUsIHZhbHVlVHlwZSwgY2FwYWNpdHksIGxvYWRGYWN0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlZmVyZW5jZUlkZW50aXR5TWFwPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCByZWZlcmVuY2UgdHlwZXMsIGxvYWQgZmFjdG9yIGFuZCBpbml0aWFsIGNhcGFjaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIGtleXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiBAcGFyYW0gdmFsdWVUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciB2YWx1ZXM7Ci0gICAgICogICBtdXN0IGJlIHtAbGluayAjSEFSRH0sIHtAbGluayAjU09GVH0sIHtAbGluayAjV0VBS30KLSAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IGZvciB0aGUgbWFwCi0gICAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIG1hcAotICAgICAqIEBwYXJhbSBwdXJnZVZhbHVlcyAgc2hvdWxkIHRoZSB2YWx1ZSBiZSBhdXRvbWF0aWNhbGx5IHB1cmdlZCB3aGVuIHRoZSAKLSAgICAgKiAgIGtleSBpcyBnYXJiYWdlIGNvbGxlY3RlZCAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlSWRlbnRpdHlNYXAoaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUsIGludCBjYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvYWRGYWN0b3IsIGJvb2xlYW4gcHVyZ2VWYWx1ZXMpIHsKLSAgICAgICAgc3VwZXIoa2V5VHlwZSwgdmFsdWVUeXBlLCBjYXBhY2l0eSwgbG9hZEZhY3RvciwgcHVyZ2VWYWx1ZXMpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkgc3BlY2lmaWVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgaWRlbnRpdHkgaGFzaCBjb2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gZ2V0IGEgaGFzaCBjb2RlIGZvcgotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhhc2ggY29kZSBmb3IgYSBNYXBFbnRyeS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGlkZW50aXR5IGhhc2ggY29kZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIGdldCBhIGhhc2ggY29kZSBmb3IsIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gZ2V0IGEgaGFzaCBjb2RlIGZvciwgbWF5IGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUsIGFzIHBlciB0aGUgTWFwRW50cnkgc3BlY2lmaWNhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgaGFzaEVudHJ5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoa2V5KSBeCi0gICAgICAgICAgICAgICBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGtleXMgZm9yIGVxdWFscy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnZlcnRzIHRoZSBrZXkgZnJvbSB0aGUgZW50cnkgdG8gYSByZWFsIHJlZmVyZW5jZQotICAgICAqIGJlZm9yZSBjb21wYXJpc29uIGFuZCB1c2VzIDxjb2RlPj09PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5MSAgdGhlIGZpcnN0IGtleSB0byBjb21wYXJlIHBhc3NlZCBpbiBmcm9tIG91dHNpZGUKLSAgICAgKiBAcGFyYW0ga2V5MiAgdGhlIHNlY29uZCBrZXkgZXh0cmFjdGVkIGZyb20gdGhlIGVudHJ5IHZpYSA8Y29kZT5lbnRyeS5rZXk8L2NvZGU+Ci0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIGJ5IGlkZW50aXR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVhbEtleShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLSAgICAgICAga2V5MiA9IChrZXlUeXBlID4gSEFSRCA/ICgoUmVmZXJlbmNlKSBrZXkyKS5nZXQoKSA6IGtleTIpOwotICAgICAgICByZXR1cm4gKGtleTEgPT0ga2V5Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIHZhbHVlcyBmb3IgZXF1YWxzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyA8Y29kZT49PTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlMSAgdGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUgcGFzc2VkIGluIGZyb20gb3V0c2lkZQotICAgICAqIEBwYXJhbSB2YWx1ZTIgIHRoZSBzZWNvbmQgdmFsdWUgZXh0cmFjdGVkIGZyb20gdGhlIGVudHJ5IHZpYSA8Y29kZT5nZXRWYWx1ZSgpPC9jb2RlPgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCBieSBpZGVudGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxWYWx1ZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0gICAgICAgIHJldHVybiAodmFsdWUxID09IHZhbHVlMik7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgZG9Xcml0ZU9iamVjdChvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBkb1JlYWRPYmplY3QoaW4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9SZWZlcmVuY2VNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvUmVmZXJlbmNlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMWRhMmEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9SZWZlcmVuY2VNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAyLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPk1hcDwvY29kZT4gaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgbWFwcGluZ3MgdG8gYmUKLSAqIHJlbW92ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotICogPHA+Ci0gKiBXaGVuIHlvdSBjb25zdHJ1Y3QgYSA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+LCB5b3UgY2FuIHNwZWNpZnkgd2hhdCBraW5kCi0gKiBvZiByZWZlcmVuY2VzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBtYXAncyBrZXlzIGFuZCB2YWx1ZXMuCi0gKiBJZiBub24taGFyZCByZWZlcmVuY2VzIGFyZSB1c2VkLCB0aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBjYW4gcmVtb3ZlCi0gKiBtYXBwaW5ncyBpZiBhIGtleSBvciB2YWx1ZSBiZWNvbWVzIHVucmVhY2hhYmxlLCBvciBpZiB0aGUgSlZNJ3MgbWVtb3J5IGlzCi0gKiBydW5uaW5nIGxvdy4gRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUgZGlmZmVyZW50IHJlZmVyZW5jZSB0eXBlcyBiZWhhdmUsCi0gKiBzZWUge0BsaW5rIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlIFJlZmVyZW5jZX0uCi0gKiA8cD4KLSAqIERpZmZlcmVudCB0eXBlcyBvZiByZWZlcmVuY2VzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGtleXMgYW5kIHZhbHVlcy4KLSAqIFRoZSBrZXlzIGNhbiBiZSBjb25maWd1cmVkIHRvIGJlIHdlYWsgYnV0IHRoZSB2YWx1ZXMgaGFyZCwKLSAqIGluIHdoaWNoIGNhc2UgdGhpcyBjbGFzcyB3aWxsIGJlaGF2ZSBsaWtlIGEKLSAqIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9hcGkvamF2YS91dGlsL1dlYWtIYXNoTWFwLmh0bWwiPgotICogPGNvZGU+V2Vha0hhc2hNYXA8L2NvZGU+PC9hPi4gSG93ZXZlciwgeW91IGNhbiBhbHNvIHNwZWNpZnkgaGFyZCBrZXlzIGFuZAotICogd2VhayB2YWx1ZXMsIG9yIGFueSBvdGhlciBjb21iaW5hdGlvbi4gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlcwotICogaGFyZCBrZXlzIGFuZCBzb2Z0IHZhbHVlcywgcHJvdmlkaW5nIGEgbWVtb3J5LXNlbnNpdGl2ZSBjYWNoZS4KLSAqIDxwPgotICogVGhpcyBtYXAgaXMgc2ltaWxhciB0bwotICoge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlSWRlbnRpdHlNYXAgUmVmZXJlbmNlSWRlbnRpdHlNYXB9LgotICogSXQgZGlmZmVycyBpbiB0aGF0IGtleXMgYW5kIHZhbHVlcyBpbiB0aGlzIGNsYXNzIGFyZSBjb21wYXJlZCB1c2luZyA8Y29kZT5lcXVhbHMoKTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMge0BsaW5rIGphdmEudXRpbC5NYXAgTWFwfSBpbXBsZW1lbnRhdGlvbiBkb2VzIDxpPm5vdDwvaT4gYWxsb3cgbnVsbCBlbGVtZW50cy4KLSAqIEF0dGVtcHRpbmcgdG8gYWRkIGEgbnVsbCBrZXkgb3IgdmFsdWUgdG8gdGhlIG1hcCB3aWxsIHJhaXNlIGEgPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuCi0gKiBZb3UgY2FuIHVzZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcH0gdG8gCi0gKiBwcm92aWRlIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYSA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+LgotICogUmVtZW1iZXIgdGhhdCBzeW5jaHJvbml6YXRpb24gd2lsbCBub3Qgc3RvcCB0aGUgZ2FyYmFnZSBjb2xsZWN0ZXIgcmVtb3ZpbmcgZW50cmllcy4KLSAqIDxwPgotICogQWxsIHRoZSBhdmFpbGFibGUgaXRlcmF0b3JzIGNhbiBiZSByZXNldCBiYWNrIHRvIHRoZSBzdGFydCBieSBjYXN0aW5nIHRvCi0gKiA8Y29kZT5SZXNldHRhYmxlSXRlcmF0b3I8L2NvZGU+IGFuZCBjYWxsaW5nIDxjb2RlPnJlc2V0KCk8L2NvZGU+LgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBSZWZlcmVuY2VNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gd3JhcCB0aGlzIG1hcAotICogdXNpbmcge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRNYXB9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIE5PVEU6IEFzIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEgdGhpcyBtYXAgZXh0ZW5kcyA8Y29kZT5BYnN0cmFjdFJlZmVyZW5jZU1hcDwvY29kZT4KLSAqIChwcmV2aW91c2x5IGl0IGV4dGVuZGVkIEFic3RyYWN0TWFwKS4gQXMgYSByZXN1bHQsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cKLSAqIGV4dGVuc2libGUgYW5kIHByb3ZpZGVzIGEgPGNvZGU+TWFwSXRlcmF0b3I8L2NvZGU+LgotICoKLSAqIEBzZWUgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UKLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wIChwcmV2aW91c2x5IGluIG1haW4gcGFja2FnZSB2Mi4xKQotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKiAKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlTWFwIGV4dGVuZHMgQWJzdHJhY3RSZWZlcmVuY2VNYXAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE1NTUwODk4ODgxMzgyOTk2MDdMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqIHVzZSBoYXJkIHJlZmVyZW5jZXMgdG8ga2V5cyBhbmQgc29mdCByZWZlcmVuY2VzIHRvIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlTWFwKCkgewotICAgICAgICBzdXBlcihIQVJELCBTT0ZULCBERUZBVUxUX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqIHVzZSB0aGUgc3BlY2lmaWVkIHR5cGVzIG9mIHJlZmVyZW5jZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3Iga2V5czsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VNYXAoaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUpIHsKLSAgICAgICAgc3VwZXIoa2V5VHlwZSwgdmFsdWVUeXBlLCBERUZBVUxUX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHRoYXQgd2lsbAotICAgICAqIHVzZSB0aGUgc3BlY2lmaWVkIHR5cGVzIG9mIHJlZmVyZW5jZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3Iga2V5czsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSBwdXJnZVZhbHVlcyBzaG91bGQgdGhlIHZhbHVlIGJlIGF1dG9tYXRpY2FsbHkgcHVyZ2VkIHdoZW4gdGhlIAotICAgICAqICAga2V5IGlzIGdhcmJhZ2UgY29sbGVjdGVkIAotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VNYXAoaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUsIGJvb2xlYW4gcHVyZ2VWYWx1ZXMpIHsKLSAgICAgICAgc3VwZXIoa2V5VHlwZSwgdmFsdWVUeXBlLCBERUZBVUxUX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBwdXJnZVZhbHVlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZWZlcmVuY2VNYXA8L2NvZGU+IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIHJlZmVyZW5jZSB0eXBlcywgbG9hZCBmYWN0b3IgYW5kIGluaXRpYWwKLSAgICAgKiBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSBvZiByZWZlcmVuY2UgdG8gdXNlIGZvciBrZXlzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3IgdmFsdWVzOwotICAgICAqICAgbXVzdCBiZSB7QGxpbmsgI0hBUkR9LCB7QGxpbmsgI1NPRlR9LCB7QGxpbmsgI1dFQUt9Ci0gICAgICogQHBhcmFtIGNhcGFjaXR5ICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIG1hcAotICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yICB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmZXJlbmNlTWFwKGludCBrZXlUeXBlLCBpbnQgdmFsdWVUeXBlLCBpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgc3VwZXIoa2V5VHlwZSwgdmFsdWVUeXBlLCBjYXBhY2l0eSwgbG9hZEZhY3RvciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlTWFwPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCByZWZlcmVuY2UgdHlwZXMsIGxvYWQgZmFjdG9yIGFuZCBpbml0aWFsCi0gICAgICogY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgb2YgcmVmZXJlbmNlIHRvIHVzZSBmb3Iga2V5czsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIG9mIHJlZmVyZW5jZSB0byB1c2UgZm9yIHZhbHVlczsKLSAgICAgKiAgIG11c3QgYmUge0BsaW5rICNIQVJEfSwge0BsaW5rICNTT0ZUfSwge0BsaW5rICNXRUFLfQotICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgbWFwCi0gICAgICogQHBhcmFtIHB1cmdlVmFsdWVzICBzaG91bGQgdGhlIHZhbHVlIGJlIGF1dG9tYXRpY2FsbHkgcHVyZ2VkIHdoZW4gdGhlIAotICAgICAqICAga2V5IGlzIGdhcmJhZ2UgY29sbGVjdGVkIAotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VNYXAoaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUsIGludCBjYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvYWRGYWN0b3IsIGJvb2xlYW4gcHVyZ2VWYWx1ZXMpIHsKLSAgICAgICAgc3VwZXIoa2V5VHlwZSwgdmFsdWVUeXBlLCBjYXBhY2l0eSwgbG9hZEZhY3RvciwgcHVyZ2VWYWx1ZXMpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgbWFwIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIGRvV3JpdGVPYmplY3Qob3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgZG9SZWFkT2JqZWN0KGluKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU2luZ2xldG9uTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1NpbmdsZXRvbk1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjgwNTVlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvU2luZ2xldG9uTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXA7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQm91bmRlZE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuS2V5VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5PcmRlcmVkTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlNpbmdsZXRvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZS5UaWVkTWFwRW50cnk7Ci0KLS8qKgotICogQSA8Y29kZT5NYXA8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgaG9sZHMgYSBzaW5nbGUgaXRlbSBhbmQgaXMgZml4ZWQgc2l6ZS4KLSAqIDxwPgotICogVGhlIHNpbmdsZSBrZXkvdmFsdWUgcGFpciBpcyBzcGVjaWZpZWQgYXQgY3JlYXRpb24uCi0gKiBUaGUgbWFwIGlzIGZpeGVkIHNpemUgc28gYW55IGFjdGlvbiB0aGF0IHdvdWxkIGNoYW5nZSB0aGUgc2l6ZSBpcyBkaXNhbGxvd2VkLgotICogSG93ZXZlciwgdGhlIDxjb2RlPnB1dDwvY29kZT4gb3IgPGNvZGU+c2V0VmFsdWU8L2NvZGU+IG1ldGhvZHMgY2FuIDxpPmNoYW5nZTwvaT4KLSAqIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLSAqIDxwPgotICogSWYgdHJ5aW5nIHRvIHJlbW92ZSBvciBjbGVhciB0aGUgbWFwLCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiBJZiB0cnlpbmcgdG8gcHV0IGEgbmV3IG1hcHBpbmcgaW50byB0aGUgbWFwLCBhbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIFRoZSBwdXQgbWV0aG9kIHdpbGwgb25seSBzdWNlZWQgaWYgdGhlIGtleSBzcGVjaWZpZWQgaXMgdGhlIHNhbWUgYXMgdGhlIAotICogc2luZ2xldG9uIGtleS4KLSAqIDxwPgotICogVGhlIGtleSBhbmQgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5OgotICogPHVsPgotICogPGxpPm5vcm1hbCBNYXAgbWV0aG9kcyBhbmQgdmlld3MKLSAqIDxsaT50aGUgPGNvZGU+TWFwSXRlcmF0b3I8L2NvZGU+LCBzZWUge0BsaW5rICNtYXBJdGVyYXRvcigpfQotICogPGxpPnRoZSA8Y29kZT5LZXlWYWx1ZTwvY29kZT4gaW50ZXJmYWNlIChqdXN0IGNhc3QgLSBubyBvYmplY3QgY3JlYXRpb24pCi0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MjkgJAotICoKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGV0b25NYXAKLSAgICAgICAgaW1wbGVtZW50cyBPcmRlcmVkTWFwLCBCb3VuZGVkTWFwLCBLZXlWYWx1ZSwgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTMxMjcxMTE4Njc2ODAzMjYxTDsKLQotICAgIC8qKiBTaW5nbGV0b24ga2V5ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qga2V5OwotICAgIC8qKiBTaW5nbGV0b24gdmFsdWUgKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhIG1hcCBvZiA8Y29kZT5udWxsPC9jb2RlPiB0byA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xldG9uTWFwKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmtleSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igc3BlY2lmeWluZyB0aGUga2V5IGFuZCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gdXNlCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFNpbmdsZXRvbk1hcChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGFzIGEgPGNvZGU+S2V5VmFsdWU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleVZhbHVlICB0aGUga2V5IHZhbHVlIHBhaXIgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFNpbmdsZXRvbk1hcChLZXlWYWx1ZSBrZXlWYWx1ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmtleSA9IGtleVZhbHVlLmdldEtleSgpOwotICAgICAgICB0aGlzLnZhbHVlID0ga2V5VmFsdWUuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGFzIGEgPGNvZGU+TWFwRW50cnk8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcEVudHJ5ICB0aGUgbWFwRW50cnkgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIFNpbmdsZXRvbk1hcChNYXAuRW50cnkgbWFwRW50cnkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5rZXkgPSBtYXBFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IG1hcEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY29weWluZyBlbGVtZW50cyBmcm9tIGFub3RoZXIgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBjb3B5LCBtdXN0IGJlIHNpemUgMQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgaXMgbm90IDEKLSAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xldG9uTWFwKE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKG1hcC5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1hcCBzaXplIG11c3QgYmUgMSIpOwotICAgICAgICB9Ci0gICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB0aGlzLmtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICB0aGlzLnZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvLyBLZXlWYWx1ZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBrZXkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIG5ldyB2YWx1ZSB0byBzZXQKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8vIEJvdW5kZWRNYXAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogSXMgdGhlIG1hcCBjdXJyZW50bHkgZnVsbCwgYWx3YXlzIHRydWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hcCwgYWx3YXlzIDEuCi0gICAgICogCi0gICAgICogQHJldHVybiAxIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbWF4U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLy8gTWFwCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUga2V5IHNwZWNpZmllZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLCBudWxsIGlmIG5vIG1hdGNoCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoaXNFcXVhbEtleShrZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgbWFwLCBhbHdheXMgMS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIDEKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBpdCBuZXZlciBpcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZhbHNlIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKGlzRXF1YWxLZXkoa2V5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcCBjb250YWlucyB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChpc0VxdWFsVmFsdWUodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUHV0cyBhIGtleS12YWx1ZSBtYXBwaW5nIGludG8gdGhpcyBtYXAgd2hlcmUgdGhlIGtleSBtdXN0IG1hdGNoIHRoZSBleGlzdGluZyBrZXkuCi0gICAgICogPHA+Ci0gICAgICogQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUga2V5IGRvZXMgbm90IG1hdGNoIGFzIHRoZSBtYXAKLSAgICAgKiBpcyBmaXhlZCBzaXplLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gc2V0LCBtdXN0IGJlIHRoZSBrZXkgb2YgdGhlIG1hcAotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHNldAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMga2V5LCBudWxsIGlmIG5vbmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUga2V5IGRvZXMgbm90IG1hdGNoCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChpc0VxdWFsS2V5KGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHB1dCBuZXcga2V5L3ZhbHVlIHBhaXIgLSBNYXAgaXMgZml4ZWQgc2l6ZSBzaW5nbGV0b24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCBpbnRvIHRoaXMgbWFwLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtYXAgbXVzdCBiZSBvZiBzaXplIDAgb3Igc2l6ZSAxLgotICAgICAqIElmIGl0IGlzIHNpemUgMSwgdGhlIGtleSBtdXN0IG1hdGNoIHRoZSBrZXkgb2YgdGhpcyBtYXAgb3RoZXJ3aXNlIGFuCi0gICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGFkZCwgbXVzdCBiZSBzaXplIDAgb3IgMSwgYW5kIHRoZSBrZXkgbXVzdCBtYXRjaAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG1hcCBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGtleSBkb2VzIG5vdCBtYXRjaAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7Ci0gICAgICAgIHN3aXRjaCAobWFwLnNpemUoKSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBtYXAgc2l6ZSBtdXN0IGJlIDAgb3IgMSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBtYXBwaW5nIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG1hcHBlZCB0byB0aGUgcmVtb3ZlZCBrZXksIG51bGwgaWYga2V5IG5vdCBpbiBtYXAKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW50cnlTZXQgdmlldyBvZiB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB2aWEgPGNvZGU+c2V0VmFsdWU8L2NvZGU+IGFmZmVjdCB0aGlzIG1hcC4KLSAgICAgKiBUbyBzaW1wbHkgaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzLCB1c2Uge0BsaW5rICNtYXBJdGVyYXRvcigpfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeVNldCB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gbmV3IFRpZWRNYXBFbnRyeSh0aGlzLCBnZXRLZXkoKSk7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZW50cnkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bm1vZGlmaWFibGUga2V5U2V0IHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgdG8gdGhlIHZpZXcgYWZmZWN0IHRoaXMgbWFwLgotICAgICAqIFRvIHNpbXBseSBpdGVyYXRlIHRocm91Z2ggdGhlIGtleXMsIHVzZSB7QGxpbmsgI21hcEl0ZXJhdG9yKCl9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleVNldCB2aWV3Ci0gICAgICovCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bm1vZGlmaWFibGUgdmFsdWVzIHZpZXcgb2YgdGhlIG1hcC4KLSAgICAgKiBDaGFuZ2VzIG1hZGUgdG8gdGhlIHZpZXcgYWZmZWN0IHRoaXMgbWFwLgotICAgICAqIFRvIHNpbXBseSBpdGVyYXRlIHRocm91Z2ggdGhlIHZhbHVlcywgdXNlIHtAbGluayAjbWFwSXRlcmF0b3IoKX0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWVzIHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uVmFsdWVzKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgbWFwLgotICAgICAqIENoYW5nZXMgbWFkZSB0byB0aGUgaXRlcmF0b3IgdXNpbmcgPGNvZGU+c2V0VmFsdWU8L2NvZGU+IGFmZmVjdCB0aGlzIG1hcC4KLSAgICAgKiBUaGUgPGNvZGU+cmVtb3ZlPC9jb2RlPiBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuCi0gICAgICogPHA+Ci0gICAgICogQSBNYXBJdGVyYXRvciByZXR1cm5zIHRoZSBrZXlzIGluIHRoZSBtYXAuIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVudAotICAgICAqIG1ldGhvZHMgdG8gZ2V0IHRoZSBrZXkgYW5kIHZhbHVlLCBhbmQgc2V0IHRoZSB2YWx1ZS4KLSAgICAgKiBJdCBhdm9pZHMgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIGVudHJ5U2V0L2tleVNldC92YWx1ZXMgb2JqZWN0LgotICAgICAqIEl0IGFsc28gYXZvaWRzIGNyZWF0aW5nIHRoZSBNYXAgRW50cnkgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBNYXBJdGVyYXRvciBtYXBJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25NYXBJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyBPcmRlcmVkTWFwCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIE9idGFpbnMgYW4gPGNvZGU+T3JkZXJlZE1hcEl0ZXJhdG9yPC9jb2RlPiBvdmVyIHRoZSBtYXAuCi0gICAgICogPHA+Ci0gICAgICogQSBvcmRlcmVkIG1hcCBpdGVyYXRvciBpcyBhbiBlZmZpY2llbnQgd2F5IG9mIGl0ZXJhdGluZyBvdmVyIG1hcHMKLSAgICAgKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBvcmRlcmVkIG1hcCBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBPcmRlcmVkTWFwSXRlcmF0b3Igb3JkZXJlZE1hcEl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbk1hcEl0ZXJhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IChhbmQgb25seSkga2V5IGluIHRoZSBtYXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhc3QgKGFuZCBvbmx5KSBrZXkgaW4gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IGtleSBhZnRlciB0aGUga2V5IHNwZWNpZmllZCwgYWx3YXlzIG51bGwuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIG5leHQga2V5Ci0gICAgICogQHJldHVybiBudWxsIGFsd2F5cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dEtleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZXZpb3VzIGtleSBiZWZvcmUgdGhlIGtleSBzcGVjaWZpZWQsIGFsd2F5cyBudWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBuZXh0IGtleQotICAgICAqIEByZXR1cm4gbnVsbCBhbHdheXMKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzdG9yZWQga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKGtleSA9PSBudWxsID8gZ2V0S2V5KCkgPT0gbnVsbCA6IGtleS5lcXVhbHMoZ2V0S2V5KCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBzdG9yZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWxWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gZ2V0VmFsdWUoKSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKGdldFZhbHVlKCkpKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogU2luZ2xldG9uTWFwSXRlcmF0b3IuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFNpbmdsZXRvbk1hcEl0ZXJhdG9yIGltcGxlbWVudHMgT3JkZXJlZE1hcEl0ZXJhdG9yLCBSZXNldHRhYmxlSXRlcmF0b3IgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNpbmdsZXRvbk1hcCBwYXJlbnQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhbkdldFNldCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgU2luZ2xldG9uTWFwSXRlcmF0b3IoU2luZ2xldG9uTWFwIHBhcmVudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBoYXNOZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgaWYgKGhhc05leHQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5OT19ORVhUX0VOVFJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGNhbkdldFNldCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGhhc05leHQgPT0gZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKLSAgICAgICAgICAgIGlmIChoYXNOZXh0ID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5OT19QUkVWSU9VU19FTlRSWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYXNOZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICAgICAgaWYgKGNhbkdldFNldCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQWJzdHJhY3RIYXNoZWRNYXAuR0VUS0VZX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRLZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICBpZiAoY2FuR2V0U2V0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5HRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoY2FuR2V0U2V0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihBYnN0cmFjdEhhc2hlZE1hcC5TRVRWQUxVRV9JTlZBTElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIGhhc05leHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgaWYgKGhhc05leHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkl0ZXJhdG9yW10iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkl0ZXJhdG9yWyIgKyBnZXRLZXkoKSArICI9IiArIGdldFZhbHVlKCkgKyAiXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2luZ2xldG9uTWFwLgotICAgICAqIFRoaXMgY2xhc3MgaXMgbmVlZGVkIGFzIHZhbHVlcyBpcyBhIHZpZXcgdGhhdCBtdXN0IHVwZGF0ZSBhcyB0aGUgbWFwIHVwZGF0ZXMuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFNpbmdsZXRvblZhbHVlcyBleHRlbmRzIEFic3RyYWN0U2V0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM2ODk1MjQ3NDE4NjMwNDc4NzJMOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNpbmdsZXRvbk1hcCBwYXJlbnQ7Ci0KLSAgICAgICAgU2luZ2xldG9uVmFsdWVzKFNpbmdsZXRvbk1hcCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jb250YWluc1ZhbHVlKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbkl0ZXJhdG9yKHBhcmVudC5nZXRWYWx1ZSgpLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENsb25lcyB0aGUgbWFwIHdpdGhvdXQgY2xvbmluZyB0aGUga2V5IG9yIHZhbHVlLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHNoYWxsb3cgY2xvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2luZ2xldG9uTWFwIGNsb25lZCA9IChTaW5nbGV0b25NYXApIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmVkOwotICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgbWFwIHdpdGggYW5vdGhlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNYXAgb3RoZXIgPSAoTWFwKSBvYmo7Ci0gICAgICAgIGlmIChvdGhlci5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG90aGVyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHJldHVybiBpc0VxdWFsS2V5KGVudHJ5LmdldEtleSgpKSAmJiBpc0VxdWFsVmFsdWUoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3RhbmRhcmQgTWFwIGhhc2hDb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBkZWZpbmVkIGluIHRoZSBNYXAgaW50ZXJmYWNlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRLZXkoKSA9PSBudWxsID8gMCA6IGdldEtleSgpLmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgIChnZXRWYWx1ZSgpID09IG51bGwgPyAwIDogZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKTsgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwIGFzIGEgU3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoMTI4KQotICAgICAgICAgICAgLmFwcGVuZCgneycpCi0gICAgICAgICAgICAuYXBwZW5kKChnZXRLZXkoKSA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDogZ2V0S2V5KCkpKQotICAgICAgICAgICAgLmFwcGVuZCgnPScpCi0gICAgICAgICAgICAuYXBwZW5kKChnZXRWYWx1ZSgpID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiBnZXRWYWx1ZSgpKSkKLSAgICAgICAgICAgIC5hcHBlbmQoJ30nKQotICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9TdGF0aWNCdWNrZXRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc2NjUyYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1N0YXRpY0J1Y2tldE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLktleVZhbHVlOwotCi0vKioKLSAqIEEgU3RhdGljQnVja2V0TWFwIGlzIGFuIGVmZmljaWVudCwgdGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YKLSAqIDxjb2RlPmphdmEudXRpbC5NYXA8L2NvZGU+IHRoYXQgcGVyZm9ybXMgd2VsbCBpbiBpbiBhIGhpZ2hseQotICogdGhyZWFkLWNvbnRlbnRpb3VzIGVudmlyb25tZW50LiAgVGhlIG1hcCBzdXBwb3J0cyB2ZXJ5IGVmZmljaWVudAotICoge0BsaW5rICNnZXQoT2JqZWN0KSBnZXR9LCB7QGxpbmsgI3B1dChPYmplY3QsT2JqZWN0KSBwdXR9LCAKLSAqIHtAbGluayAjcmVtb3ZlKE9iamVjdCkgcmVtb3ZlfSBhbmQge0BsaW5rICNjb250YWluc0tleShPYmplY3QpIGNvbnRhaW5zS2V5fQotICogb3BlcmF0aW9ucywgYXNzdW1pbmcgKGFwcHJveGltYXRlKSB1bmlmb3JtIGhhc2hpbmcgYW5kCi0gKiB0aGF0IHRoZSBudW1iZXIgb2YgZW50cmllcyBkb2VzIG5vdCBleGNlZWQgdGhlIG51bWJlciBvZiBidWNrZXRzLiAgSWYgdGhlCi0gKiBudW1iZXIgb2YgZW50cmllcyBleGNlZWRzIHRoZSBudW1iZXIgb2YgYnVja2V0cyBvciBpZiB0aGUgaGFzaCBjb2RlcyBvZiB0aGUKLSAqIG9iamVjdHMgYXJlIG5vdCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQsIHRoZXNlIG9wZXJhdGlvbnMgaGF2ZSBhIHdvcnN0IGNhc2UKLSAqIHNjZW5hcmlvIHRoYXQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcAotICogKDxpPk8obik8L2k+KS48cD4KLSAqCi0gKiBFYWNoIGJ1Y2tldCBpbiB0aGUgaGFzaCB0YWJsZSBoYXMgaXRzIG93biBtb25pdG9yLCBzbyB0d28gdGhyZWFkcyBjYW4gCi0gKiBzYWZlbHkgb3BlcmF0ZSBvbiB0aGUgbWFwIGF0IHRoZSBzYW1lIHRpbWUsIG9mdGVuIHdpdGhvdXQgaW5jdXJyaW5nIGFueSAKLSAqIG1vbml0b3IgY29udGVudGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byB3cmFwIGluc3RhbmNlcwotICogb2YgdGhpcyBjbGFzcyB3aXRoIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9OwotICogaW5zdGFuY2VzIGFyZSBhbHJlYWR5IHRocmVhZC1zYWZlLiAgVW5mb3J0dW5hdGVseSwgaG93ZXZlciwgdGhpcyBtZWFucyAKLSAqIHRoYXQgdGhpcyBtYXAgaW1wbGVtZW50YXRpb24gYmVoYXZlcyBpbiB3YXlzIHlvdSBtYXkgZmluZCBkaXNjb25jZXJ0aW5nLiAgCi0gKiBCdWxrIG9wZXJhdGlvbnMsIHN1Y2ggYXMge0BsaW5rICNwdXRBbGwoTWFwKSBwdXRBbGx9IG9yIHRoZQotICoge0BsaW5rIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pIHJldGFpbkFsbH0gb3BlcmF0aW9uIGluIGNvbGxlY3Rpb24gCi0gKiB2aWV3cywgYXJlIDxpPm5vdDwvaT4gYXRvbWljLiAgSWYgdHdvIHRocmVhZHMgYXJlIHNpbXVsdGFuZW91c2x5IAotICogZXhlY3V0aW5nIAotICoKLSAqIDxwcmU+Ci0gKiAgIHN0YXRpY0J1Y2tldE1hcEluc3RhbmNlLnB1dEFsbChtYXApOwotICogPC9wcmU+Ci0gKgotICogYW5kCi0gKgotICogPHByZT4KLSAqICAgc3RhdGljQnVja2V0TWFwSW5zdGFuY2UuZW50cnlTZXQoKS5yZW1vdmVBbGwobWFwLmVudHJ5U2V0KCkpOwotICogPC9wcmU+Ci0gKgotICogdGhlbiB0aGUgcmVzdWx0cyBhcmUgZ2VuZXJhbGx5IHJhbmRvbS4gIFRob3NlIHR3byBzdGF0ZW1lbnQgY291bGQgY2FuY2VsCi0gKiBlYWNoIG90aGVyIG91dCwgbGVhdmluZyA8Y29kZT5zdGF0aWNCdWNrZXRNYXBJbnN0YW5jZTwvY29kZT4gZXNzZW50aWFsbHkgCi0gKiB1bmNoYW5nZWQsIG9yIHRoZXkgY291bGQgbGVhdmUgc29tZSByYW5kb20gc3Vic2V0IG9mIDxjb2RlPm1hcDwvY29kZT4gaW4gCi0gKiA8Y29kZT5zdGF0aWNCdWNrZXRNYXBJbnN0YW5jZTwvY29kZT4uPHA+Ci0gKgotICogQWxzbywgbXVjaCBsaWtlIGFuIGVuY3ljbG9wZWRpYSwgdGhlIHJlc3VsdHMgb2Yge0BsaW5rICNzaXplKCl9IGFuZCAKLSAqIHtAbGluayAjaXNFbXB0eSgpfSBhcmUgb3V0LW9mLWRhdGUgYXMgc29vbiBhcyB0aGV5IGFyZSBwcm9kdWNlZC48cD4KLSAqCi0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uIHZpZXdzIG9mIHRoaXMgY2xhc3MgYXJlIDxpPm5vdDwvaT4KLSAqIGZhaWwtZmFzdC4gIFRoZXkgd2lsbCA8aT5uZXZlcjwvaT4gcmFpc2UgYSAKLSAqIHtAbGluayBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uICBLZXlzIGFuZCB2YWx1ZXMgCi0gKiBhZGRlZCB0byB0aGUgbWFwIGFmdGVyIHRoZSBpdGVyYXRvciBpcyBjcmVhdGVkIGRvIG5vdCBuZWNlc3NhcmlseSBhcHBlYXIKLSAqIGR1cmluZyBpdGVyYXRpb24uICBTaW1pbGFybHksIHRoZSBpdGVyYXRvciBkb2VzIG5vdCBuZWNlc3NhcmlseSBmYWlsIHRvIAotICogcmV0dXJuIGtleXMgYW5kIHZhbHVlcyB0aGF0IHdlcmUgcmVtb3ZlZCBhZnRlciB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQuPHA+Ci0gKgotICogRmluYWxseSwgdW5saWtlIHtAbGluayBqYXZhLnV0aWwuSGFzaE1hcH0tc3R5bGUgaW1wbGVtZW50YXRpb25zLCB0aGlzCi0gKiBjbGFzcyA8aT5uZXZlcjwvaT4gcmVoYXNoZXMgdGhlIG1hcC4gIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpcyBmaXhlZCAKLSAqIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGFuZCBuZXZlciBhbHRlcmVkLiAgUGVyZm9ybWFuY2UgbWF5IGRlZ3JhZGUgaWYgCi0gKiB5b3UgZG8gbm90IGFsbG9jYXRlIGVub3VnaCBidWNrZXRzIHVwZnJvbnQuPHA+Ci0gKgotICogVGhlIHtAbGluayAjYXRvbWljKFJ1bm5hYmxlKX0gbWV0aG9kIGlzIHByb3ZpZGVkIHRvIGFsbG93IGF0b21pYyBpdGVyYXRpb25zCi0gKiBhbmQgYnVsayBvcGVyYXRpb25zOyBob3dldmVyLCBvdmVydXNlIG9mIHtAbGluayAjYXRvbWljKFJ1bm5hYmxlKSBhdG9taWN9Ci0gKiB3aWxsIGJhc2ljYWxseSByZXN1bHQgaW4gYSBtYXAgdGhhdCdzIHNsb3dlciB0aGFuIGFuIG9yZGluYXJ5IHN5bmNocm9uaXplZAotICoge0BsaW5rIGphdmEudXRpbC5IYXNoTWFwfS4KLSAqCi0gKiBVc2UgdGhpcyBjbGFzcyBpZiB5b3UgZG8gbm90IHJlcXVpcmUgcmVsaWFibGUgYnVsayBvcGVyYXRpb25zIGFuZCAKLSAqIGl0ZXJhdGlvbnMsIG9yIGlmIHlvdSBjYW4gbWFrZSB5b3VyIG93biBndWFyYW50ZWVzIGFib3V0IGhvdyBidWxrIAotICogb3BlcmF0aW9ucyB3aWxsIGFmZmVjdCB0aGUgbWFwLjxwPgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMCAocHJldmlvdXNseSBpbiBtYWluIHBhY2thZ2UgdjIuMSkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzAgJAotICogCi0gKiBAYXV0aG9yIEJlcmluIExvcml0c2NoCi0gKiBAYXV0aG9yIEdlcmhhcmQgRnJvZWhsaWNoCi0gKiBAYXV0aG9yIE1pY2hhZWwgQS4gU21pdGgKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKiBAYXV0aG9yIExlbyBTdXRpYwotICogQGF1dGhvciBKYW5layBCb2d1Y2tpCi0gKiBAYXV0aG9yIEthenV5YSBVamloYXJhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0aWNCdWNrZXRNYXAgaW1wbGVtZW50cyBNYXAgewotCi0gICAgLyoqIFRoZSBkZWZhdWx0IG51bWJlciBvZiBidWNrZXRzIHRvIHVzZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVQ0tFVFMgPSAyNTU7Ci0gICAgLyoqIFRoZSBhcnJheSBvZiBidWNrZXRzLCB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaXMgaGVsZCAqLwotICAgIHByaXZhdGUgTm9kZVtdIGJ1Y2tldHM7Ci0gICAgLyoqIFRoZSBtYXRjaGluZyBhcnJheSBvZiBsb2NrcyAqLwotICAgIHByaXZhdGUgTG9ja1tdIGxvY2tzOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG51bWJlciBvZiBidWNrZXRzICgyNTUpLgotICAgICAqLwotICAgIHB1YmxpYyBTdGF0aWNCdWNrZXRNYXAoKSB7Ci0gICAgICAgIHRoaXMoREVGQVVMVF9CVUNLRVRTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbWFwIHdpdGggYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ1Y2tldHMuICBUaGUgbnVtYmVyCi0gICAgICogb2YgYnVja2V0cyBpcyBuZXZlciBiZWxvdyAxNywgYW5kIGlzIGFsd2F5cyBhbiBvZGQgbnVtYmVyIChTdGF0aWNCdWNrZXRNYXAKLSAgICAgKiBlbnN1cmVzIHRoaXMpLiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUKLSAgICAgKiBjaGFuY2VzIGZvciB0aHJlYWQgY29udGVudGlvbi4gIFRoZSBmZXdlciBidWNrZXRzLCB0aGUgbW9yZSBjaGFuY2VzIGZvcgotICAgICAqIHRocmVhZCBjb250ZW50aW9uLiAgVGhlIG1vcmUgYnVja2V0cyB0aGUgZmV3ZXIgY2hhbmNlcyBmb3IgdGhyZWFkCi0gICAgICogY29udGVudGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBudW1CdWNrZXRzICB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgZm9yIHRoaXMgbWFwCi0gICAgICovCi0gICAgcHVibGljIFN0YXRpY0J1Y2tldE1hcChpbnQgbnVtQnVja2V0cykgewotICAgICAgICBpbnQgc2l6ZSA9IE1hdGgubWF4KDE3LCBudW1CdWNrZXRzKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWNrZXRTaXplIGlzIG5ldmVyIGEgcG93ZXIgb2YgMiAodG8gZW5zdXJlIG1heGltYWwgZGlzdHJpYnV0aW9uKQotICAgICAgICBpZiAoc2l6ZSAlIDIgPT0gMCkgewotICAgICAgICAgICAgc2l6ZS0tOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVja2V0cyA9IG5ldyBOb2RlW3NpemVdOwotICAgICAgICBsb2NrcyA9IG5ldyBMb2NrW3NpemVdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBsb2Nrc1tpXSA9IG5ldyBMb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBleGFjdCBoYXNoIGVudHJ5IGZvciB0aGUga2V5LiAgVGhlIGhhc2ggYWxnb3JpdGhtCi0gICAgICogaXMgcmF0aGVyIHNpbXBsaXN0aWMsIGJ1dCBpdCBkb2VzIHRoZSBqb2I6Ci0gICAgICoKLSAgICAgKiA8cHJlPgotICAgICAqICAgSGUgPSB8SGsgbW9kIG58Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiAgIEhlIGlzIHRoZSBlbnRyeSdzIGhhc2hDb2RlLCBIayBpcyB0aGUga2V5J3MgaGFzaENvZGUsIGFuZCBuIGlzCi0gICAgICogICB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGdldEhhc2goT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIGhhc2ggKz0gfihoYXNoIDw8IDE1KTsKLSAgICAgICAgaGFzaCBePSAoaGFzaCA+Pj4gMTApOwotICAgICAgICBoYXNoICs9IChoYXNoIDw8IDMpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiA2KTsKLSAgICAgICAgaGFzaCArPSB+KGhhc2ggPDwgMTEpOwotICAgICAgICBoYXNoIF49IChoYXNoID4+PiAxNik7Ci0gICAgICAgIGhhc2ggJT0gYnVja2V0cy5sZW5ndGg7Ci0gICAgICAgIHJldHVybiAoaGFzaCA8IDApID8gaGFzaCAqIC0xIDogaGFzaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIG1hcC4KLSAgICAgKiBUaGUgdmFsdWUgaXMgY29tcHV0ZWQgZnJlc2ggZWFjaCB0aW1lIHRoZSBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IGNudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWNrZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbnQgKz0gbG9ja3NbaV0uc2l6ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY250OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc2l6ZSBpcyBjdXJyZW50bHkgemVyby4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gKHNpemUoKSA9PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKGtleSk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChsb2Nrc1toYXNoXSkgewotICAgICAgICAgICAgTm9kZSBuID0gYnVja2V0c1toYXNoXTsKLQotICAgICAgICAgICAgd2hpbGUgKG4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChuLmtleSA9PSBrZXkgfHwgKG4ua2V5ICE9IG51bGwgJiYgbi5rZXkuZXF1YWxzKGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG4gPSBuLm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleSAgdGhlIGtleSB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKGtleSk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChsb2Nrc1toYXNoXSkgewotICAgICAgICAgICAgTm9kZSBuID0gYnVja2V0c1toYXNoXTsKLQotICAgICAgICAgICAgd2hpbGUgKG4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChuLmtleSA9PSBrZXkgfHwgKG4ua2V5ICE9IG51bGwgJiYgbi5rZXkuZXF1YWxzKGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG4gPSBuLm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9ja3NbaV0pIHsKLSAgICAgICAgICAgICAgICBOb2RlIG4gPSBidWNrZXRzW2ldOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKG4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PSB2YWx1ZSB8fCAobi52YWx1ZSAhPSBudWxsICYmIG4udmFsdWUuZXF1YWxzKHZhbHVlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbiA9IG4ubmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBQdXRzIGEgbmV3IGtleSB2YWx1ZSBtYXBwaW5nIGludG8gdGhlIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5ICB0aGUga2V5IHRvIHVzZQotICAgICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIHRvIHVzZQotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIG1hcHBpbmcgZm9yIHRoZSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKGtleSk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChsb2Nrc1toYXNoXSkgewotICAgICAgICAgICAgTm9kZSBuID0gYnVja2V0c1toYXNoXTsKLQotICAgICAgICAgICAgaWYgKG4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSgpOwotICAgICAgICAgICAgICAgIG4ua2V5ID0ga2V5OwotICAgICAgICAgICAgICAgIG4udmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBidWNrZXRzW2hhc2hdID0gbjsKLSAgICAgICAgICAgICAgICBsb2Nrc1toYXNoXS5zaXplKys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCBuIHRvIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpbmtlZCBsaXN0LiAgQ2hlY2sgZWFjaCBrZXkgYWxvbmcgdGhlIHdheQotICAgICAgICAgICAgLy8gIElmIHRoZSBrZXkgaXMgZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGF0IG5vZGUgYW5kIHJldHVybgotICAgICAgICAgICAgLy8gIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICBmb3IgKE5vZGUgbmV4dCA9IG47IG5leHQgIT0gbnVsbDsgbmV4dCA9IG5leHQubmV4dCkgewotICAgICAgICAgICAgICAgIG4gPSBuZXh0OwotCi0gICAgICAgICAgICAgICAgaWYgKG4ua2V5ID09IGtleSB8fCAobi5rZXkgIT0gbnVsbCAmJiBuLmtleS5lcXVhbHMoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbCA9IG4udmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBrZXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBsaXN0IG9mIG5vZGVzLCBhZGQgaXQgdG8gdGhlIGVuZAotICAgICAgICAgICAgLy8gIGluIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICBOb2RlIG5ld05vZGUgPSBuZXcgTm9kZSgpOwotICAgICAgICAgICAgbmV3Tm9kZS5rZXkgPSBrZXk7Ci0gICAgICAgICAgICBuZXdOb2RlLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICBuLm5leHQgPSBuZXdOb2RlOwotICAgICAgICAgICAgbG9ja3NbaGFzaF0uc2l6ZSsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgYXQgdGhpcyBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGludCBoYXNoID0gZ2V0SGFzaChrZXkpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobG9ja3NbaGFzaF0pIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IGJ1Y2tldHNbaGFzaF07Ci0gICAgICAgICAgICBOb2RlIHByZXYgPSBudWxsOwotCi0gICAgICAgICAgICB3aGlsZSAobiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG4ua2V5ID09IGtleSB8fCAobi5rZXkgIT0gbnVsbCAmJiBuLmtleS5lcXVhbHMoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbm9kZSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBvZiBub2Rlcy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJldikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIHdhcyB0aGUgaGVhZCwgc2V0IHRoZSBuZXh0IG5vZGUgdG8gYmUgdGhlIG5ldyBoZWFkLgotICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0c1toYXNoXSA9IG4ubmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV4dCBub2RlIG9mIHRoZSBwcmV2aW91cyBub2RlIHRvIGJlIHRoZSBub2RlIGFmdGVyIHRoaXMgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbi5uZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2tzW2hhc2hdLnNpemUtLTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJldiA9IG47Ci0gICAgICAgICAgICAgICAgbiA9IG4ubmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGtleSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IHNldAotICAgICAqLwotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IEtleVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmFsdWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW50cnkgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVudHJ5IHNldAotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogUHV0cyBhbGwgdGhlIGVudHJpZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCBpbnRvIHRoaXMgbWFwLgotICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIDxiPm5vdCBhdG9taWM8L2I+IGFuZCBtYXkgaGF2ZSB1bmRlc2lyZWQgZWZmZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIG9mIGVudHJpZXMgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXApIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGkubmV4dCgpOwotICAgICAgICAgICAgcHV0KGtleSwgbWFwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgbWFwIG9mIGFsbCBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIExvY2sgbG9jayA9IGxvY2tzW2ldOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICAgICAgYnVja2V0c1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbG9jay5zaXplID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgbWFwIHRvIGFub3RoZXIsIGFzIHBlciB0aGUgTWFwIHNwZWNpZmljYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG90aGVyID0gKE1hcCkgb2JqOwotICAgICAgICByZXR1cm4gZW50cnlTZXQoKS5lcXVhbHMob3RoZXIuZW50cnlTZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgaGFzaCBjb2RlLCBhcyBwZXIgdGhlIE1hcCBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBoYXNoQ29kZSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWNrZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2tzW2ldKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBuID0gYnVja2V0c1tpXTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzaENvZGUgKz0gbi5oYXNoQ29kZSgpOwotICAgICAgICAgICAgICAgICAgICBuID0gbi5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFRoZSBNYXAuRW50cnkgZm9yIHRoZSBTdGF0aWNCdWNrZXRNYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIE1hcC5FbnRyeSwgS2V5VmFsdWUgewotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGtleTsKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgcHJvdGVjdGVkIE5vZGUgbmV4dDsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGtleSA9PSBudWxsID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeCi0gICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXAuRW50cnkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlMiA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIHJldHVybiAoCi0gICAgICAgICAgICAgICAgKGtleSA9PSBudWxsID8gZTIuZ2V0S2V5KCkgPT0gbnVsbCA6IGtleS5lcXVhbHMoZTIuZ2V0S2V5KCkpKSAmJgotICAgICAgICAgICAgICAgICh2YWx1ZSA9PSBudWxsID8gZTIuZ2V0VmFsdWUoKSA9PSBudWxsIDogdmFsdWUuZXF1YWxzKGUyLmdldFZhbHVlKCkpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIE9iamVjdCByZXRWYWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIHZhbHVlID0gb2JqOwotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2sgb2JqZWN0LCB3aGljaCBhbHNvIGluY2x1ZGVzIGEgY291bnQgb2YgdGhlIG5vZGVzIGluIHRoaXMgbG9jay4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBMb2NrIHsKLSAgICAgICAgcHVibGljIGludCBzaXplOwotICAgIH0KLQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBjdXJyZW50ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIGludCBidWNrZXQ7Ci0gICAgICAgIHByaXZhdGUgTWFwLkVudHJ5IGxhc3Q7Ci0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQuc2l6ZSgpID4gMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB3aGlsZSAoYnVja2V0IDwgYnVja2V0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2tzW2J1Y2tldF0pIHsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSBuID0gYnVja2V0c1tidWNrZXRdOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZChuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVja2V0Kys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnNpemUoKSA+IDApIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBNYXAuRW50cnkgbmV4dEVudHJ5KCkgewotICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBsYXN0ID0gKE1hcC5FbnRyeSljdXJyZW50LnJlbW92ZShjdXJyZW50LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBTdGF0aWNCdWNrZXRNYXAudGhpcy5yZW1vdmUobGFzdC5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZUl0ZXJhdG9yIGV4dGVuZHMgRW50cnlJdGVyYXRvciB7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgS2V5SXRlcmF0b3IgZXh0ZW5kcyBFbnRyeUl0ZXJhdG9yIHsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCkuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldCB7Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0YXRpY0J1Y2tldE1hcC50aGlzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgU3RhdGljQnVja2V0TWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgb2JqOwotICAgICAgICAgICAgaW50IGhhc2ggPSBnZXRIYXNoKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobG9ja3NbaGFzaF0pIHsKLSAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbiA9IGJ1Y2tldHNbaGFzaF07IG4gIT0gbnVsbDsgbiA9IG4ubmV4dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobi5lcXVhbHMoZW50cnkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG9iajsKLSAgICAgICAgICAgIGludCBoYXNoID0gZ2V0SGFzaChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2tzW2hhc2hdKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChOb2RlIG4gPSBidWNrZXRzW2hhc2hdOyBuICE9IG51bGw7IG4gPSBuLm5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4uZXF1YWxzKGVudHJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljQnVja2V0TWFwLnRoaXMucmVtb3ZlKG4uZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBLZXlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldCB7Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0YXRpY0J1Y2tldE1hcC50aGlzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgU3RhdGljQnVja2V0TWFwLnRoaXMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgS2V5SXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0aWNCdWNrZXRNYXAudGhpcy5jb250YWluc0tleShvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGludCBoYXNoID0gZ2V0SGFzaChvYmopOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2Nrc1toYXNoXSkgewotICAgICAgICAgICAgICAgIGZvciAoTm9kZSBuID0gYnVja2V0c1toYXNoXTsgbiAhPSBudWxsOyBuID0gbi5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBrID0gbi5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChrID09IG9iaikgfHwgKChrICE9IG51bGwpICYmIGsuZXF1YWxzKG9iaikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNCdWNrZXRNYXAudGhpcy5yZW1vdmUoayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIHsKLQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdGljQnVja2V0TWFwLnRoaXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBTdGF0aWNCdWNrZXRNYXAudGhpcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIFByZXZlbnRzIGFueSBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIG9uIHRoaXMgbWFwIHdoaWxlIHRoZQotICAgICAqICBnaXZlbiB7QGxpbmsgUnVubmFibGV9IGV4ZWN1dGVzLiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQsIGZvcgotICAgICAqICBpbnN0YW5jZSwgdG8gZXhlY3V0ZSBhIGJ1bGsgb3BlcmF0aW9uIGF0b21pY2FsbHk6IAotICAgICAqCi0gICAgICogIDxwcmU+Ci0gICAgICogICAgc3RhdGljQnVja2V0TWFwSW5zdGFuY2UuYXRvbWljKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgKiAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAqICAgICAgICAgICAgc3RhdGljQnVja2V0TWFwSW5zdGFuY2UucHV0QWxsKG1hcCk7Ci0gICAgICogICAgICAgIH0KLSAgICAgKiAgICB9KTsKLSAgICAgKiAgPC9wcmU+Ci0gICAgICoKLSAgICAgKiAgSXQgY2FuIGFsc28gYmUgdXNlZCBpZiB5b3UgbmVlZCBhIHJlbGlhYmxlIGl0ZXJhdG9yOgotICAgICAqCi0gICAgICogIDxwcmU+Ci0gICAgICogICAgc3RhdGljQnVja2V0TWFwSW5zdGFuY2UuYXRvbWljKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgKiAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAqICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzdGF0aWNCdWNrZXRNYXBJbnN0YW5jZS5pdGVyYXRvcigpOwotICAgICAqICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAqICAgICAgICAgICAgICAgIGZvbyhpdGVyYXRvci5uZXh0KCk7Ci0gICAgICogICAgICAgICAgICB9Ci0gICAgICogICAgICAgIH0KLSAgICAgKiAgICB9KTsKLSAgICAgKiAgPC9wcmU+Ci0gICAgICoKLSAgICAgKiAgPGI+SW1wbGVtZW50YXRpb24gbm90ZTo8L2I+IFRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgbG90IG9mIHRpbWUKLSAgICAgKiAgYW5kIGEgdG9uIG9mIHN0YWNrIHNwYWNlLiAgRXNzZW50aWFsbHkgYSByZWN1cnNpdmUgYWxnb3JpdGhtIGlzIHVzZWQKLSAgICAgKiAgdG8gZW50ZXIgZWFjaCBidWNrZXQncyBtb25pdG9yLiAgSWYgeW91IGhhdmUgdHdlbnR5IHRob3VzYW5kIGJ1Y2tldHMKLSAgICAgKiAgaW4geW91ciBtYXAsIHRoZW4gdGhlIHJlY3Vyc2l2ZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHR3ZW50eSB0aG91c2FuZAotICAgICAqICB0aW1lcy4gIFlvdSBoYXZlIGJlZW4gd2FybmVkLgotICAgICAqCi0gICAgICogIEBwYXJhbSByICB0aGUgY29kZSB0byBleGVjdXRlIGF0b21pY2FsbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdG9taWMoUnVubmFibGUgcikgewotICAgICAgICBpZiAociA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgYXRvbWljKHIsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdG9taWMoUnVubmFibGUgciwgaW50IGJ1Y2tldCkgewotICAgICAgICBpZiAoYnVja2V0ID49IGJ1Y2tldHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICByLnJ1bigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9ja3NbYnVja2V0XSkgewotICAgICAgICAgICAgYXRvbWljKHIsIGJ1Y2tldCArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1RyYW5zZm9ybWVkTWFwLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1RyYW5zZm9ybWVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMmRlODguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UcmFuc2Zvcm1lZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPk1hcDwvY29kZT4gdG8gdHJhbnNmb3JtIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQuCi0gKiA8cD4KLSAqIFRoZSBNYXAgcHV0IG1ldGhvZHMgYW5kIE1hcC5FbnRyeSBzZXRWYWx1ZSBtZXRob2QgYXJlIGFmZmVjdGVkIGJ5IHRoaXMgY2xhc3MuCi0gKiBUaHVzIG9iamVjdHMgbXVzdCBiZSByZW1vdmVkIG9yIHNlYXJjaGVkIGZvciB1c2luZyB0aGVpciB0cmFuc2Zvcm1lZCBmb3JtLgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb252ZXJ0cyBTdHJpbmdzIHRvIEludGVnZXJzLCB5b3UgbXVzdAotICogdXNlIHRoZSBJbnRlZ2VyIGZvcm0gdG8gcmVtb3ZlIG9iamVjdHMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IFRyYW5zZm9ybWVkTWFwIGlzIG5vdCBzeW5jaHJvbml6ZWQgYW5kIGlzIG5vdCB0aHJlYWQtc2FmZS48L3N0cm9uZz4KLSAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIG1hcCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB5b3UgbXVzdCB1c2UKLSAqIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4gVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzIHRvIHdyYXAgdGhpcyBtYXAKLSAqIHVzaW5nIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RJbnB1dENoZWNrZWRNYXBEZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcwMjMxNTIzNzY3ODg5MDA0NjRMOwotCi0gICAgLyoqIFRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIHRoZSBrZXkgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgVHJhbnNmb3JtZXIga2V5VHJhbnNmb3JtZXI7Ci0gICAgLyoqIFRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIHRoZSB2YWx1ZSAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lciB2YWx1ZVRyYW5zZm9ybWVyOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHJhbnNmb3JtaW5nIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIENvbnN0cmFzdCB0aGlzIHdpdGgge0BsaW5rICNkZWNvcmF0ZVRyYW5zZm9ybX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3Iga2V5IGNvbnZlcnNpb24sIG51bGwgbWVhbnMgbm8gdHJhbnNmb3JtYXRpb24KLSAgICAgKiBAcGFyYW0gdmFsdWVUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgdmFsdWUgY29udmVyc2lvbiwgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGUoTWFwIG1hcCwgVHJhbnNmb3JtZXIga2V5VHJhbnNmb3JtZXIsIFRyYW5zZm9ybWVyIHZhbHVlVHJhbnNmb3JtZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lZE1hcChtYXAsIGtleVRyYW5zZm9ybWVyLCB2YWx1ZVRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0cmFuc2Zvcm1pbmcgbWFwIHRoYXQgd2lsbCB0cmFuc2Zvcm0KLSAgICAgKiBleGlzdGluZyBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiB3aWxsIGJlIHRyYW5zZm9ybWVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqIENvbnN0cmFzdCB0aGlzIHdpdGgge0BsaW5rICNkZWNvcmF0ZX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3Iga2V5IGNvbnZlcnNpb24sIG51bGwgbWVhbnMgbm8gdHJhbnNmb3JtYXRpb24KLSAgICAgKiBAcGFyYW0gdmFsdWVUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgdmFsdWUgY29udmVyc2lvbiwgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZGVjb3JhdGVUcmFuc2Zvcm0oTWFwIG1hcCwgVHJhbnNmb3JtZXIga2V5VHJhbnNmb3JtZXIsIFRyYW5zZm9ybWVyIHZhbHVlVHJhbnNmb3JtZXIpIHsKLSAgICAgICAgVHJhbnNmb3JtZWRNYXAgZGVjb3JhdGVkID0gbmV3IFRyYW5zZm9ybWVkTWFwKG1hcCwga2V5VHJhbnNmb3JtZXIsIHZhbHVlVHJhbnNmb3JtZXIpOwotICAgICAgICBpZiAobWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1hcCB0cmFuc2Zvcm1lZCA9IGRlY29yYXRlZC50cmFuc2Zvcm1NYXAobWFwKTsKLSAgICAgICAgICAgIGRlY29yYXRlZC5jbGVhcigpOwotICAgICAgICAgICAgZGVjb3JhdGVkLmdldE1hcCgpLnB1dEFsbCh0cmFuc2Zvcm1lZCk7ICAvLyBhdm9pZHMgZG91YmxlIHRyYW5zZm9ybWF0aW9uCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlY29yYXRlZDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUcmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3Iga2V5IGNvbnZlcnNpb24sIG51bGwgbWVhbnMgbm8gY29udmVyc2lvbgotICAgICAqIEBwYXJhbSB2YWx1ZVRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciB2YWx1ZSBjb252ZXJzaW9uLCBudWxsIG1lYW5zIG5vIGNvbnZlcnNpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2Zvcm1lZE1hcChNYXAgbWFwLCBUcmFuc2Zvcm1lciBrZXlUcmFuc2Zvcm1lciwgVHJhbnNmb3JtZXIgdmFsdWVUcmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcihtYXApOwotICAgICAgICB0aGlzLmtleVRyYW5zZm9ybWVyID0ga2V5VHJhbnNmb3JtZXI7Ci0gICAgICAgIHRoaXMudmFsdWVUcmFuc2Zvcm1lciA9IHZhbHVlVHJhbnNmb3JtZXI7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBtYXAgPSAoTWFwKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgYSBrZXkuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHRyYW5zZm9ybWVyIGl0c2VsZiBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICB0aGUgb2JqZWN0IHRvIHRyYW5zZm9ybQotICAgICAqIEB0aHJvd3MgdGhlIHRyYW5zZm9ybWVkIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgdHJhbnNmb3JtS2V5KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKGtleVRyYW5zZm9ybWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVRyYW5zZm9ybWVyLnRyYW5zZm9ybShvYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgYSB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgaXRzZWxmIG1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QgIHRoZSBvYmplY3QgdG8gdHJhbnNmb3JtCi0gICAgICogQHRocm93cyB0aGUgdHJhbnNmb3JtZWQgb2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmICh2YWx1ZVRyYW5zZm9ybWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlVHJhbnNmb3JtZXIudHJhbnNmb3JtKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyBhIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHJhbnNmb3JtZXIgaXRzZWxmIG1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gdHJhbnNmb3JtCi0gICAgICogQHRocm93cyB0aGUgdHJhbnNmb3JtZWQgb2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCB0cmFuc2Zvcm1NYXAoTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZE1hcChtYXAuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KHRyYW5zZm9ybUtleShlbnRyeS5nZXRLZXkoKSksIHRyYW5zZm9ybVZhbHVlKGVudHJ5LmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgd2hlbiB1c2luZyA8Y29kZT5zZXRWYWx1ZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUgdG8gdHJhbnNmb3JtCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgdmFsdWUKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNoZWNrU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZVRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gb25seSByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlIGlzIGEgdmFsdWUgdHJhbnNmb3JtZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmFsdWUgdHJhbnNmb3JtZXIgaXMgaW4gdXNlCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRWYWx1ZUNoZWNraW5nKCkgewotICAgICAgICByZXR1cm4gKHZhbHVlVHJhbnNmb3JtZXIgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBrZXkgPSB0cmFuc2Zvcm1LZXkoa2V5KTsKLSAgICAgICAgdmFsdWUgPSB0cmFuc2Zvcm1WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBnZXRNYXAoKS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXBUb0NvcHkpIHsKLSAgICAgICAgbWFwVG9Db3B5ID0gdHJhbnNmb3JtTWFwKG1hcFRvQ29weSk7Ci0gICAgICAgIGdldE1hcCgpLnB1dEFsbChtYXBUb0NvcHkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UcmFuc2Zvcm1lZFNvcnRlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UcmFuc2Zvcm1lZFNvcnRlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWU2MTU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHJhbnNmb3JtZWRTb3J0ZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRNYXAgPC9jb2RlPiB0byB0cmFuc2Zvcm0gb2JqZWN0cyB0aGF0IGFyZSBhZGRlZC4KLSAqIDxwPgotICogVGhlIE1hcCBwdXQgbWV0aG9kcyBhbmQgTWFwLkVudHJ5IHNldFZhbHVlIG1ldGhvZCBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjbGFzcy4KLSAqIFRodXMgb2JqZWN0cyBtdXN0IGJlIHJlbW92ZWQgb3Igc2VhcmNoZWQgZm9yIHVzaW5nIHRoZWlyIHRyYW5zZm9ybWVkIGZvcm0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNvbnZlcnRzIFN0cmluZ3MgdG8gSW50ZWdlcnMsIHlvdSBtdXN0Ci0gKiB1c2UgdGhlIEludGVnZXIgZm9ybSB0byByZW1vdmUgb2JqZWN0cy4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgVHJhbnNmb3JtZWRTb3J0ZWRNYXAgaXMgbm90IHN5bmNocm9uaXplZCBhbmQgaXMgbm90IHRocmVhZC1zYWZlLjwvc3Ryb25nPgotICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgbWFwIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHlvdSBtdXN0IHVzZQotICogYXBwcm9wcmlhdGUgc3luY2hyb25pemF0aW9uLiBUaGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gd3JhcCB0aGlzIG1hcAotICogdXNpbmcge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTb3J0ZWRNYXB9LiBUaGlzIGNsYXNzIG1heSB0aHJvdyAKLSAqIGV4Y2VwdGlvbnMgd2hlbiBhY2Nlc3NlZCBieSBjb25jdXJyZW50IHRocmVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMwICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkU29ydGVkTWFwCi0gICAgICAgIGV4dGVuZHMgVHJhbnNmb3JtZWRNYXAKLSAgICAgICAgaW1wbGVtZW50cyBTb3J0ZWRNYXAgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NzUxNzcxNjc2NDEwMzg1Nzc4TDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0cmFuc2Zvcm1pbmcgc29ydGVkIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIENvbnN0cmFzdCB0aGlzIHdpdGgge0BsaW5rICNkZWNvcmF0ZVRyYW5zZm9ybX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUcmFuc2Zvcm1lciAgdGhlIHByZWRpY2F0ZSB0byB2YWxpZGF0ZSB0aGUga2V5cywgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZVRyYW5zZm9ybWVyICB0aGUgcHJlZGljYXRlIHRvIHZhbGlkYXRlIHRvIHZhbHVlcywgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGRlY29yYXRlKFNvcnRlZE1hcCBtYXAsIFRyYW5zZm9ybWVyIGtleVRyYW5zZm9ybWVyLCBUcmFuc2Zvcm1lciB2YWx1ZVRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRNYXAobWFwLCBrZXlUcmFuc2Zvcm1lciwgdmFsdWVUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHJhbnNmb3JtaW5nIHNvcnRlZCBtYXAgdGhhdCB3aWxsIHRyYW5zZm9ybQotICAgICAqIGV4aXN0aW5nIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIHdpbGwgYmUgdHJhbnNmb3JtZWQgYnkgdGhpcyBtZXRob2QuCi0gICAgICogQ29uc3RyYXN0IHRoaXMgd2l0aCB7QGxpbmsgI2RlY29yYXRlfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGtleVRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciBrZXkgY29udmVyc2lvbiwgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZVRyYW5zZm9ybWVyICB0aGUgdHJhbnNmb3JtZXIgdG8gdXNlIGZvciB2YWx1ZSBjb252ZXJzaW9uLCBudWxsIG1lYW5zIG5vIHRyYW5zZm9ybWF0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBkZWNvcmF0ZVRyYW5zZm9ybShTb3J0ZWRNYXAgbWFwLCBUcmFuc2Zvcm1lciBrZXlUcmFuc2Zvcm1lciwgVHJhbnNmb3JtZXIgdmFsdWVUcmFuc2Zvcm1lcikgewotICAgICAgICBUcmFuc2Zvcm1lZFNvcnRlZE1hcCBkZWNvcmF0ZWQgPSBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRNYXAobWFwLCBrZXlUcmFuc2Zvcm1lciwgdmFsdWVUcmFuc2Zvcm1lcik7Ci0gICAgICAgIGlmIChtYXAuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgTWFwIHRyYW5zZm9ybWVkID0gZGVjb3JhdGVkLnRyYW5zZm9ybU1hcChtYXApOwotICAgICAgICAgICAgZGVjb3JhdGVkLmNsZWFyKCk7Ci0gICAgICAgICAgICBkZWNvcmF0ZWQuZ2V0TWFwKCkucHV0QWxsKHRyYW5zZm9ybWVkKTsgIC8vIGF2b2lkcyBkb3VibGUgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVjb3JhdGVkOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIE5PVCB0cmFuc2Zvcm1lZC48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUcmFuc2Zvcm1lciAgdGhlIHByZWRpY2F0ZSB0byB2YWxpZGF0ZSB0aGUga2V5cywgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZVRyYW5zZm9ybWVyICB0aGUgcHJlZGljYXRlIHRvIHZhbGlkYXRlIHRvIHZhbHVlcywgbnVsbCBtZWFucyBubyB0cmFuc2Zvcm1hdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2Zvcm1lZFNvcnRlZE1hcChTb3J0ZWRNYXAgbWFwLCBUcmFuc2Zvcm1lciBrZXlUcmFuc2Zvcm1lciwgVHJhbnNmb3JtZXIgdmFsdWVUcmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcihtYXAsIGtleVRyYW5zZm9ybWVyLCB2YWx1ZVRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgbWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNvcnRlZE1hcCBnZXRTb3J0ZWRNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoU29ydGVkTWFwKSBtYXA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZmlyc3RLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5maXJzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbGFzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmxhc3RLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkuY29tcGFyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRNYXAgc3ViTWFwKE9iamVjdCBmcm9tS2V5LCBPYmplY3QgdG9LZXkpIHsKLSAgICAgICAgU29ydGVkTWFwIG1hcCA9IGdldFNvcnRlZE1hcCgpLnN1Yk1hcChmcm9tS2V5LCB0b0tleSk7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRNYXAobWFwLCBrZXlUcmFuc2Zvcm1lciwgdmFsdWVUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCBoZWFkTWFwKE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkuaGVhZE1hcCh0b0tleSk7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRNYXAobWFwLCBrZXlUcmFuc2Zvcm1lciwgdmFsdWVUcmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCB0YWlsTWFwKE9iamVjdCBmcm9tS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS50YWlsTWFwKGZyb21LZXkpOwotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkU29ydGVkTWFwKG1hcCwga2V5VHJhbnNmb3JtZXIsIHZhbHVlVHJhbnNmb3JtZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjExYzVjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHlwZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPk1hcDwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBlbGVtZW50cyBhZGRlZAotICogYXJlIG9mIGEgc3BlY2lmaWMgdHlwZS4KLSAqIDxwPgotICogVGhlIHZhbGlkYXRpb24gb2YgYWRkaXRpb25zIGlzIHBlcmZvcm1lZCB2aWEgYW4gaW5zdGFuY2VvZiB0ZXN0IGFnYWluc3QgCi0gKiBhIHNwZWNpZmllZCA8Y29kZT5DbGFzczwvY29kZT4uIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlCi0gKiBjb2xsZWN0aW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBUeXBlZE1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZE1hcChNYXApfS4gVGhpcyBjbGFzcyBtYXkgdGhyb3cgCi0gKiBleGNlcHRpb25zIHdoZW4gYWNjZXNzZWQgYnkgY29uY3VycmVudCB0aHJlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICogPHA+Ci0gKiBUaGUgcmV0dXJuZWQgaW1wbGVtZW50YXRpb24gaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgTWF0dGhldyBIYXd0aG9ybmUKLSAqLwotcHVibGljIGNsYXNzIFR5cGVkTWFwIHsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHR5cGVkIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIG1hcCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0ga2V5VHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgYXMga2V5cywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgIHRoZSB0eXBlIHRvIGFsbG93IGFzIHZhbHVlcywgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3Qgb3IgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxpc3QgY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGRlY29yYXRlKE1hcCBtYXAsIENsYXNzIGtleVR5cGUsIENsYXNzIHZhbHVlVHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRNYXAoCi0gICAgICAgICAgICBtYXAsCi0gICAgICAgICAgICBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKGtleVR5cGUpLAotICAgICAgICAgICAgSW5zdGFuY2VvZlByZWRpY2F0ZS5nZXRJbnN0YW5jZSh2YWx1ZVR5cGUpCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RpdmUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFR5cGVkTWFwKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZFNvcnRlZE1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9UeXBlZFNvcnRlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmM4ZGU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVHlwZWRTb3J0ZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5JbnN0YW5jZW9mUHJlZGljYXRlOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNvcnRlZE1hcDwvY29kZT4gdG8gdmFsaWRhdGUgdGhhdCBlbGVtZW50cyBhZGRlZAotICogYXJlIG9mIGEgc3BlY2lmaWMgdHlwZS4KLSAqIDxwPgotICogVGhlIHZhbGlkYXRpb24gb2YgYWRkaXRpb25zIGlzIHBlcmZvcm1lZCB2aWEgYW4gaW5zdGFuY2VvZiB0ZXN0IGFnYWluc3QgCi0gKiBhIHNwZWNpZmllZCA8Y29kZT5DbGFzczwvY29kZT4uIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlCi0gKiBjb2xsZWN0aW9uLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCBUeXBlZFNvcnRlZE1hcCBpcyBub3Qgc3luY2hyb25pemVkIGFuZCBpcyBub3QgdGhyZWFkLXNhZmUuPC9zdHJvbmc+Ci0gKiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBtYXAgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgeW91IG11c3QgdXNlCi0gKiBhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcyB0byB3cmFwIHRoaXMgbWFwCi0gKiB1c2luZyB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZFNvcnRlZE1hcH0uIFRoaXMgY2xhc3MgbWF5IHRocm93IAotICogZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqIDxwPgotICogVGhlIHJldHVybmVkIGltcGxlbWVudGF0aW9uIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKiBAYXV0aG9yIE1hdHRoZXcgSGF3dGhvcm5lCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZFNvcnRlZE1hcCB7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB0eXBlZCBzb3J0ZWQgbWFwLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgbWFwIGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBrZXlUeXBlICB0aGUgdHlwZSB0byBhbGxvdyBhcyBrZXlzLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgYXMgdmFsdWVzLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGlzdCBvciB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgZGVjb3JhdGUoU29ydGVkTWFwIG1hcCwgQ2xhc3Mga2V5VHlwZSwgQ2xhc3MgdmFsdWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZFNvcnRlZE1hcCgKLSAgICAgICAgICAgIG1hcCwKLSAgICAgICAgICAgIEluc3RhbmNlb2ZQcmVkaWNhdGUuZ2V0SW5zdGFuY2Uoa2V5VHlwZSksCi0gICAgICAgICAgICBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKHZhbHVlVHlwZSkKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGl2ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHlwZWRTb3J0ZWRNYXAoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZUVudHJ5U2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMzFhNjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVFbnRyeVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZS5BYnN0cmFjdE1hcEVudHJ5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuQWJzdHJhY3RTZXREZWNvcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGEgbWFwIGVudHJ5IDxjb2RlPlNldDwvY29kZT4gdG8gZW5zdXJlIGl0IGNhbid0IGJlIGFsdGVyZWQuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVubW9kaWZpYWJsZUVudHJ5U2V0Ci0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXREZWNvcmF0b3IgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUgewotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBzZXQgb2YgTWFwIEVudHJ5IG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZGVjb3JhdGUoU2V0IHNldCkgewotICAgICAgICBpZiAoc2V0IGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlRW50cnlTZXQoc2V0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBVbm1vZGlmaWFibGVFbnRyeVNldChTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUVudHJ5U2V0SXRlcmF0b3IoY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gY29sbGVjdGlvbi50b0FycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFycmF5W2ldID0gbmV3IFVubW9kaWZpYWJsZUVudHJ5KChNYXAuRW50cnkpIGFycmF5W2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdCBhcnJheVtdKSB7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGFycmF5OwotICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgLy8gd2UgbXVzdCBjcmVhdGUgYSBuZXcgYXJyYXkgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIHNpdHVhdGlvbnMKLSAgICAgICAgICAgIC8vIHdoZXJlIGFub3RoZXIgdGhyZWFkIGNvdWxkIGFjY2VzcyBkYXRhIGJlZm9yZSB3ZSBkZWNvcmF0ZSBpdAotICAgICAgICAgICAgcmVzdWx0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gY29sbGVjdGlvbi50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgVW5tb2RpZmlhYmxlRW50cnkoKE1hcC5FbnRyeSkgcmVzdWx0W2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiByZXN1bHQgc2hvdWxkIGJlIHJldHVybmVkIHN0cmFpZ2h0Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29weSBiYWNrIGludG8gaW5wdXQgYXJyYXkgdG8gZnVsZmlsIHRoZSBtZXRob2QgY29udHJhY3QKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIGFycmF5LCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IHJlc3VsdC5sZW5ndGgpIHsKLSAgICAgICAgICAgIGFycmF5W3Jlc3VsdC5sZW5ndGhdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbiBlbnRyeSBzZXQgaXRlcmF0b3IuCi0gICAgICovCi0gICAgZmluYWwgc3RhdGljIGNsYXNzIFVubW9kaWZpYWJsZUVudHJ5U2V0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBVbm1vZGlmaWFibGVFbnRyeVNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihpdGVyYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlRW50cnkoZW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIG1hcCBlbnRyeSB0aGF0IGlzIHVubW9kaWZpYWJsZS4KLSAgICAgKi8KLSAgICBmaW5hbCBzdGF0aWMgY2xhc3MgVW5tb2RpZmlhYmxlRW50cnkgZXh0ZW5kcyBBYnN0cmFjdE1hcEVudHJ5RGVjb3JhdG9yIHsKLQotICAgICAgICBwcm90ZWN0ZWQgVW5tb2RpZmlhYmxlRW50cnkoTWFwLkVudHJ5IGVudHJ5KSB7Ci0gICAgICAgICAgICBzdXBlcihlbnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZU1hcC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGUzOGE3Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5JdGVyYWJsZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlVubW9kaWZpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5Vbm1vZGlmaWFibGVDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuRW50cnlTZXRNYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVW5tb2RpZmlhYmxlU2V0OwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPk1hcDwvY29kZT4gdG8gZW5zdXJlIGl0IGNhbid0IGJlIGFsdGVyZWQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjI5ICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVubW9kaWZpYWJsZU1hcAotICAgICAgICBleHRlbmRzIEFic3RyYWN0TWFwRGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgSXRlcmFibGVNYXAsIFVubW9kaWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzM3MDIzNDI3MjY5MDMxOTQxTDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGRlY29yYXRlKE1hcCBtYXApIHsKLSAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIFVubW9kaWZpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU1hcChtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZU1hcChNYXAgbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBtYXAgb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgbWFwIGluIHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotICAgICAgICBtYXAgPSAoTWFwKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXBUb0NvcHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwSXRlcmF0b3IgbWFwSXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBJdGVyYWJsZU1hcCkgewotICAgICAgICAgICAgTWFwSXRlcmF0b3IgaXQgPSAoKEl0ZXJhYmxlTWFwKSBtYXApLm1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IuZGVjb3JhdGUoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWFwSXRlcmF0b3IgaXQgPSBuZXcgRW50cnlTZXRNYXBJdGVyYXRvcihtYXApOwotICAgICAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yLmRlY29yYXRlKGl0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBzdXBlci5lbnRyeVNldCgpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlRW50cnlTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IHN1cGVyLmtleVNldCgpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlU2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBDb2xsZWN0aW9uIGNvbGwgPSBzdXBlci52YWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUNvbGxlY3Rpb24uZGVjb3JhdGUoY29sbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL1VubW9kaWZpYWJsZU9yZGVyZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTExZTJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlT3JkZXJlZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5NYXBJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLlVubW9kaWZpYWJsZU1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlT3JkZXJlZE1hcEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQuVW5tb2RpZmlhYmxlU2V0OwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPk9yZGVyZWRNYXA8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjoyOSAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVPcmRlcmVkTWFwCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RPcmRlcmVkTWFwRGVjb3JhdG9yCi0gICAgICAgIGltcGxlbWVudHMgVW5tb2RpZmlhYmxlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgxMzY0MjgxNjE3MjA1MjYyNjZMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBzb3J0ZWQgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgIHRoZSBtYXAgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT3JkZXJlZE1hcCBkZWNvcmF0ZShPcmRlcmVkTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlT3JkZXJlZE1hcChtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZU9yZGVyZWRNYXAoT3JkZXJlZE1hcCBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIG1hcCBvdXQgdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBtYXAgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIG1hcCA9IChNYXApIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE1hcEl0ZXJhdG9yIG1hcEl0ZXJhdG9yKCkgewotICAgICAgICBNYXBJdGVyYXRvciBpdCA9IGdldE9yZGVyZWRNYXAoKS5tYXBJdGVyYXRvcigpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlTWFwSXRlcmF0b3IuZGVjb3JhdGUoaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcmRlcmVkTWFwSXRlcmF0b3Igb3JkZXJlZE1hcEl0ZXJhdG9yKCkgewotICAgICAgICBPcmRlcmVkTWFwSXRlcmF0b3IgaXQgPSBnZXRPcmRlcmVkTWFwKCkub3JkZXJlZE1hcEl0ZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVPcmRlcmVkTWFwSXRlcmF0b3IuZGVjb3JhdGUoaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtYXBUb0NvcHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gc3VwZXIuZW50cnlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUVudHJ5U2V0LmRlY29yYXRlKHNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIFNldCBzZXQgPSBzdXBlci5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gc3VwZXIudmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVDb2xsZWN0aW9uLmRlY29yYXRlKGNvbGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVTb3J0ZWRNYXAuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvVW5tb2RpZmlhYmxlU29ydGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3Njc2OTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL21hcC9Vbm1vZGlmaWFibGVTb3J0ZWRNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Vbm1vZGlmaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVW5tb2RpZmlhYmxlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0LlVubW9kaWZpYWJsZVNldDsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5Tb3J0ZWRNYXA8L2NvZGU+IHRvIGVuc3VyZSBpdCBjYW4ndCBiZSBhbHRlcmVkLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIFNlcmlhbGl6YWJsZSBmcm9tIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMCAkCi0gKiAKLSAqIEBhdXRob3IgU3RlcGhlbiBDb2xlYm91cm5lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbm1vZGlmaWFibGVTb3J0ZWRNYXAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNvcnRlZE1hcERlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1ODA1MzQ0MjM5ODI3Mzc2MzYwTDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiB1bm1vZGlmaWFibGUgc29ydGVkIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBkZWNvcmF0ZShTb3J0ZWRNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1hcCBpcyBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBVbm1vZGlmaWFibGVTb3J0ZWRNYXAoU29ydGVkTWFwIG1hcCkgewotICAgICAgICBzdXBlcihtYXApOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgbWFwIG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIG1hcCBpbiB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbiAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgbWFwID0gKE1hcCkgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwVG9Db3B5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgU2V0IHNldCA9IHN1cGVyLmVudHJ5U2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVFbnRyeVNldC5kZWNvcmF0ZShzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gc3VwZXIua2V5U2V0KCk7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUoc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbCA9IHN1cGVyLnZhbHVlcygpOwotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlQ29sbGVjdGlvbi5kZWNvcmF0ZShjb2xsKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBmaXJzdEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZE1hcCgpLmZpcnN0S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBsYXN0S2V5KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkTWFwKCkubGFzdEtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRNYXAoKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZE1hcCBzdWJNYXAoT2JqZWN0IGZyb21LZXksIE9iamVjdCB0b0tleSkgewotICAgICAgICBTb3J0ZWRNYXAgbWFwID0gZ2V0U29ydGVkTWFwKCkuc3ViTWFwKGZyb21LZXksIHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIGhlYWRNYXAoT2JqZWN0IHRvS2V5KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBtYXAgPSBnZXRTb3J0ZWRNYXAoKS5oZWFkTWFwKHRvS2V5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVTb3J0ZWRNYXAobWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkTWFwIHRhaWxNYXAoT2JqZWN0IGZyb21LZXkpIHsKLSAgICAgICAgU29ydGVkTWFwIG1hcCA9IGdldFNvcnRlZE1hcCgpLnRhaWxNYXAoZnJvbUtleSk7Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlU29ydGVkTWFwKG1hcCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvbWFwL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTFkYjNkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9tYXAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuMSAyMDA5LzA1LzI3IDIyOjE2OjMwIG1wYXJrZXIgRXhwICQgLS0+Ci0gPCEtLQotICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08Qk9EWT4KLTxwPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgCi17QGxpbmsgamF2YS51dGlsLk1hcCBNYXB9LAote0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5JdGVyYWJsZU1hcCBJdGVyYWJsZU1hcH0sCi17QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk9yZGVyZWRNYXAgT3JkZXJlZE1hcH0gYW5kCi17QGxpbmsgamF2YS51dGlsLlNvcnRlZE1hcCBTb3J0ZWRNYXB9IGludGVyZmFjZXMuCi1BIE1hcCBwcm92aWRlcyBhIGxvb2t1cCBmcm9tIGEga2V5IHRvIGEgdmFsdWUuCi1BIG51bWJlciBvZiBpbXBsZW1lbnRhdGlvbnMgYWxzbyBzdXBwb3J0IHRoZSBuZXcgTWFwSXRlcmF0b3IgaW50ZXJmYWNlIHRoYXQgZW5hYmxlcwotc2ltcGxlIGl0ZXJhdGlvbiBvZiBtYXAga2V5cyBhbmQgdmFsdWVzLgotPHA+Ci1UaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9ucyBhcmUgcHJvdmlkZWQ6Ci08dWw+Ci08bGk+Q2FzZUluc2Vuc2l0aXZlTWFwIC0gbWFwIHRoYXQgY29tcGFyZXMga2V5cyBpbiBhIGNhc2UgaW5zZW5zaXRpdmUgd2F5Ci08bGk+Q29tcG9zaXRlTWFwIC0gbWFwIHRoYXQgY29tYmluZXMgbXVsdGlwbGUgbWFwcyBpbnRvIGEgc2luZ2xlIHZpZXcKLTxsaT5IYXNoZWRNYXAgLSBnZW5lcmFsIHB1cnBvc2UgSGFzaE1hcCByZXBsYWNlbWVudCBzdXBwb3J0aW5nIE1hcEl0ZXJhdG9yCi08bGk+SWRlbnRpdHlNYXAgLSBtYXAgdGhhdCB1c2VzID09IGZvciBjb21wYXJpc29uIGluc3RlYWQgb2YgZXF1YWxzKCkKLTxsaT5GbGF0M01hcCAtIGRlc2lnbmVkIGZvciBnb29kIHBlcmZvcm1hbmNlIGF0IHNpemUgMyBvciBsZXNzCi08bGk+TGlua2VkTWFwIC0gYSBoYXNoIG1hcCB0aGF0IG1haW50YWlucyBpbnNlcnRpb24gb3JkZXIsIHN1cHBvcnRpbmcgT3JkZXJlZE1hcEl0ZXJhdG9yCi08bGk+TXVsdGlLZXlNYXAgLSBtYXAgdGhhdCBwcm92aWRlcyBzcGVjaWFsIG1ldGhvZHMgZm9yIHVzaW5nIG1vcmUgdGhhbiBvbmUga2V5IHRvIGFjY2VzcyB0aGUgdmFsdWUKLTxsaT5SZWZlcmVuY2VNYXAgLSBhbGxvd3MgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGNvbGxlY3Qga2V5cyBhbmQgdmFsdWVzIHVzaW5nIGVxdWFscygpIGZvciBjb21wYXJpc29uCi08bGk+UmVmZXJlbmNlSWRlbnRpdHlNYXAgLSBhbGxvd3MgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGNvbGxlY3Qga2V5cyBhbmQgdmFsdWVzIHVzaW5nID09IGZvciBjb21wYXJpc29uCi08bGk+U2luZ2xldG9uTWFwIC0gYSBmdWxseSBmZWF0dXJlZCBtYXAgdG8gaG9sZCBvbmUga2V5LXZhbHVlIHBhaXIKLTxsaT5TdGF0aWNCdWNrZXRNYXAgLSBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBhbmQgZGVzaWduZWQgZm9yIHRocmVhZC1jb250ZW50aW91cyBlbnZpcm9ubWVudHMKLTwvdWw+Ci08cD4KLVRoZSBmb2xsb3dpbmcgZGVjb3JhdG9ycyBhcmUgcHJvdmlkZWQ6Ci08dWw+Ci08bGk+VW5tb2RpZmlhYmxlIC0gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBjYW5ub3QgYmUgYWx0ZXJlZAotPGxpPlByZWRpY2F0ZWQgLSBlbnN1cmVzIHRoYXQgb25seSBlbGVtZW50cyB0aGF0IGFyZSB2YWxpZCBhY2NvcmRpbmcgdG8gYSBwcmVkaWNhdGUgY2FuIGJlIGFkZGVkCi08bGk+VHlwZWQgLSBlbnN1cmVzIHRoYXQgb25seSBlbGVtZW50cyB0aGF0IGFyZSBvZiBhIHNwZWNpZmljIHR5cGUgY2FuIGJlIGFkZGVkCi08bGk+VHJhbnNmb3JtZWQgLSB0cmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBhZGRlZAotPGxpPkZpeGVkU2l6ZSAtIGVuc3VyZXMgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgbWFwIGNhbm5vdCBjaGFuZ2UKLTxsaT5MYXp5IC0gY3JlYXRlcyBvYmplY3RzIGluIHRoZSBtYXAgb24gZGVtYW5kCi08bGk+TGlzdE9yZGVyZWQgLSBlbnN1cmVzIHRoYXQgaW5zZXJ0aW9uIG9yZGVyIGlzIHJldGFpbmVkCi08L3VsPgotPC9wcmU+Ci08L0JPRFk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvb3ZlcnZpZXcuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDgyYmFmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTwhLS0gJElkOiBvdmVydmlldy5odG1sLHYgMS4xIDIwMDkvMDUvMjcgMjI6MTY6MTggbXBhcmtlciBFeHAgJCAtLT4KLSA8IS0tCi0gICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxib2R5PgotICA8cD4KLSAgICAgQ29tbW9ucy1Db2xsZWN0aW9ucyBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQgdXRpbGl0aWVzCi0gICAgIHRoYXQgY29tcGxlbWVudCB0aGUgSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcmsuCi0gIDwvcD4KLSAgPHA+Ci0gICAgIFRoZSBBcGFjaGUgSmFrYXJ0YSBDb21tb25zIENvbGxlY3Rpb25zIEZyYW1ld29yayBjb21wb25lbnQgYWRkcyBhIHNpZ25pZmljYW50Ci0gICAgIGFtb3VudCBvZiBlbmhhbmNlbWVudHMgdG8gdGhlIHN0YW5kYXJkIEpESyBjb2xsZWN0aW9ucy4gVGhlc2UgZW5oYW5jZW1lbnRzCi0gICAgIGNvbWUgaW4gdGhlIGZvcm0gb2YgbmV3IGludGVyZmFjZXMsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYW5kIHV0aWxpdHkgY2xhc3Nlcy4KLSAgPC9wPgotICA8cD4KLSAgICAgU2VlIGFsc28gdGhlIDxjb2RlPmphdmEudXRpbDwvY29kZT4gcGFja2FnZSBmb3IgdGhlIHN0YW5kYXJkIEphdmEgY29sbGVjdGlvbnMuCi0gIDwvcD4KLSAgICAgCi0gIDxoND5NYWluIGZlYXR1cmVzPC9oND4KLSAgPHA+Ci0gICAgIENvbW1vbnMtQ29sbGVjdGlvbnMgZGVmaW5lcyBhIG51bWJlciBvZiBrZXkgaW50ZXJmYWNlczoKLSAgPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgotICA8dHIgYmdjb2xvcj0iI0NDQ0NGRiIgY2xhc3M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLSAgICA8dGg+SW50ZXJmYWNlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CYWd9Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgQSBuZXcgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4gc3ViaW50ZXJmYWNlIHRoYXQgc3RvcmVzIGVhY2ggb2JqZWN0IHRvZ2V0aGVyCi0gICAgICB3aXRoIHRoZSBudW1iZXIgb2Ygb2NjdXJhbmNlcy4gTWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YKLSAgICAgIG9jY3VyYW5jZXMsIGFuZCB0byBhZGQgYW5kIHJlbW92ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIHRoYXQgb2JqZWN0LgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJ1ZmZlcn0KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBBIG5ldyA8Y29kZT5Db2xsZWN0aW9uPC9jb2RlPiBzdWJpbnRlcmZhY2UgdGhhdCBhbGxvd3Mgb2JqZWN0cyB0byBiZSByZW1vdmVkCi0gICAgICBpbiBzb21lIHdlbGwtZGVmaW5lZCBvcmRlci4gTWV0aG9kcyBlbmFibGUgdGhlIG5leHQgaXRlbSB0byBiZSBwZWVrZWQgYW5kIHJlbW92ZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQmlkaU1hcH0KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBBIG5ldyA8Y29kZT5NYXA8L2NvZGU+IHN1YmludGVyZmFjZSB0aGF0IGFsbG93cyBsb29rdXAgZnJvbSBrZXkgdG8gdmFsdWUgYW5kCi0gICAgICBmcm9tIHZhbHVlIHRvIGtleSB3aXRoIGVxdWFsIGVhc2UuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuT3JkZXJlZE1hcH0KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBBIG5ldyA8Y29kZT5NYXA8L2NvZGU+IHN1YmludGVyZmFjZSB0aGF0IGlzIHVzZWQgd2hlbiBhIG1hcCBoYXMgYW4gb3JkZXIsIGJ1dCBpcwotICAgICAgbm90IHNvcnRlZC4gTWV0aG9kcyBlbmFibGUgYmlkcmllY3Rpb25hbCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbWFwLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLk1hcEl0ZXJhdG9yfQotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIEEgbmV3IDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBzdWJpbnRlcmZhY2Ugc3BlY2lhbGx5IGRlc2lnbmVkIGZvciBtYXBzLiBUaGlzIGl0ZXJhdG9yCi0gICAgICBhdm9pZHMgdGhlIG5lZWQgZm9yIGVudHJ5U2V0IGl0ZXJhdGlvbiBvZiBhIG1hcCwgYW5kIGlzIHNpbXBsZXIgdG8gdXNlLgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlJlc2V0dGFibGVJdGVyYXRvcn0KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBBIG5ldyA8Y29kZT5JdGVyYXRvcjwvY29kZT4gc3ViaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHRoZSBpdGVyYXRpb24gdG8gYmUgcmVzZXQgYmFjawotICAgICAgdG8gdGhlIHN0YXJ0LiBNYW55IGl0ZXJhdG9ycyBpbiB0aGlzIGxpYnJhcnkgaGF2ZSB0aGlzIGZ1bmN0aW9uYWxpdHkuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuQ2xvc3VyZX08YnIgLz4KLSAgICAgIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuUHJlZGljYXRlfTxiciAvPgotICAgICAge0BsaW5rIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcn08YnIgLz4KLSAgICAgIHtAbGluayBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRmFjdG9yeX08YnIgLz4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBBIGdyb3VwIG9mIDxpPmZ1bmN0b3I8L2k+IGludGVyZmFjZXMgdGhhdCBwcm92aWRlIHBsdWdpbiBiZWhhdmlvdXIgdG8gdmFyaW91cwotICAgICAgY29sbGVjdGlvbnMgYW5kIHV0aWxpdGllcy4KLSAgICA8L3RkPgotICA8L3RyPgotICA8L3RhYmxlPgotICA8cD4KLSAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGludGVyZmFjZXMsIHRoZXJlIGFyZSBtYW55IGltcGxlbWVudGF0aW9ucy4KLSAgICAgQ29uc3VsdCBlYWNoIHN1YnBhY2thZ2UgZm9yIGZ1bGwgZGV0YWlscyBvZiB0aGVzZS4KLSAgPC9wPgotICAgICAKLTwvYm9keT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvcGFja2FnZS5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IyMDZlNy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuMSAyMDA5LzA1LzI3IDIyOjE2OjE4IG1wYXJrZXIgRXhwICQgLS0+Ci0gPCEtLQotICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08Ym9keT4KLTxwPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBpbnRlcmZhY2VzIGFuZCB1dGlsaXRpZXMgc2hhcmVkIGFjcm9zcyBhbGwgdGhlIHN1YnBhY2thZ2VzIG9mIHRoaXMgY29tcG9uZW50LgotPC9wPgotPHA+Ci1UaGUgZm9sbG93aW5nIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBpbiB0aGUgcGFja2FnZToKLTx1bD4KLTxsaT5BcnJheVN0YWNrIC0gYSBub24gc3luY2hyb25pemVkIFN0YWNrIHRoYXQgZm9sbG93cyB0aGUgc2FtZSBBUEkgYXMgamF2YSB1dGlsIFN0YWNrCi08bGk+RXh0ZW5kZWRQcm9wZXJ0aWVzIC0gZXh0ZW5kcyB0aGUgUHJvcGVydGllcyBjbGFzcyB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eQotPC91bD4KLTxwPgotCi08L2JvZHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNlcmlhbGl6YWJsZVNldERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNlcmlhbGl6YWJsZVNldERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzFhNWIwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQWJzdHJhY3RTZXJpYWxpemFibGVTZXREZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFNlcmlhbGl6YWJsZSBzdWJjbGFzcyBvZiBBYnN0cmFjdFNldERlY29yYXRvci4KLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJpYWxpemFibGVTZXREZWNvcmF0b3IKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFNldERlY29yYXRvcgotICAgICAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTIyOTQ2OTk2NjIxMjIwNjEwN0w7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZXJpYWxpemFibGVTZXREZWNvcmF0b3IoU2V0IHNldCkgewotICAgICAgICBzdXBlcihzZXQpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgc2V0IG91dCB1c2luZyBhIGN1c3RvbSByb3V0aW5lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBzZXQgaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNldERlY29yYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNldERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZTNlZjhhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQWJzdHJhY3RTZXREZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLkFic3RyYWN0Q29sbGVjdGlvbkRlY29yYXRvcjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5TZXQ8L2NvZGU+IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBiZWhhdmlvdXIuCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIGZvcndhcmRlZCBkaXJlY3RseSB0byB0aGUgZGVjb3JhdGVkIHNldC4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzIgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXREZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25EZWNvcmF0b3IgaW1wbGVtZW50cyBTZXQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U2V0RGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdFNldERlY29yYXRvcihTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2V0IGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldCBnZXRTZXQoKSB7Ci0gICAgICAgIHJldHVybiAoU2V0KSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0Fic3RyYWN0U29ydGVkU2V0RGVjb3JhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0Fic3RyYWN0U29ydGVkU2V0RGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZmJmODEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9BYnN0cmFjdFNvcnRlZFNldERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkU2V0PC9jb2RlPiB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3VyLgotICogPHA+Ci0gKiBNZXRob2RzIGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGRlY29yYXRlZCBzZXQuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U29ydGVkU2V0RGVjb3JhdG9yIGV4dGVuZHMgQWJzdHJhY3RTZXREZWNvcmF0b3IgaW1wbGVtZW50cyBTb3J0ZWRTZXQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb25seSB1c2VkIGluIGRlc2VyaWFsaXphdGlvbiwgZG8gbm90IHVzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U29ydGVkU2V0RGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdFNvcnRlZFNldERlY29yYXRvcihTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc29ydGVkIHNldCBiZWluZyBkZWNvcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRTZXQgZ2V0U29ydGVkU2V0KCkgewotICAgICAgICByZXR1cm4gKFNvcnRlZFNldCkgZ2V0Q29sbGVjdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFNvcnRlZFNldCBzdWJTZXQoT2JqZWN0IGZyb21FbGVtZW50LCBPYmplY3QgdG9FbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZFNldCBoZWFkU2V0KE9iamVjdCB0b0VsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldCgpLmhlYWRTZXQodG9FbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkU2V0IHRhaWxTZXQoT2JqZWN0IGZyb21FbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS50YWlsU2V0KGZyb21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkU2V0KCkuZmlyc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5sYXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhcmF0b3IgY29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldCgpLmNvbXBhcmF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQ29tcG9zaXRlU2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0NvbXBvc2l0ZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjVhYzUzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvQ29tcG9zaXRlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Db2xsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uQ29tcG9zaXRlQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYSBzZXQgb2Ygb3RoZXIgc2V0cyB0byBwcm92aWRlIGEgc2luZ2xlIHVuaWZpZWQgdmlldy4KLSAqIDxwPgotICogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgc2V0IHdpbGwgYWN0dWFsbHkgYmUgbWFkZSBvbiB0aGUgZGVjb3JhdGVkIHNldC4KLSAqIEFkZCBvcGVyYXRpb25zIHJlcXVpcmUgdGhlIHVzZSBvZiBhIHBsdWdnYWJsZSBzdHJhdGVneS4KLSAqIElmIG5vIHN0cmF0ZWd5IGlzIHByb3ZpZGVkIHRoZW4gYWRkIGlzIHVuc3VwcG9ydGVkLgotICoKLSAqIEBzaW5jZSBDb21tb25zIENvbGxlY3Rpb25zIDMuMAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMjoxNjozMSAkCi0gKgotICogQGF1dGhvciBCcmlhbiBNY0NhbGxpc3RlcgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlU2V0IGV4dGVuZHMgQ29tcG9zaXRlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFNldCB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVtcHR5IENvbXBvc2l0ZVNldAotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVTZXQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENvbXBvc2l0ZVNldCB3aXRoIGp1c3QgPGNvZGU+c2V0PC9jb2RlPiBjb21wb3NpdGVkCi0gICAgICogQHBhcmFtIHNldCBUaGUgaW5pdGlhbCBzZXQgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVTZXQoU2V0IHNldCkgewotICAgICAgICBzdXBlcihzZXQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wb3NpdGUgc2V0IHdpdGggc2V0cyBhcyB0aGUgaW5pdGlhbCBzZXQgb2YgY29tcG9zaXRlZCBTZXRzCi0gICAgICovCi0gICAgcHVibGljIENvbXBvc2l0ZVNldChTZXRbXSBzZXRzKSB7Ci0gICAgICAgIHN1cGVyKHNldHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSBTZXQgdG8gdGhpcyBjb21wb3NpdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIE11c3QgaW1wbGVtZW50IFNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGMgZG9lcyBub3QgaW1wbGVtZW50IGphdmEudXRpbC5TZXQKLSAgICAgKiAgICAgICAgIG9yIGlmIGEgU2V0TXV0YXRvciBpcyBzZXQsIGJ1dCBmYWlscyB0byByZXNvbHZlIGEgY29sbGlzaW9uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBTZXRNdXRhdG9yIHNldCwgb3IKLSAgICAgKiAgICAgICAgIGEgQ29sbGVjdGlvbk11dGF0b3IgaXMgc2V0IGluc3RlYWQgb2YgYSBTZXRNdXRhdG9yCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5Db21wb3NpdGVDb2xsZWN0aW9uLkNvbGxlY3Rpb25NdXRhdG9yCi0gICAgICogQHNlZSBTZXRNdXRhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbXBvc2l0ZWQoQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBTZXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb2xsZWN0aW9ucyBhZGRlZCBtdXN0IGltcGxlbWVudCBqYXZhLnV0aWwuU2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMuZ2V0Q29sbGVjdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFNldCBzZXQgPSAoU2V0KSBpLm5leHQoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gaW50ZXJzZWN0cyA9IENvbGxlY3Rpb25VdGlscy5pbnRlcnNlY3Rpb24oc2V0LCBjKTsKLSAgICAgICAgICAgIGlmIChpbnRlcnNlY3RzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5tdXRhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvbGxpc2lvbiBhZGRpbmcgY29tcG9zaXRlZCBjb2xsZWN0aW9uIHdpdGggbm8gU2V0TXV0YXRvciBzZXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoISh0aGlzLm11dGF0b3IgaW5zdGFuY2VvZiBTZXRNdXRhdG9yKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29sbGlzaW9uIGFkZGluZyBjb21wb3NpdGVkIGNvbGxlY3Rpb24gdG8gYSBDb21wb3NpdGVTZXQgd2l0aCBhIENvbGxlY3Rpb25NdXRhdG9yIGluc3RlYWQgb2YgYSBTZXRNdXRhdG9yIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgoU2V0TXV0YXRvcikgdGhpcy5tdXRhdG9yKS5yZXNvbHZlQ29sbGlzaW9uKHRoaXMsIHNldCwgKFNldCkgYywgaW50ZXJzZWN0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKENvbGxlY3Rpb25VdGlscy5pbnRlcnNlY3Rpb24oc2V0LCBjKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBhZGQgaWxsZWdhbCBlbnRyeSB1bnJlc29sdmVkIGJ5IFNldE11dGF0b3IucmVzb2x2ZUNvbGxpc2lvbigpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmFkZENvbXBvc2l0ZWQobmV3IENvbGxlY3Rpb25bXXtjfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCB0d28gc2V0cyB0byB0aGlzIGNvbXBvc2l0ZQotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYyBvciBkIGRvZXMgbm90IGltcGxlbWVudCBqYXZhLnV0aWwuU2V0Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbXBvc2l0ZWQoQ29sbGVjdGlvbiBjLCBDb2xsZWN0aW9uIGQpIHsKLSAgICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIFNldCkpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50IG11c3QgaW1wbGVtZW50IGphdmEudXRpbC5TZXQiKTsKLSAgICAgICAgaWYgKCEoZCBpbnN0YW5jZW9mIFNldCkpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50IG11c3QgaW1wbGVtZW50IGphdmEudXRpbC5TZXQiKTsKLSAgICAgICAgdGhpcy5hZGRDb21wb3NpdGVkKG5ldyBTZXRbXXsoU2V0KSBjLCAoU2V0KSBkfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhbiBhcnJheSBvZiBzZXRzIHRvIHRoaXMgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIGNvbXBzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBjb2xsZWN0aW9ucyBpbiBjb21wcyBkbyBub3QgaW1wbGVtZW50IFNldAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb21wb3NpdGVkKENvbGxlY3Rpb25bXSBjb21wcykgewotICAgICAgICBmb3IgKGludCBpID0gY29tcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9zaXRlZChjb21wc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBjYW4gcmVjZWl2ZSBlaXRoZXIgYSA8Y29kZT5Db21wb3NpdGVDb2xsZWN0aW9uLkNvbGxlY3Rpb25NdXRhdG9yPC9jb2RlPgotICAgICAqIG9yIGEgPGNvZGU+Q29tcG9zaXRlU2V0LlNldE11dGF0b3I8L2NvZGU+LiBJZiBhCi0gICAgICogPGNvZGU+Q29tcG9zaXRlQ29sbGVjdGlvbi5Db2xsZWN0aW9uTXV0YXRvcjwvY29kZT4gaXMgdXNlZCB0aGFuIGNvbmZsaWN0cyB3aGVuIGFkZGluZwotICAgICAqIGNvbXBvc2l0ZWQgc2V0cyB3aWxsIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqIDxwPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE11dGF0b3IoQ29sbGVjdGlvbk11dGF0b3IgbXV0YXRvcikgewotICAgICAgICBzdXBlci5zZXRNdXRhdG9yKG11dGF0b3IpOwotICAgIH0KLSAgICAKLSAgICAvKiBTZXQgb3BlcmF0aW9ucyAqLwotICAgIAotICAgIC8qKgotICAgICAqIElmIGEgPGNvZGU+Q29sbGVjdGlvbk11dGF0b3I8L2NvZGU+IGlzIGRlZmluZWQgZm9yIHRoaXMgQ29tcG9zaXRlU2V0IHRoZW4gdGhpcwotICAgICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnl3YXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBiZSByZW1vdmVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5nZXRDb2xsZWN0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU2V0IHNldCA9IChTZXQpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyhvYmopKSByZXR1cm4gc2V0LnJlbW92ZShvYmopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBTZXQjZXF1YWxzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNldCkgewotICAgICAgICAgICAgU2V0IHNldCA9IChTZXQpIG9iajsKLSAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnNBbGwodGhpcykgJiYgc2V0LnNpemUoKSA9PSB0aGlzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBTZXQjaGFzaENvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgY29kZSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGkubmV4dCgpOwotICAgICAgICAgICAgY29kZSArPSAobmV4dCAhPSBudWxsID8gbmV4dC5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvZGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSBjYWxsYmFja3MgZm9yIG11dGF0aW9uIG9wZXJhdGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogRGVmaW5pbmcgcmVtb3ZlKCkgb24gaW1wbGVtZW50YXRpb25zIG9mIFNldE11dGF0b3IgaXMgcG9pbnRsZXNzCi0gICAgICogYXMgdGhleSBhcmUgbmV2ZXIgY2FsbGVkIGJ5IENvbXBvc2l0ZVNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTZXRNdXRhdG9yIGV4dGVuZHMgQ29tcG9zaXRlQ29sbGVjdGlvbi5Db2xsZWN0aW9uTXV0YXRvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBTZXQgaXMgYWRkZWQgdG8gdGhlIENvbXBvc2l0ZVNldCBhbmQgdGhlcmUgaXMgYQotICAgICAgICAgKiBjb2xsaXNpb24gYmV0d2VlbiBleGlzdGluZyBhbmQgYWRkZWQgc2V0cy4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogSWYgPGNvZGU+YWRkZWQ8L2NvZGU+IGFuZCA8Y29kZT5leGlzdGluZzwvY29kZT4gc3RpbGwgaGF2ZSBhbnkgaW50ZXJzZWN0cwotICAgICAgICAgKiBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAcGFyYW0gY29tcCBUaGUgQ29tcG9zaXRlU2V0IGJlaW5nIG1vZGlmaWVkCi0gICAgICAgICAqIEBwYXJhbSBleGlzdGluZyBUaGUgU2V0IGFscmVhZHkgZXhpc3RpbmcgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICAgKiBAcGFyYW0gYWRkZWQgdGhlIFNldCBiZWluZyBhZGRlZCB0byB0aGUgY29tcG9zaXRlCi0gICAgICAgICAqIEBwYXJhbSBpbnRlcnNlY3RzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGggZXhpc3RpbmcgYW5kIGFkZGVkIHNldHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc29sdmVDb2xsaXNpb24oQ29tcG9zaXRlU2V0IGNvbXAsIFNldCBleGlzdGluZywgU2V0IGFkZGVkLCBDb2xsZWN0aW9uIGludGVyc2VjdHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvTGlzdE9yZGVyZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvTGlzdE9yZGVyZWRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjBhZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L0xpc3RPcmRlcmVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5BYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LlVubW9kaWZpYWJsZUxpc3Q7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U2V0PC9jb2RlPiB0byBlbnN1cmUgdGhhdCB0aGUgb3JkZXIgb2YgYWRkaXRpb24KLSAqIGlzIHJldGFpbmVkIGFuZCB1c2VkIGJ5IHRoZSBpdGVyYXRvci4KLSAqIDxwPgotICogSWYgYW4gb2JqZWN0IGlzIGFkZGVkIHRvIHRoZSBzZXQgZm9yIGEgc2Vjb25kIHRpbWUsIGl0IHdpbGwgcmVtYWluIGluIHRoZQotICogb3JpZ2luYWwgcG9zaXRpb24gaW4gdGhlIGl0ZXJhdGlvbi4KLSAqIFRoZSBvcmRlciBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSB0aGUgc2V0IHZpYSB0aGUgaXRlcmF0b3Igb3IgdG9BcnJheSBtZXRob2RzLgotICogPHA+Ci0gKiBUaGUgTGlzdE9yZGVyZWRTZXQgYWxzbyBoYXMgdmFyaW91cyB1c2VmdWwgZGlyZWN0IG1ldGhvZHMuIFRoZXNlIGluY2x1ZGUgbWFueQotICogZnJvbSA8Y29kZT5MaXN0PC9jb2RlPiwgc3VjaCBhcyA8Y29kZT5nZXQoaW50KTwvY29kZT4sIDxjb2RlPnJlbW92ZShpbnQpPC9jb2RlPgotICogYW5kIDxjb2RlPmluZGV4T2YoaW50KTwvY29kZT4uIEFuIHVubW9kaWZpYWJsZSA8Y29kZT5MaXN0PC9jb2RlPiB2aWV3IG9mIAotICogdGhlIHNldCBjYW4gYmUgb2J0YWluZWQgdmlhIDxjb2RlPmFzTGlzdCgpPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBjYW5ub3QgaW1wbGVtZW50IHRoZSA8Y29kZT5MaXN0PC9jb2RlPiBpbnRlcmZhY2UgZGlyZWN0bHkgYXMKLSAqIHZhcmlvdXMgaW50ZXJmYWNlIG1ldGhvZHMgKG5vdGFibHkgZXF1YWxzL2hhc2hDb2RlKSBhcmUgaW5jb21wYXRhYmxlIHdpdGggYSBzZXQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgSGVubmluZyBQLiBTY2htaWVkZWhhdXNlbgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE9yZGVyZWRTZXQgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6YWJsZVNldERlY29yYXRvciBpbXBsZW1lbnRzIFNldCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyODY2NDM3MjQ3MDQyMDE0MUw7Ci0KLSAgICAvKiogSW50ZXJuYWwgbGlzdCB0byBob2xkIHRoZSBzZXF1ZW5jZSBvZiBvYmplY3RzICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Qgc2V0T3JkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gb3JkZXJlZCBzZXQgc3BlY2lmeWluZyB0aGUgbGlzdCBhbmQgc2V0IHRvIHVzZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbGlzdCBhbmQgc2V0IG11c3QgYm90aCBiZSBlbXB0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IGJlIGVtcHR5IGFuZCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBiZSBlbXB0eSBhbmQgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgbGlzdCBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBzZXQgb3IgbGlzdCBpcyBub3QgZW1wdHkKLSAgICAgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3RPcmRlcmVkU2V0IGRlY29yYXRlKFNldCBzZXQsIExpc3QgbGlzdCkgewotICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNldCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNldC5zaXplKCkgPiAwIHx8IGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2V0IGFuZCBMaXN0IG11c3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExpc3RPcmRlcmVkU2V0KHNldCwgbGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIG9yZGVyZWQgc2V0LgotICAgICAqIDxwPgotICAgICAqIEFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gaXMgdXNlZCB0byByZXRhaW4gb3JkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0T3JkZXJlZFNldCBkZWNvcmF0ZShTZXQgc2V0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdE9yZGVyZWRTZXQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gb3JkZXJlZCBzZXQgdXNpbmcgdGhlIHN1cHBsaWVkIGxpc3QgdG8gcmV0YWluIG9yZGVyLgotICAgICAqIDxwPgotICAgICAqIEEgPGNvZGU+SGFzaFNldDwvY29kZT4gaXMgdXNlZCBmb3IgdGhlIHNldCBiZWhhdmlvdXIuCi0gICAgICogPHA+Ci0gICAgICogTk9URTogSWYgdGhlIGxpc3QgY29udGFpbnMgZHVwbGljYXRlcywgdGhlIGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWQsCi0gICAgICogYWx0ZXJpbmcgdGhlIHNwZWNpZmllZCBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpc3QgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdE9yZGVyZWRTZXQgZGVjb3JhdGUoTGlzdCBsaXN0KSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3QgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIFNldCBzZXQgPSBuZXcgSGFzaFNldChsaXN0KTsKLSAgICAgICAgbGlzdC5yZXRhaW5BbGwoc2V0KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgTGlzdE9yZGVyZWRTZXQoc2V0LCBsaXN0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSA8Y29kZT5MaXN0T3JkZXJlZFNldDwvY29kZT4gdXNpbmcKLSAgICAgKiBhIDxjb2RlPkhhc2hTZXQ8L2NvZGU+IGFuZCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IGludGVybmFsbHkuCi0gICAgICogCi0gICAgICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gICAgICovCi0gICAgcHVibGljIExpc3RPcmRlcmVkU2V0KCkgewotICAgICAgICBzdXBlcihuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgc2V0T3JkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3RPcmRlcmVkU2V0KFNldCBzZXQpIHsKLSAgICAgICAgc3VwZXIoc2V0KTsKLSAgICAgICAgc2V0T3JkZXIgPSBuZXcgQXJyYXlMaXN0KHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykgdGhlIFNldCBhbmQgc3BlY2lmaWVzIHRoZSBsaXN0IHRvIHVzZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc2V0IGFuZCBsaXN0IG11c3QgYm90aCBiZSBjb3JyZWN0bHkgaW5pdGlhbGlzZWQgdG8gdGhlIHNhbWUgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBsaXN0ICB0aGUgbGlzdCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciBsaXN0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdE9yZGVyZWRTZXQoU2V0IHNldCwgTGlzdCBsaXN0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3QgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHNldE9yZGVyID0gbGlzdDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgb3JkZXIgb2YgdGhlIFNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IHZpZXcKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBhc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBVbm1vZGlmaWFibGVMaXN0LmRlY29yYXRlKHNldE9yZGVyKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICAgICAgc2V0T3JkZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3JkZXJlZFNldEl0ZXJhdG9yKHNldE9yZGVyLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKG9iamVjdCkpIHsKLSAgICAgICAgICAgIC8vIHJlLWFkZGluZyBkb2Vzbid0IGNoYW5nZSBvcmRlcgotICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uYWRkKG9iamVjdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBhZGQsIHNvIGFkZCB0byBib3RoIHNldCBhbmQgbGlzdAotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBjb2xsZWN0aW9uLmFkZChvYmplY3QpOwotICAgICAgICAgICAgc2V0T3JkZXIuYWRkKG9iamVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHwgYWRkKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGNvbGxlY3Rpb24ucmVtb3ZlKG9iamVjdCk7Ci0gICAgICAgIHNldE9yZGVyLnJlbW92ZShvYmplY3QpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbGwuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8IHJlbW92ZShvYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGNvbGxlY3Rpb24ucmV0YWluQWxsKGNvbGwpOwotICAgICAgICBpZiAocmVzdWx0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbi5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgc2V0T3JkZXIuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZXRPcmRlci5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5jb250YWlucyhvYmplY3QpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgICByZXR1cm4gc2V0T3JkZXIudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdCBhW10pIHsKLSAgICAgICAgcmV0dXJuIHNldE9yZGVyLnRvQXJyYXkoYSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gc2V0T3JkZXIuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gc2V0T3JkZXIuaW5kZXhPZihvYmplY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKGNvbnRhaW5zKG9iamVjdCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG9iamVjdCk7Ci0gICAgICAgICAgICBzZXRPcmRlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb2xsLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29udGFpbnMob2JqZWN0KSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgc2V0T3JkZXIuYWRkKGluZGV4LCBvYmplY3QpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBzZXRPcmRlci5yZW1vdmUoaW5kZXgpOwotICAgICAgICByZW1vdmUob2JqKTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VzIHRoZSB1bmRlcmx5aW5nIExpc3QncyB0b1N0cmluZyBzbyB0aGF0IG9yZGVyIGlzIGFjaGlldmVkLiAKLSAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY29yYXRlZCBTZXQncyB0b1N0cmluZyBpcyBub3QgdXNlZCwgc28gCi0gICAgICogYW55IGN1c3RvbSB0b1N0cmluZ3Mgd2lsbCBiZSBpZ25vcmVkLiAKLSAgICAgKi8KLSAgICAvLyBGb3J0dW5hdGVseSBMaXN0LnRvU3RyaW5nIGFuZCBTZXQudG9TdHJpbmcgbG9vayB0aGUgc2FtZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzZXRPcmRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBpdGVyYXRvciBoYW5kbGUgcmVtb3ZlLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBPcmRlcmVkU2V0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yRGVjb3JhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBPYmplY3Qgd2UgaXRlcmF0ZSBvbiAqLwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbiBzZXQ7Ci0gICAgICAgIC8qKiBMYXN0IG9iamVjdCByZXRyaWV2ZWQgKi8KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBsYXN0OwotCi0gICAgICAgIHByaXZhdGUgT3JkZXJlZFNldEl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBDb2xsZWN0aW9uIHNldCkgewotICAgICAgICAgICAgc3VwZXIoaXRlcmF0b3IpOwotICAgICAgICAgICAgdGhpcy5zZXQgPSBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICBsYXN0ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBzZXQucmVtb3ZlKGxhc3QpOwotICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9NYXBCYWNrZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvTWFwQmFja2VkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1MDMwMzIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9NYXBCYWNrZWRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERlY29yYXRlcyBhIDxjb2RlPk1hcDwvY29kZT4gdG8gb2J0YWluIDxjb2RlPlNldDwvY29kZT4gYmVoYXZpb3VyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgPGNvZGU+U2V0PC9jb2RlPiB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMKLSAqIHRoZSBrZXkgc2V0IG9mIGFueSBtYXAuIFRodXMsIGEgUmVmZXJlbmNlU2V0IGNhbiBiZSBjcmVhdGVkIGJ5IHdyYXBwaW5nIGEKLSAqIDxjb2RlPlJlZmVyZW5jZU1hcDwvY29kZT4gaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogTW9zdCBtYXAgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgc2V0IGJ5IHBhc3NpbmcgaW4gZHVtbXkgdmFsdWVzLgotICogRXhjZXB0aW9ucyBpbmNsdWRlIDxjb2RlPkJpZGlNYXA8L2NvZGU+IGltcGxlbWVudGF0aW9ucywgYXMgdGhleSByZXF1aXJlIHVuaXF1ZSB2YWx1ZXMuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4xCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcEJhY2tlZFNldCBpbXBsZW1lbnRzIFNldCwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NzIzOTEyMjEzNzY2MDU2NTg3TDsKLQotICAgIC8qKiBUaGUgbWFwIGJlaW5nIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwIG1hcDsKLSAgICAvKiogVGhlIGR1bW15VmFsdWUgdG8gdXNlICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBkdW1teVZhbHVlOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgc2V0IGZyb20gYSBtYXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZGVjb3JhdGUoTWFwIG1hcCkgewotICAgICAgICByZXR1cm4gZGVjb3JhdGUobWFwLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBzZXQgZnJvbSBhIG1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwICB0aGUgbWFwIHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGR1bW15VmFsdWUgIHRoZSBkdW1teSB2YWx1ZSB0byB1c2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXAgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGRlY29yYXRlKE1hcCBtYXAsIE9iamVjdCBkdW1teVZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1hcCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNYXBCYWNrZWRTZXQobWFwLCBkdW1teVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAgdGhlIG1hcCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBkdW1teVZhbHVlICB0aGUgZHVtbXkgdmFsdWUgdG8gdXNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWFwIGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcEJhY2tlZFNldChNYXAgbWFwLCBPYmplY3QgZHVtbXlWYWx1ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLm1hcCA9IG1hcDsKLSAgICAgICAgdGhpcy5kdW1teVZhbHVlID0gZHVtbXlWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbWFwLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5rZXlTZXQoKS5jb250YWluc0FsbChjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iaikgewotICAgICAgICBpbnQgc2l6ZSA9IG1hcC5zaXplKCk7Ci0gICAgICAgIG1hcC5wdXQob2JqLCBkdW1teVZhbHVlKTsKLSAgICAgICAgcmV0dXJuIChtYXAuc2l6ZSgpICE9IHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgaW50IHNpemUgPSBtYXAuc2l6ZSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgbWFwLnB1dChvYmosIGR1bW15VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAobWFwLnNpemUoKSAhPSBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgewotICAgICAgICBpbnQgc2l6ZSA9IG1hcC5zaXplKCk7Ci0gICAgICAgIG1hcC5yZW1vdmUob2JqKTsKLSAgICAgICAgcmV0dXJuIChtYXAuc2l6ZSgpICE9IHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5rZXlTZXQoKS5yZW1vdmVBbGwoY29sbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpLnJldGFpbkFsbChjb2xsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCkudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCkudG9BcnJheShhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIG1hcC5rZXlTZXQoKS5lcXVhbHMob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpLmhhc2hDb2RlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1ByZWRpY2F0ZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDBkOGFiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5QcmVkaWNhdGVkQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZWNvcmF0ZXMgYW5vdGhlciA8Y29kZT5TZXQ8L2NvZGU+IHRvIHZhbGlkYXRlIHRoYXQgYWxsIGFkZGl0aW9ucwotICogbWF0Y2ggYSBzcGVjaWZpZWQgcHJlZGljYXRlLgotICogPHA+Ci0gKiBUaGlzIHNldCBleGlzdHMgdG8gcHJvdmlkZSB2YWxpZGF0aW9uIGZvciB0aGUgZGVjb3JhdGVkIHNldC4KLSAqIEl0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgdG8gZGVjb3JhdGUgYW4gZW1wdHkgc2V0LgotICogSWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgc2V0LCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotICogPHA+Ci0gKiBPbmUgdXNhZ2Ugd291bGQgYmUgdG8gZW5zdXJlIHRoYXQgbm8gbnVsbCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgc2V0LgotICogPHByZT5TZXQgc2V0ID0gUHJlZGljYXRlZFNldC5kZWNvcmF0ZShuZXcgSGFzaFNldCgpLCBOb3ROdWxsUHJlZGljYXRlLklOU1RBTkNFKTs8L3ByZT4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICogQGF1dGhvciBQYXVsIEphY2sKLSAqLwotcHVibGljIGNsYXNzIFByZWRpY2F0ZWRTZXQgZXh0ZW5kcyBQcmVkaWNhdGVkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFNldCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4NDUyMTQ2OTEwODY4NTExN0w7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcmVkaWNhdGVkICh2YWxpZGF0aW5nKSBzZXQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBzZXQgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHZhbGlkYXRpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2V0IGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldCBkZWNvcmF0ZShTZXQgc2V0LCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZFNldChzZXQsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgc2V0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSB2YWxpZGF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIHRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IG9yIHByZWRpY2F0ZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNldCBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZWRTZXQoU2V0IHNldCwgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAgICAgICBzdXBlcihzZXQsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2V0IGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldCBnZXRTZXQoKSB7Ci0gICAgICAgIHJldHVybiAoU2V0KSBnZXRDb2xsZWN0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1ByZWRpY2F0ZWRTb3J0ZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNvcnRlZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGRjMDVkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvUHJlZGljYXRlZFNvcnRlZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5QcmVkaWNhdGU7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkU2V0PC9jb2RlPiB0byB2YWxpZGF0ZSB0aGF0IGFsbCBhZGRpdGlvbnMKLSAqIG1hdGNoIGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KLSAqIDxwPgotICogVGhpcyBzZXQgZXhpc3RzIHRvIHByb3ZpZGUgdmFsaWRhdGlvbiBmb3IgdGhlIGRlY29yYXRlZCBzZXQuCi0gKiBJdCBpcyBub3JtYWxseSBjcmVhdGVkIHRvIGRlY29yYXRlIGFuIGVtcHR5IHNldC4KLSAqIElmIGFuIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIHNldCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIDxwPgotICogT25lIHVzYWdlIHdvdWxkIGJlIHRvIGVuc3VyZSB0aGF0IG5vIG51bGwgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIHNldC4KLSAqIDxwcmU+U29ydGVkU2V0IHNldCA9IFByZWRpY2F0ZWRTb3J0ZWRTZXQuZGVjb3JhdGUobmV3IFRyZWVTZXQoKSwgTm90TnVsbFByZWRpY2F0ZS5JTlNUQU5DRSk7PC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgUGF1bCBKYWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkaWNhdGVkU29ydGVkU2V0IGV4dGVuZHMgUHJlZGljYXRlZFNldCBpbXBsZW1lbnRzIFNvcnRlZFNldCB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkxMTA5NDgxNDgxMzIyNzUwNTJMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgcHJlZGljYXRlZCAodmFsaWRhdGluZykgc29ydGVkIHNldC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIHNldCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlICB0aGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciBwcmVkaWNhdGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzZXQgY29udGFpbnMgaW52YWxpZCBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkU2V0IGRlY29yYXRlKFNvcnRlZFNldCBzZXQsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkU29ydGVkU2V0KHNldCwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBzZXQgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHByZWRpY2F0ZSAgdGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHZhbGlkYXRpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgcHJlZGljYXRlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2V0IGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJlZGljYXRlZFNvcnRlZFNldChTb3J0ZWRTZXQgc2V0LCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gICAgICAgIHN1cGVyKHNldCwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzb3J0ZWQgc2V0IGJlaW5nIGRlY29yYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc29ydGVkIHNldAotICAgICAqLwotICAgIHByaXZhdGUgU29ydGVkU2V0IGdldFNvcnRlZFNldCgpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRTZXQpIGdldENvbGxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFNvcnRlZFNldCBzdWJTZXQoT2JqZWN0IGZyb21FbGVtZW50LCBPYmplY3QgdG9FbGVtZW50KSB7Ci0gICAgICAgIFNvcnRlZFNldCBzdWIgPSBnZXRTb3J0ZWRTZXQoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZFNvcnRlZFNldChzdWIsIHByZWRpY2F0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZFNldCBoZWFkU2V0KE9iamVjdCB0b0VsZW1lbnQpIHsKLSAgICAgICAgU29ydGVkU2V0IHN1YiA9IGdldFNvcnRlZFNldCgpLmhlYWRTZXQodG9FbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkU29ydGVkU2V0KHN1YiwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkU2V0IHRhaWxTZXQoT2JqZWN0IGZyb21FbGVtZW50KSB7Ci0gICAgICAgIFNvcnRlZFNldCBzdWIgPSBnZXRTb3J0ZWRTZXQoKS50YWlsU2V0KGZyb21FbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWNhdGVkU29ydGVkU2V0KHN1YiwgcHJlZGljYXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkU2V0KCkuZmlyc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGxhc3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5sYXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhcmF0b3IgY29tcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldCgpLmNvbXBhcmF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvU3luY2hyb25pemVkU2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1N5bmNocm9uaXplZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWE1ODhmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvU3luY2hyb25pemVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNldDwvY29kZT4gdG8gc3luY2hyb25pemUgaXRzIGJlaGF2aW91ciBmb3IgYQotICogbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIHN5bmNocm9uaXplZCwgdGhlbiBmb3J3YXJkZWQgdG8gdGhlIGRlY29yYXRlZCBzZXQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFNldCBleHRlbmRzIFN5bmNocm9uaXplZENvbGxlY3Rpb24gaW1wbGVtZW50cyBTZXQgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzA0NDE3Mzc4NjI2NTQzNjM1TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHN5bmNocm9uaXplZCBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZGVjb3JhdGUoU2V0IHNldCkgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZFNldChzZXQpOwotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN5bmNocm9uaXplZFNldChTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB3cmFwcyAobm90IGNvcGllcykuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBsb2NrICB0aGUgbG9jayBvYmplY3QgdG8gdXNlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3luY2hyb25pemVkU2V0KFNldCBzZXQsIE9iamVjdCBsb2NrKSB7Ci0gICAgICAgIHN1cGVyKHNldCwgbG9jayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVjb3JhdGVkIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldCBnZXRTZXQoKSB7Ci0gICAgICAgIHJldHVybiAoU2V0KSBjb2xsZWN0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9TeW5jaHJvbml6ZWRTb3J0ZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvU3luY2hyb25pemVkU29ydGVkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5M2FlNjUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9TeW5jaHJvbml6ZWRTb3J0ZWRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuY29sbGVjdGlvbi5TeW5jaHJvbml6ZWRDb2xsZWN0aW9uOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNvcnRlZFNldDwvY29kZT4gdG8gc3luY2hyb25pemUgaXRzIGJlaGF2aW91cgotICogZm9yIGEgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuCi0gKiA8cD4KLSAqIE1ldGhvZHMgYXJlIHN5bmNocm9uaXplZCwgdGhlbiBmb3J3YXJkZWQgdG8gdGhlIGRlY29yYXRlZCBzZXQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgU2VyaWFsaXphYmxlIGZyb20gQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjEuCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFNvcnRlZFNldCBleHRlbmRzIFN5bmNocm9uaXplZENvbGxlY3Rpb24gaW1wbGVtZW50cyBTb3J0ZWRTZXQgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3NzU1ODI4NjE5NTQ1MDAxMTFMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgc3luY2hyb25pemVkIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBkZWNvcmF0ZShTb3J0ZWRTZXQgc2V0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3luY2hyb25pemVkU29ydGVkU2V0KHNldCk7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3luY2hyb25pemVkU29ydGVkU2V0KFNvcnRlZFNldCBzZXQpIHsKLSAgICAgICAgc3VwZXIoc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIGxvY2sgIHRoZSBsb2NrIG9iamVjdCB0byB1c2UsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTeW5jaHJvbml6ZWRTb3J0ZWRTZXQoU29ydGVkU2V0IHNldCwgT2JqZWN0IGxvY2spIHsKLSAgICAgICAgc3VwZXIoc2V0LCBsb2NrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWNvcmF0ZWQgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlY29yYXRlZCBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU29ydGVkU2V0IGdldFNvcnRlZFNldCgpIHsKLSAgICAgICAgcmV0dXJuIChTb3J0ZWRTZXQpIGNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTb3J0ZWRTZXQgc3ViU2V0KE9iamVjdCBmcm9tRWxlbWVudCwgT2JqZWN0IHRvRWxlbWVudCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIFNvcnRlZFNldCBzZXQgPSBnZXRTb3J0ZWRTZXQoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCk7Ci0gICAgICAgICAgICAvLyB0aGUgbG9jayBpcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICAgICAgICAgIC8vIHN1YnNldCBpcyBzeW5jaHJvbml6ZWQgb24gdGhlIHNhbWUgbG9jayBhcyB0aGUgcGFyZW50Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZFNvcnRlZFNldChzZXQsIGxvY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZFNldCBoZWFkU2V0KE9iamVjdCB0b0VsZW1lbnQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBTb3J0ZWRTZXQgc2V0ID0gZ2V0U29ydGVkU2V0KCkuaGVhZFNldCh0b0VsZW1lbnQpOwotICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyBoZWFkc2V0IGlzIHN5bmNocm9uaXplZCBvbiB0aGUgc2FtZSBsb2NrIGFzIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY2hyb25pemVkU29ydGVkU2V0KHNldCwgbG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU29ydGVkU2V0IHRhaWxTZXQoT2JqZWN0IGZyb21FbGVtZW50KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgU29ydGVkU2V0IHNldCA9IGdldFNvcnRlZFNldCgpLnRhaWxTZXQoZnJvbUVsZW1lbnQpOwotICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyB0YWlsc2V0IGlzIHN5bmNocm9uaXplZCBvbiB0aGUgc2FtZSBsb2NrIGFzIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3luY2hyb25pemVkU29ydGVkU2V0KHNldCwgbG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5maXJzdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBsYXN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5sYXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvciBjb21wYXJhdG9yKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5jb21wYXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhYTI1NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1RyYW5zZm9ybWVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNldDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVHJhbnNmb3JtZWRDb2xsZWN0aW9uOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNldDwvY29kZT4gdG8gdHJhbnNmb3JtIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQuCi0gKiA8cD4KLSAqIFRoZSBhZGQgbWV0aG9kcyBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjbGFzcy4KLSAqIFRodXMgb2JqZWN0cyBtdXN0IGJlIHJlbW92ZWQgb3Igc2VhcmNoZWQgZm9yIHVzaW5nIHRoZWlyIHRyYW5zZm9ybWVkIGZvcm0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNvbnZlcnRzIFN0cmluZ3MgdG8gSW50ZWdlcnMsIHlvdSBtdXN0Ci0gKiB1c2UgdGhlIEludGVnZXIgZm9ybSB0byByZW1vdmUgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkU2V0IGV4dGVuZHMgVHJhbnNmb3JtZWRDb2xsZWN0aW9uIGltcGxlbWVudHMgU2V0IHsKLQotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDYxMjczODM1MDA0MTAzODZMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgdHJhbnNmb3JtaW5nIHNldC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIHNldCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIGNvbnZlcnNpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGRlY29yYXRlKFNldCBzZXQsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTZXQoc2V0LCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIHNldCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgTk9UIHRyYW5zZm9ybWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRoZSB0cmFuc2Zvcm1lciB0byB1c2UgZm9yIGNvbnZlcnNpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgdHJhbnNmb3JtZXIgaXMgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2Zvcm1lZFNldChTZXQgc2V0LCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgewotICAgICAgICBzdXBlcihzZXQsIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTb3J0ZWRTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVHJhbnNmb3JtZWRTb3J0ZWRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQ1OGQwOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1RyYW5zZm9ybWVkU29ydGVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIERlY29yYXRlcyBhbm90aGVyIDxjb2RlPlNvcnRlZFNldDwvY29kZT4gdG8gdHJhbnNmb3JtIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQuCi0gKiA8cD4KLSAqIFRoZSBhZGQgbWV0aG9kcyBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjbGFzcy4KLSAqIFRodXMgb2JqZWN0cyBtdXN0IGJlIHJlbW92ZWQgb3Igc2VhcmNoZWQgZm9yIHVzaW5nIHRoZWlyIHRyYW5zZm9ybWVkIGZvcm0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNvbnZlcnRzIFN0cmluZ3MgdG8gSW50ZWdlcnMsIHlvdSBtdXN0Ci0gKiB1c2UgdGhlIEludGVnZXIgZm9ybSB0byByZW1vdmUgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqIAotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMyICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVkU29ydGVkU2V0IGV4dGVuZHMgVHJhbnNmb3JtZWRTZXQgaW1wbGVtZW50cyBTb3J0ZWRTZXQgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjc1NDg2ODExMzUxMTI0Mzg2TDsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHRyYW5zZm9ybWluZyBzb3J0ZWQgc2V0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgc2V0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciB0cmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgZGVjb3JhdGUoU29ydGVkU2V0IHNldCwgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lZFNvcnRlZFNldChzZXQsIHRyYW5zZm9ybWVyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgc2V0IGJlaW5nIGRlY29yYXRlZCwgdGhleQotICAgICAqIGFyZSBOT1QgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciAgdGhlIHRyYW5zZm9ybWVyIHRvIHVzZSBmb3IgY29udmVyc2lvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciB0cmFuc2Zvcm1lciBpcyBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zZm9ybWVkU29ydGVkU2V0KFNvcnRlZFNldCBzZXQsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIHN1cGVyKHNldCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlY29yYXRlZCBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb3JhdGVkIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRTZXQgZ2V0U29ydGVkU2V0KCkgewotICAgICAgICByZXR1cm4gKFNvcnRlZFNldCkgY29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIE9iamVjdCBmaXJzdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldCgpLmZpcnN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBsYXN0KCkgewotICAgICAgICByZXR1cm4gZ2V0U29ydGVkU2V0KCkubGFzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYXJhdG9yIGNvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXQoKS5jb21wYXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTb3J0ZWRTZXQgc3ViU2V0KE9iamVjdCBmcm9tRWxlbWVudCwgT2JqZWN0IHRvRWxlbWVudCkgewotICAgICAgICBTb3J0ZWRTZXQgc2V0ID0gZ2V0U29ydGVkU2V0KCkuc3ViU2V0KGZyb21FbGVtZW50LCB0b0VsZW1lbnQpOwotICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkU29ydGVkU2V0KHNldCwgdHJhbnNmb3JtZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRTZXQgaGVhZFNldChPYmplY3QgdG9FbGVtZW50KSB7Ci0gICAgICAgIFNvcnRlZFNldCBzZXQgPSBnZXRTb3J0ZWRTZXQoKS5oZWFkU2V0KHRvRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRTZXQoc2V0LCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZFNldCB0YWlsU2V0KE9iamVjdCBmcm9tRWxlbWVudCkgewotICAgICAgICBTb3J0ZWRTZXQgc2V0ID0gZ2V0U29ydGVkU2V0KCkudGFpbFNldChmcm9tRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZWRTb3J0ZWRTZXQoc2V0LCB0cmFuc2Zvcm1lcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjOGMxYTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UeXBlZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbmNlb2ZQcmVkaWNhdGU7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U2V0PC9jb2RlPiB0byB2YWxpZGF0ZSB0aGF0IGVsZW1lbnRzCi0gKiBhZGRlZCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlLgotICogPHA+Ci0gKiBUaGUgdmFsaWRhdGlvbiBvZiBhZGRpdGlvbnMgaXMgcGVyZm9ybWVkIHZpYSBhbiBpbnN0YW5jZW9mIHRlc3QgYWdhaW5zdCAKLSAqIGEgc3BlY2lmaWVkIDxjb2RlPkNsYXNzPC9jb2RlPi4gSWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUKLSAqIGNvbGxlY3Rpb24sIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgTWF0dGhldyBIYXd0aG9ybmUKLSAqLwotcHVibGljIGNsYXNzIFR5cGVkU2V0IHsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHR5cGVkIHNldC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIHNldCBiZWluZyBkZWNvcmF0ZWQsIHRoZXkKLSAgICAgKiBhcmUgdmFsaWRhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgdG8gYWxsb3cgaW50byB0aGUgY29sbGVjdGlvbiwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBvciB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2V0IGNvbnRhaW5zIGludmFsaWQgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldCBkZWNvcmF0ZShTZXQgc2V0LCBDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlZFNldChzZXQsIEluc3RhbmNlb2ZQcmVkaWNhdGUuZ2V0SW5zdGFuY2UodHlwZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXN0cmljdGl2ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHlwZWRTZXQoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU29ydGVkU2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1R5cGVkU29ydGVkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2NjVjMGMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9UeXBlZFNvcnRlZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkluc3RhbmNlb2ZQcmVkaWNhdGU7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkU2V0PC9jb2RlPiB0byB2YWxpZGF0ZSB0aGF0IGVsZW1lbnRzCi0gKiBhZGRlZCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlLgotICogPHA+Ci0gKiBUaGUgdmFsaWRhdGlvbiBvZiBhZGRpdGlvbnMgaXMgcGVyZm9ybWVkIHZpYSBhbiBpbnN0YW5jZW9mIHRlc3QgYWdhaW5zdCAKLSAqIGEgc3BlY2lmaWVkIDxjb2RlPkNsYXNzPC9jb2RlPi4gSWYgYW4gb2JqZWN0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUKLSAqIGNvbGxlY3Rpb24sIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKgotICogQHNpbmNlIENvbW1vbnMgQ29sbGVjdGlvbnMgMy4wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIyOjE2OjMxICQKLSAqIAotICogQGF1dGhvciBTdGVwaGVuIENvbGVib3VybmUKLSAqIEBhdXRob3IgTWF0dGhldyBIYXd0aG9ybmUKLSAqLwotcHVibGljIGNsYXNzIFR5cGVkU29ydGVkU2V0IHsKLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHR5cGVkIHNvcnRlZCBzZXQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBzZXQgYmVpbmcgZGVjb3JhdGVkLCB0aGV5Ci0gICAgICogYXJlIHZhbGlkYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHBhcmFtIHR5cGUgIHRoZSB0eXBlIHRvIGFsbG93IGludG8gdGhlIGNvbGxlY3Rpb24sIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgb3IgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNldCBjb250YWlucyBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgZGVjb3JhdGUoU29ydGVkU2V0IHNldCwgQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZWRTb3J0ZWRTZXQoc2V0LCBJbnN0YW5jZW9mUHJlZGljYXRlLmdldEluc3RhbmNlKHR5cGUpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzdHJpY3RpdmUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFR5cGVkU29ydGVkU2V0KCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Vbm1vZGlmaWFibGVTZXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVW5tb2RpZmlhYmxlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmMTQzNTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL3NldC9Vbm1vZGlmaWFibGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U2V0PC9jb2RlPiB0byBlbnN1cmUgaXQgY2FuJ3QgYmUgYWx0ZXJlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlU2V0Ci0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemFibGVTZXREZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUgewotCi0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0OTkxMTk4NzIxODUyNDAxNjFMOwotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIHVubW9kaWZpYWJsZSBzZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNldCAgdGhlIHNldCB0byBkZWNvcmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNldCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZGVjb3JhdGUoU2V0IHNldCkgewotICAgICAgICBpZiAoc2V0IGluc3RhbmNlb2YgVW5tb2RpZmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlU2V0KHNldCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgd3JhcHMgKG5vdCBjb3BpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXQgIHRoZSBzZXQgdG8gZGVjb3JhdGUsIG11c3Qgbm90IGJlIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZXQgaXMgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVW5tb2RpZmlhYmxlU2V0KFNldCBzZXQpIHsKLSAgICAgICAgc3VwZXIoc2V0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gVW5tb2RpZmlhYmxlSXRlcmF0b3IuZGVjb3JhdGUoZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gY29sbCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVW5tb2RpZmlhYmxlU29ydGVkU2V0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L1VubW9kaWZpYWJsZVNvcnRlZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2NiZDM0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvVW5tb2RpZmlhYmxlU29ydGVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVW5tb2RpZmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuVW5tb2RpZmlhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogRGVjb3JhdGVzIGFub3RoZXIgPGNvZGU+U29ydGVkU2V0PC9jb2RlPiB0byBlbnN1cmUgaXQgY2FuJ3QgYmUgYWx0ZXJlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBTZXJpYWxpemFibGUgZnJvbSBDb21tb25zIENvbGxlY3Rpb25zIDMuMS4KLSAqCi0gKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjI6MTY6MzEgJAotICogCi0gKiBAYXV0aG9yIFN0ZXBoZW4gQ29sZWJvdXJuZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5tb2RpZmlhYmxlU29ydGVkU2V0Ci0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTb3J0ZWRTZXREZWNvcmF0b3IKLSAgICAgICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcyNTM1Njg4NTQ2Nzk2MjQyNEw7Ci0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gdW5tb2RpZmlhYmxlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBkZWNvcmF0ZShTb3J0ZWRTZXQgc2V0KSB7Ci0gICAgICAgIGlmIChzZXQgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVTb3J0ZWRTZXQoc2V0KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGNvbGxlY3Rpb24gb3V0IHVzaW5nIGEgY3VzdG9tIHJvdXRpbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dCAgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGNvbGxlY3Rpb24gaW4gdXNpbmcgYSBjdXN0b20gcm91dGluZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0gICAgICAgIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgaW4ucmVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHdyYXBzIChub3QgY29waWVzKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2V0ICB0aGUgc2V0IHRvIGRlY29yYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2V0IGlzIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFVubW9kaWZpYWJsZVNvcnRlZFNldChTb3J0ZWRTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKHNldCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIFVubW9kaWZpYWJsZUl0ZXJhdG9yLmRlY29yYXRlKGdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGNvbGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTb3J0ZWRTZXQgc3ViU2V0KE9iamVjdCBmcm9tRWxlbWVudCwgT2JqZWN0IHRvRWxlbWVudCkgewotICAgICAgICBTb3J0ZWRTZXQgc3ViID0gZ2V0U29ydGVkU2V0KCkuc3ViU2V0KGZyb21FbGVtZW50LCB0b0VsZW1lbnQpOwotICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZVNvcnRlZFNldChzdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTb3J0ZWRTZXQgaGVhZFNldChPYmplY3QgdG9FbGVtZW50KSB7Ci0gICAgICAgIFNvcnRlZFNldCBzdWIgPSBnZXRTb3J0ZWRTZXQoKS5oZWFkU2V0KHRvRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlU29ydGVkU2V0KHN1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIFNvcnRlZFNldCB0YWlsU2V0KE9iamVjdCBmcm9tRWxlbWVudCkgewotICAgICAgICBTb3J0ZWRTZXQgc3ViID0gZ2V0U29ydGVkU2V0KCkudGFpbFNldChmcm9tRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlU29ydGVkU2V0KHN1Yik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9vcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvc2V0L3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzNjNWNhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy9zb3VyY2UtYnVuZGxlL29yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9zZXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCx2IDEuMSAyMDA5LzA1LzI3IDIyOjE2OjMyIG1wYXJrZXIgRXhwICQgLS0+Ci0gPCEtLQotICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08Qk9EWT4KLTxwPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLXtAbGluayBqYXZhLnV0aWwuU2V0IFNldH0gYW5kCi17QGxpbmsgamF2YS51dGlsLlNvcnRlZFNldCBTb3J0ZWRTZXR9IGludGVyZmFjZXMuCi08cD4KLVRoZSBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoZSBmb3JtIG9mIGRpcmVjdCBpbXBsZW1lbnRhdGlvbnMgYW5kIGRlY29yYXRvcnMuCi1BIGRlY29yYXRvciB3cmFwcyBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG8gYWRkIHNvbWUKLXNwZWNpZmljIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KLTxwPgotVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgYXJlIHByb3ZpZGVkIGluIHRoZSBwYWNrYWdlOgotPHVsPgotPGxpPkNvbXBvc2l0ZVNldCAtIGEgc2V0IHRoYXQgY29tYmluZXMgbXVsdGlwbGUgc2V0cyBpbnRvIG9uZQotPC91bD4KLVRoZSBmb2xsb3dpbmcgZGVjb3JhdG9ycyBhcmUgcHJvdmlkZWQgaW4gdGhlIHBhY2thZ2U6Ci08dWw+Ci08bGk+U3luY2hyb25pemVkIC0gc3luY2hyb25pemVzIG1ldGhvZCBhY2Nlc3MgZm9yIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50cwotPGxpPlVubW9kaWZpYWJsZSAtIGVuc3VyZXMgdGhlIGNvbGxlY3Rpb24gY2Fubm90IGJlIGFsdGVyZWQKLTxsaT5QcmVkaWNhdGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nIHRvIGEgcHJlZGljYXRlIGNhbiBiZSBhZGRlZAotPGxpPlR5cGVkIC0gZW5zdXJlcyB0aGF0IG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlIGNhbiBiZSBhZGRlZAotPGxpPlRyYW5zZm9ybWVkIC0gdHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgYWRkZWQKLTxsaT5MaXN0T3JkZXJlZCAtIGVuc3VyZXMgdGhhdCBpbnNlcnRpb24gb3JkZXIgaXMgcmV0YWluZWQKLTxsaT5NYXBCYWNrZWRTZXQgLSBhIHNldCBmb3JtZWQgYnkgZGVjb3JhdGluZyBhIE1hcAotPC91bD4KLTwvcHJlPgotPC9CT0RZPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zL3NvdXJjZS1idW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxOWZhNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMvc291cmNlLWJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCi0jIAotIyBDb250cmlidXRvcnM6IAotIyBDaHJpcyBBbmlzemN6eWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1BcGFjaGUgQ29tbW9ucyBDb2xsZWN0aW9ucwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLmNsYXNzcGF0aCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZTQ3YzcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9IiIgc291cmNlcGF0aD0ic291cmNlLWJ1bmRsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImphdmFCaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLmN2c2lnbm9yZSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNTY4YjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1qYXZhQmluCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLy5wcm9qZWN0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0ZGQzMGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubGFuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzQ2MWFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nCi1CdW5kbGUtVmVyc2lvbjogMi40LjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKUkUtMS4xCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLmxhbmc7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXI7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW07dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW1zO3ZlcnNpb249IjIuNC4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb247dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLm1hdGg7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLm11dGFibGU7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnRleHQ7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnRpbWU7dmVyc2lvbj0iMi40LjAiCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9hYm91dC5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzljMDk5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgOCwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQkJCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5KYWthcnRhIENvbW1vbnMgTGFuZyAyLjQ8L2g0PgotPHA+VGhlIHBsdWctaW4gaW5jbHVkZXMgSmFrYXJ0YSBDb21tb25zIExhbmcgMi40ICgmcXVvdDtDb21tb25zIExhbmcmcXVvdDspIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYXMgcGFydCBvZiB0aGUgSmFrYXJ0YSBwcm9qZWN0LiAgVGhlcmVmb3JlOjwvcD4KLQotPGJsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvYT4pLgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGUgQ29tbW9ucyBMYW5nIGJpbmFyeSBjb2RlIGlzIGluY2x1ZGVkIHdpdGggbm8gbW9kaWZpY2F0aW9ucyBleGNlcHQgcG9zdHByb2Nlc3NpbmcKLShwYWNrMjAwIGNvbmRpdGlvbmluZyBhbmQgc2lnbmluZykuIFRoZSBjb3JyZXNwb25kaW5nIENvbW1vbnMgTGFuZyBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIHNyYy56aXAuPC9wPgotCi08cD5Db21tb25zIE5ldCBpczo8L3A+Ci0KLTxibG9ja3F1b3RlPkNvcHlyaWdodCAoYykgMTk5Ny0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L2Jsb2NrcXVvdGU+Ci0KLTxwPllvdXIgdXNlIG9mIHRoZSBDb21tb25zIExhbmcgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAotaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvTElDRU5TRS50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4KLQotPHA+VGhlIEFwYWNoZSBhdHRyaWJ1dGlvbiA8YSBocmVmPSJhYm91dF9maWxlcy9OT1RJQ0UudHh0Ij5OT1RJQ0UudHh0PC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgotCi08cD5FeGFtcGxlcyBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIHVwZGF0ZWQgc291cmNlIGNvZGUgZm9yIENvbW1vbnMgTGFuZyBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xhbmcvIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbGFuZy88L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXRfZmlsZXMvTk9USUNFLnR4dCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL2Fib3V0X2ZpbGVzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0ODYyZGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXRfZmlsZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQXBhY2hlIENvbW1vbnMgTGFuZwotQ29weXJpZ2h0IDIwMDEtMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL2Fib3V0X2ZpbGVzL1JFTEVBU0UtTk9URVMudHh0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXRfZmlsZXMvUkVMRUFTRS1OT1RFUy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3YzhjOGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYWJvdXRfZmlsZXMvUkVMRUFTRS1OT1RFUy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotJElkOiBSRUxFQVNFLU5PVEVTLnR4dCx2IDEuMSAyMDA5LzA1LzI3IDIyOjExOjMxIG1wYXJrZXIgRXhwICQKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9ucyBMYW5nIFBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSBOb3RlcwotCi0KLUlOVFJPRFVDVElPTjoKLQotVGhpcyBkb2N1bWVudCBjb250YWlucyB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIDIuNCB2ZXJzaW9uIG9mIEFwYWNoZSBDb21tb25zIExhbmcuCi1Db21tb25zIExhbmcgaXMgYSBzZXQgb2YgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIHJldXNhYmxlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgb2YgdXNlIGluIGFueSBKYXZhIGVudmlyb25tZW50LgotCi1MYW5nIDIuNCBubyBsb25nZXIgYXR0ZW1wdHMgdG8gdGFyZ2V0IHRoZSBKYXZhIDEuMSBlbnZpcm9ubWVudCBhbmQgbm93IHRhcmdldHMgSmF2YSAxLjIuIFdoaWxlIHByZXZpb3VzIHZlcnNpb25zIAotd2VyZSBidWlsdCBmb3IgMS4xLCBzb21lIHBhcnRzIHdlcmUgdXNpbmcgbWV0aG9kcyB0aGF0IHdlcmUgb25seSBhdmFpbGFibGUgaW4gMS4yLCBhbmQgdGhlIEVudW0gY2xhc3MgaGFkIAotYmVjb21lIGRlcGVuZGVudCBvbiBKYXZhIDEuMy4gCi0KLUlOQ09NUEFUSUJMRSBDSEFOR0VTIFdJVEggVkVSU0lPTiAyLjM6Ci0KLS0gTm9uZQotCi1JTkNPTVBBVElCTEUgQ0hBTkdFUyBXSVRIIFZFUlNJT04gMi4yOgotCi0tIENhbGxpbmcgc3RvcCBvbiBhIHN1c3BlbmRlZCBTdG9wV2F0Y2ggd2lsbCBubyBsb25nZXIgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIHRpbWUuIAotICBJdCdzIHZlcnkgdW5saWtlbHkgYW55b25lIHdhcyByZWx5aW5nIG9uIHRoYXQgYnVnIGFzIGEgZmVhdHVyZS4KLQotQURESVRJT05BTCBJTkNPTVBBVElCTEUgQ0hBTkdFUyBXSVRIIFZFUlNJT04gMi4wOgotCi0tIFRoZSBOZXN0YWJsZSBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kIGluZGV4T2ZUaHJvd2FibGUoQ2xhc3MpLgotUHJldmlvdXNseSB0aGUgaW1wbGVtZW50YXRpb25zIGNoZWNrZWQgb25seSBmb3IgYSBzcGVjaWZpYyBDbGFzcy4KLU5vdyB0aGV5IGNoZWNrIGZvciBzdWJjbGFzc2VzIG9mIHRoYXQgQ2xhc3MgYXMgd2VsbC4KLUZvciBtb3N0IHNpdHVhdGlvbnMgdGhpcyB3aWxsIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIgKGllLiBpdHMgYSBidWcgZml4KS4KLUlmIGl0IGNhdXNlcyBwcm9ibGVtcywgcGxlYXNlIHVzZSB0aGUgRXhjZXB0aW9uVXRpbHMuaW5kZXhPZlRocm93YWJsZShDbGFzcykgbWV0aG9kIGluc3RlYWQuCi1Ob3RlIHRoYXQgdGhlIEV4Y2VwdGlvblV0aWxzIG1ldGhvZCBpcyBhdmFpbGFibGUgaW4gdjEuMCBhbmQgdjIuMCBvZiBjb21tb25zLWxhbmcgYW5kIGhhcyBub3QgYmVlbiBjaGFuZ2VkLgotKEFuIGFsdGVybmF0aXZlIHRvIHRoaXMgaXMgdG8gY2hhbmdlIHRoZSBwdWJsaWMgc3RhdGljIG1hdGNoU3ViY2xhc3NlcyBmbGFnIG9uIE5lc3RhYmxlRGVsZWdhdGUuCi1Ib3dldmVyLCB3ZSBkb24ndCByZWNvbW1lbmQgdGhhdCBhcyBhIGxvbmctdGVybSBzb2x1dGlvbi4pCi0KLS0gVGhlIFN0b3BXYXRjaCBjbGFzcyBoYXMgaGFkIG11Y2ggZXh0cmEgdmFsaWRhdGlvbiBhZGRlZC4KLUlmIHlvdXIgY29kZSBwcmV2aW91c2x5IHJlbGllZCBvbiB1bnVzdWFsIGFzcGVjdHMsIGl0IG1heSBubyBsb25nZXIgd29yay4KLQotLSBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4xLCBBbnQgdmVyc2lvbiAxLjYueCBpcyByZXF1aXJlZCB0byBidWlsZC4gQ29weSAKLWp1bml0LmphciB0byBBTlRfSE9NRS9saWIuIFlvdSBjYW4gZ2V0IEpVbml0IGZyb20gaHR0cDovL3d3dy5qdW5pdC5vcmcuIFNlZSB0aGUgZGV2ZWxvcGVyJ3MgZ3VpZGUKLWZvciBtb3JlIGRldGFpbHMuCi0KLURFUFJFQ0FUSU9OUyBGUk9NIDIuMyB0byAyLjQ6Ci0KLS0gT2JqZWN0VXRpbHMuYXBwZW5kSWRlbnRpdHlUb1N0cmluZyhTdHJpbmdCdWZmZXIsIE9iamVjdCkgLSBoYXMgdmVyeSBvZGQgc2VtYW50aWNzLCB1c2UgCi0gIE9iamVjdFV0aWxzLmlkZW50aXR5VG9TdHJpbmcoU3RyaW5nQnVmZmVyLCBPYmplY3QpIGluc3RlYWQuCi0KLS0gcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhZGQoamF2YS51dGlsLkRhdGUsIGludCwgaW50KSAtIGl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgdGhpcyAKLSAgbWV0aG9kIHRvIGJlIHB1YmxpYy4gUGxlYXNlIGxldCB1cyBrbm93IGlmIHlvdSB1c2UgdGhpcy4gCi0KLURFUFJFQ0FUSU9OUyBGUk9NIDIuMiB0byAyLjM6Ci0KLS0gTm9uZQotCi1ERVBSRUNBVElPTlMgRlJPTSAyLjEgdG8gMi4yOgotCi0tIE5vbmUKLQotREVQUkVDQVRJT05TIEZST00gMi4wIHRvIDIuMToKLQotLSBUaGUgZW51bSBwYWNrYWdlIGhhcyBiZWVuIHJlbmFtZWQgdG8gZW51bXMgZm9yIEpESzEuNSBjb21waWxhbmNlLgotQWxsIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsLCBqdXN0IHRoZSBwYWNrYWdlIGhhcyBjaGFuZ2VkLgotVGhpcyBwYWNrYWdlIHdpbGwgYmUgcmVtb3ZlZCBpbiB2My4wLgotCi0tIE51bWJlclV0aWxzLnN0cmluZ1RvSW50IC0gcmVuYW1lZCB0byB0b0ludAotCi0tIERhdGVVdGlscyAtIGZvdXIgY29uc3RhbnRzLCBNSUxMSVNfSU5fKiBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyB0aGV5IHdlcmUgZGVmaW5lZAotYXMgaW50IG5vdCBsb25nLiBUaGUgcmVwbGFjZW1lbnRzIGFyZSBNSUxMSVNfUEVSXyouIAotCi0KLUJVRyBGSVhFUyBJTiAyLjQ6Ci0KLSAgICAqIFtMQU5HLTc2IF0gLSBFbnVtVXRpbHMuZ2V0RW51bSgpIGRvZXNuJ3Qgd29yayB3ZWxsIGluIDEuNQotICAgICogW0xBTkctMzI4XSAtIExvY2FsZVV0aWxzLnRvTG9jYWxlKCkgcmVqZWN0cyBzdHJpbmdzIHdpdGggb25seSBsYW5ndWFnZSt2YXJpYW50Ci0gICAgKiBbTEFORy0zMzRdIC0gRW51bSBpcyBub3QgdGhyZWFkLXNhZmUKLSAgICAqIFtMQU5HLTM0Nl0gLSBEYXRlcy5yb3VuZCgpIGJlaGF2ZXMgaW5jb3JyZWN0bHkgZm9yIG1pbnV0ZXMgYW5kIHNlY29uZHMKLSAgICAqIFtMQU5HLTM0OV0gLSBEZWFkbG9jayB1c2luZyBSZWZsZWN0aW9uVG9TdHJpbmdCdWlsZGVyCi0gICAgKiBbTEFORy0zNTNdIC0gSmF2YWRvYyBFeGFtcGxlIGZvciBFcXVhbHNCdWlsZGVyIGlzIHF1ZXN0aW9uYWJsZQotICAgICogW0xBTkctMzYwXSAtIFdoeSBkb2VzIGFwcGVuZElkZW50aXR5VG9TdHJpbmcgcmV0dXJuIG51bGw/Ci0gICAgKiBbTEFORy0zNjFdIC0gQm9vbGVhblV0aWxzIHRvQm9vbGVhbk9iamVjdCBqYXZhZG9jIGRvZXMgbm90IG1hdGNoIGltcGxlbWVudGF0aW9uCi0gICAgKiBbTEFORy0zNjNdIC0gU3RyaW5nRXNjYXBlVXRpbHMuLmVzY2FwZUphdmFTY3JpcHQoKSBtZXRob2QgZGlkIG5vdCBlc2NhcGUgJy8nIGludG8gJ1wvJywgaXQgd2lsbCBtYWtlIElFIHJlbmRlciBwYWdlIHVuY29ycmVjdGx5Ci0gICAgKiBbTEFORy0zNjRdIC0gRG9jdW1lbnRhdGlvbiBidWcgZm9yIGlnbm9yZUVtcHR5VG9rZW5zIGFjY2Vzc29ycyBpbiBTdHJUb2tlbml6ZXIKLSAgICAqIFtMQU5HLTM2NV0gLSBCb29sZWFuVXRpbHMudG9Cb29sZWFuKCkgLSBpbnZhbGlkIGRyb3AtdGhydSBpbiBjYXNlIHN0YXRlbWVudCBjYXVzZXMgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotICAgICogW0xBTkctMzY3XSAtIEZhc3REYXRlRm9ybWF0IHRocmVhZCBzYWZldHkKLSAgICAqIFtMQU5HLTM2OF0gLSBGYXN0RGF0ZUZvcm1hdCBnZXREYXRlSW5zdGFuY2UoKSBhbmQgZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpIGFzc3VtZSBMb2NhbGUuZ2V0RGVmYXVsdCgpIHdvbid0IGNoYW5nZQotICAgICogW0xBTkctMzY5XSAtIEV4Y2VwdGlvblV0aWxzIG5vdCB0aHJlYWQtc2FmZQotICAgICogW0xBTkctMzcyXSAtIFRvU3RyaW5nQnVpbGRlcjogTVVMVElfTElORV9TVFlMRSBkb2VzIG5vdCBwcmludCBhbnl0aGluZyBmcm9tIGFwcGVuZFRvU3RyaW5nIG1ldGhvZHMuCi0gICAgKiBbTEFORy0zODBdIC0gaW5maW5pdGUgbG9vcCBpbiBGcmFjdGlvbi5yZWR1Y2Ugd2hlbiBudW1lcmF0b3IgPT0gMAotICAgICogW0xBTkctMzgxXSAtIE51bWJlclV0aWxzLm1pbihmbG9hdEFycmF5KSByZXR1cm5zIHdyb25nIHZhbHVlIGlmIGZsb2F0QXJyYXlbMF0gaGFwcGVucyB0byBiZSBGbG9hdC5OYU4KLSAgICAqIFtMQU5HLTM4NV0gLSBodHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL2xhbmcvZGV2ZWxvcGVyZ3VpZGUuaHRtbCAiQnVpbGRpbmciIHNlY3Rpb24gaXMgaW5jb3JyZWN0IGFuZCBpbmNvbXBsZXRlCi0gICAgKiBbTEFORy0zOTNdIC0gRXF1YWxzQnVpbGRlciBkb24ndCBjb21wYXJlIEJpZ0RlY2ltYWxzIGNvcnJlY3RseQotICAgICogW0xBTkctMzk5XSAtIEphdmFkb2MgYnVncyAtIGNhbm5vdCBmaW5kIG9iamVjdAotICAgICogW0xBTkctNDEwXSAtIEFtYmlndW91cyAvIGNvbmZ1c2luZyBuYW1lcyBpbiBTdHJpbmdVdGlscyByZXBsYWNlKiBtZXRob2RzCi0gICAgKiBbTEFORy00MTJdIC0gU3RyQnVpbGRlciBhcHBlbmRGaXhlZFdpZHRoIGRvZXMgbm90IGhhbmRsZSBudWxscwotICAgICogW0xBTkctNDE0XSAtIERhdGVVdGlscy5yb3VuZCgpIG9mdGVuIGZhaWxzCi0KLUlNUFJPVkVNRU5UUyBJTiAyLjQ6Ci0KLSAgICAqIFtMQU5HLTE4MF0gLSBhZGRpbmcgYSBTdHJpbmdVdGlscy5yZXBsYWNlIG1ldGhvZCB0aGF0IHRha2VzIGFuIGFycmF5IG9yIExpc3Qgb2YgcmVwbGFjZW1lbnQgc3RyaW5ncwotICAgICogW0xBTkctMTkyXSAtIFNwbGl0IGNhbWVsIGNhc2Ugc3RyaW5ncwotICAgICogW0xBTkctMjU3XSAtIEFkZCBuZXcgc3BsaXRCeVdob2xlU2VwYXJhdG9yUHJlc2VydmVBbGxUb2tlbnMoKSBtZXRob2RzIHRvIFN0cmluZ1V0aWxzCi0gICAgKiBbTEFORy0yNjldIC0gU2hvdWxkbid0IENvbW1vbnMgTGFuZydzIFN0cmluZ1V0aWxzIGhhdmUgYSAiY29tbW9uIiBzdHJpbmcgbWV0aG9kPwotICAgICogW0xBTkctMjk4XSAtIENsYXNzVXRpbHMuZ2V0U2hvcnRDbGFzc05hbWUgYW5kIENsYXNzVXRpbHMuZ2V0UGFja2FnZU5hbWUgYW5kIGNsYXNzIG9mIGFycmF5Ci0gICAgKiBbTEFORy0zMjFdIC0gQWRkIHRvQXJyYXkoKSBtZXRob2QgdG8gSW50UmFuZ2UgYW5kIExvbmdSYW5nZSBjbGFzc2VzCi0gICAgKiBbTEFORy0zMjJdIC0gQ2xhc3NVdGlscy5nZXRTaG9ydENsYXNzTmFtZShTdHJpbmcpIGluZWZmaWNpZW50Ci0gICAgKiBbTEFORy0zMjZdIC0gU3RyaW5nVXRpbHM6IHN0YXJ0c1dpdGggLyBlbmRzV2l0aCAvIHN0YXJ0c1dpdGhJZ25vcmVDYXNlIC8gZW5kc1dpdGhJZ25vcmVDYXNlIC8gcmVtb3ZlU3RhcnRJZ25vcmVDYXNlIC8gcmVtb3ZlRW5kSWdub3JlQ2FzZSBtZXRob2RzCi0gICAgKiBbTEFORy0zMjldIC0gUG9pbnRsZXNzIHN5bmNocm9uaXplZCBpbiBUaHJlYWRMb2NhbC5pbml0aWFsVmFsdWUgc2hvdWxkIGJlIHJlbW92ZWQKLSAgICAqIFtMQU5HLTMzM10gLSBBcnJheVV0aWxzLnRvQ2xhc3MKLSAgICAqIFtMQU5HLTMzN10gLSBVdGlsaXR5IGNsYXNzIGNvbnN0cnVjdG9yIGphdmFkb2NzIHNob3VsZCBhY2tub3dsZWRnZSB0aGF0IHRoZXkgbWF5IHNvbWV0aW1lcyBiZSB1c2VkLCBlLmcuIHdpdGggVmVsb2NpdHkuCi0gICAgKiBbTEFORy0zMzhdIC0gdHJ1bmNhdGVOaWNlbHkgbWV0aG9kIHdoaWNoIGF2b2lkcyB0cnVuY2F0aW5nIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkCi0gICAgKiBbTEFORy0zNDVdIC0gT3B0aW1pemUgSGFzaENvZGVCdWlsZGVyLmFwcGVuZChPYmplY3QpCi0gICAgKiBbTEFORy0zNTFdIC0gRXh0ZW5zaW9uIHRvIENsYXNzVXRpbHM6IE9idGFpbiB0aGUgcHJpbWl0aXZlIGNsYXNzIGZyb20gYSB3cmFwcGVyCi0gICAgKiBbTEFORy0zNTZdIC0gQWRkIGdldFN0YXJ0VGltZSB0byBTdG9wV2F0Y2gKLSAgICAqIFtMQU5HLTM2Ml0gLSBBZGQgRXh0ZW5kZWRNZXNzYWdlRm9ybWF0IHRvIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnRleHQKLSAgICAqIFtMQU5HLTM3MV0gLSBUb1N0cmluZ1N0eWxlIGphdmFkb2Mgc2hvdWxkIHNob3cgZXhhbXBsZXMgb2Ygc3R5bGVzCi0gICAgKiBbTEFORy0zNzRdIC0gQWRkIGVzY2FwaW5nIGZvciBDU1YgY29sdW1ucyB0byBTdHJpbmdFc2NhcGVVdGlscwotICAgICogW0xBTkctMzc1XSAtIGFkZCBTeXN0ZW1VdGlscy5JU19PU19XSU5ET1dTX1ZJU1RBIGZpZWxkCi0gICAgKiBbTEFORy0zNzldIC0gQ2FsY3VsYXRpbmcgQSBkYXRlIGZyYWdtZW50IGluIGFueSB0aW1lLXVuaXQKLSAgICAqIFtMQU5HLTM4M10gLSBBZGRpbmcgZnVuY3Rpb25hbGl0eSB0byBEYXRlVXRpbHMgdG8gYWxsb3cgZGlyZWN0IHNldHRpbmcgb2YgdmFyaW91cyBmaWVsZHMuCi0gICAgKiBbTEFORy00MDJdIC0gT1NHaS1pZnkgTGFuZwotICAgICogW0xBTkctNDA0XSAtIEFkZCBDYWxlbmRhciBmbGF2b3VyIGZvcm1hdCBtZXRob2RzIHRvIERhdGVGb3JtYXRVdGlscwotICAgICogW0xBTkctNDA3XSAtIFN0cmluZ1V0aWxzLmxlbmd0aChTdHJpbmcpIHJldHVybnMgbnVsbC1zYWZlIGxlbmd0aAotICAgICogW0xBTkctNDEzXSAtIE1lbW9yeSB1c2FnZSBpbXByb3ZlbWVudCBmb3IgU3RyaW5nVXRpbHMjZ2V0TGV2ZW5zaHRlaW5EaXN0YW5jZSgpCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9idWlsZC5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGM0OGU2Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBvcmcvLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLwotb3V0cHV0Li4gPSAuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQXJyYXlVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0FycmF5VXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZTgxYTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQXJyYXlVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0JpdEZpZWxkLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQml0RmllbGQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjOTRiNjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQml0RmllbGQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9Cb29sZWFuVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9Cb29sZWFuVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwYWM0ZDcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQm9vbGVhblV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2hhckVuY29kaW5nLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2hhckVuY29kaW5nLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjM1ZTI1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJFbmNvZGluZy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJSYW5nZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJSYW5nZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzhmMTJkMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DaGFyUmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DaGFyU2V0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2hhclNldC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMyZmI5Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DaGFyU2V0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2hhclNldFV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2hhclNldFV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDBhMmE2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJTZXRVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0NoYXJVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NhNmU3My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DaGFyVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DbGFzc1V0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvQ2xhc3NVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ3Yjk4Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9DbGFzc1V0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkQXJyYXlFbnRpdHlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRBcnJheUVudGl0eU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ5NGNlNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRBcnJheUVudGl0eU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJEJpbmFyeUVudGl0eU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJEJpbmFyeUVudGl0eU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTczODA5MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRCaW5hcnlFbnRpdHlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRFbnRpdHlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRFbnRpdHlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3N2ZmM2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkRW50aXR5TWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkSGFzaEVudGl0eU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJEhhc2hFbnRpdHlNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NjE3ZGEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkSGFzaEVudGl0eU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJExvb2t1cEVudGl0eU1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJExvb2t1cEVudGl0eU1hcC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDM1Nzc2Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRMb29rdXBFbnRpdHlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRNYXBJbnRNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRNYXBJbnRNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhZTNiNWMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkTWFwSW50TWFwLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkUHJpbWl0aXZlRW50aXR5TWFwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvRW50aXRpZXMkUHJpbWl0aXZlRW50aXR5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDM4ZWU5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJFByaW1pdGl2ZUVudGl0eU1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJFRyZWVFbnRpdHlNYXAuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcyRUcmVlRW50aXR5TWFwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjI1MWJhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzJFRyZWVFbnRpdHlNYXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9FbnRpdGllcy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTM3ODc1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0VudGl0aWVzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvSWxsZWdhbENsYXNzRXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvSWxsZWdhbENsYXNzRXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWQ5NGUwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0lsbGVnYWxDbGFzc0V4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0luY29tcGxldGVBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0luY29tcGxldGVBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTJlODEyYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9JbmNvbXBsZXRlQXJndW1lbnRFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9JbnRIYXNoTWFwJEVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvSW50SGFzaE1hcCRFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTYxZDE3Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9JbnRIYXNoTWFwJEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvSW50SGFzaE1hcC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0ludEhhc2hNYXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMzY2NGYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvSW50SGFzaE1hcC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL0xvY2FsZVV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTG9jYWxlVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5Yjc1M2UuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTG9jYWxlVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDU1NTNhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTnVsbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTnVsbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzIzZTMxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL051bGxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL051bWJlclJhbmdlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTnVtYmVyUmFuZ2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4OGYzYzAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvTnVtYmVyUmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9OdW1iZXJVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL051bWJlclV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGZmODBkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL051bWJlclV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvT2JqZWN0VXRpbHMkTnVsbC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL09iamVjdFV0aWxzJE51bGwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyYTAyOWYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvT2JqZWN0VXRpbHMkTnVsbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL09iamVjdFV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvT2JqZWN0VXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NjIyOTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvT2JqZWN0VXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9SYW5kb21TdHJpbmdVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1JhbmRvbVN0cmluZ1V0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzZjOTFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1JhbmRvbVN0cmluZ1V0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvU2VyaWFsaXphdGlvbkV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1NlcmlhbGl6YXRpb25FeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MTJlMmUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvU2VyaWFsaXphdGlvbkV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1NlcmlhbGl6YXRpb25VdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1NlcmlhbGl6YXRpb25VdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThiZWRmNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9TZXJpYWxpemF0aW9uVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9TdHJpbmdFc2NhcGVVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1N0cmluZ0VzY2FwZVV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGU2MzY2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1N0cmluZ0VzY2FwZVV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvU3RyaW5nVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9TdHJpbmdVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzIxM2VlNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9TdHJpbmdVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1N5c3RlbVV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvU3lzdGVtVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxYmVlZGIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvU3lzdGVtVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9VbmhhbmRsZWRFeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9VbmhhbmRsZWRFeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVjZjI3ZDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvVW5oYW5kbGVkRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvVmFsaWRhdGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9WYWxpZGF0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ViODk1Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9WYWxpZGF0ZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1dvcmRVdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL1dvcmRVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZmNWVlOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9Xb3JkVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL0NvbXBhcmVUb0J1aWxkZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL0NvbXBhcmVUb0J1aWxkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzOGRhOTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Db21wYXJlVG9CdWlsZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9FcXVhbHNCdWlsZGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9FcXVhbHNCdWlsZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmYyZDE2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvRXF1YWxzQnVpbGRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvSGFzaENvZGVCdWlsZGVyJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL0hhc2hDb2RlQnVpbGRlciQxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmUyNWFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvSGFzaENvZGVCdWlsZGVyJDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL0hhc2hDb2RlQnVpbGRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvSGFzaENvZGVCdWlsZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Mjg1ZDVhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvSGFzaENvZGVCdWlsZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9SZWZsZWN0aW9uVG9TdHJpbmdCdWlsZGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9SZWZsZWN0aW9uVG9TdHJpbmdCdWlsZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYmRlYWU2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvUmVmbGVjdGlvblRvU3RyaW5nQnVpbGRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvU3RhbmRhcmRUb1N0cmluZ1N0eWxlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9TdGFuZGFyZFRvU3RyaW5nU3R5bGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3ZDhkOTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9TdGFuZGFyZFRvU3RyaW5nU3R5bGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nQnVpbGRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdCdWlsZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDFlZjkzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdCdWlsZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Ub1N0cmluZ1N0eWxlJDEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzY1ZGY1Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSREZWZhdWx0VG9TdHJpbmdTdHlsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSREZWZhdWx0VG9TdHJpbmdTdHlsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYyNTE1Ny4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkRGVmYXVsdFRvU3RyaW5nU3R5bGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkTXVsdGlMaW5lVG9TdHJpbmdTdHlsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRNdWx0aUxpbmVUb1N0cmluZ1N0eWxlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTU2ZDJkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRNdWx0aUxpbmVUb1N0cmluZ1N0eWxlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Ub1N0cmluZ1N0eWxlJE5vRmllbGROYW1lVG9TdHJpbmdTdHlsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSROb0ZpZWxkTmFtZVRvU3RyaW5nU3R5bGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjZjNjOTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Ub1N0cmluZ1N0eWxlJE5vRmllbGROYW1lVG9TdHJpbmdTdHlsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRTaG9ydFByZWZpeFRvU3RyaW5nU3R5bGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkU2hvcnRQcmVmaXhUb1N0cmluZ1N0eWxlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2VmMzFhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRTaG9ydFByZWZpeFRvU3RyaW5nU3R5bGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9idWlsZGVyL1RvU3RyaW5nU3R5bGUkU2ltcGxlVG9TdHJpbmdTdHlsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRTaW1wbGVUb1N0cmluZ1N0eWxlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTllNmZkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZSRTaW1wbGVUb1N0cmluZ1N0eWxlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Ub1N0cmluZ1N0eWxlLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvYnVpbGRlci9Ub1N0cmluZ1N0eWxlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNGNlNDlkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2J1aWxkZXIvVG9TdHJpbmdTdHlsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW0vRW51bSRFbnRyeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW0vRW51bSRFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdjMDdlMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL0VudW0kRW50cnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL0VudW0uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL0VudW0uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5OWM2NDUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bS9FbnVtLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bS9FbnVtVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL0VudW1VdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYzNjk5MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL0VudW1VdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW0vVmFsdWVkRW51bS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW0vVmFsdWVkRW51bS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYwYmNmYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtL1ZhbHVlZEVudW0uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtcy9FbnVtJEVudHJ5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bXMvRW51bSRFbnRyeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE1OTM3NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtcy9FbnVtJEVudHJ5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bXMvRW51bS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW1zL0VudW0uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNjBjMGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bXMvRW51bS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW1zL0VudW1VdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2VudW1zL0VudW1VdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkwY2E2Zi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtcy9FbnVtVXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtcy9WYWx1ZWRFbnVtLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZW51bXMvVmFsdWVkRW51bS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdlNmYyMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9lbnVtcy9WYWx1ZWRFbnVtLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZXhjZXB0aW9uL0V4Y2VwdGlvblV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZXhjZXB0aW9uL0V4Y2VwdGlvblV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWJlOWMwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9FeGNlcHRpb25VdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MxNTEwZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVEZWxlZ2F0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZURlbGVnYXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWVmM2U2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZURlbGVnYXRlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZXhjZXB0aW9uL05lc3RhYmxlRXJyb3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVFcnJvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdjMzI4Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVFcnJvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZUV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL2V4Y2VwdGlvbi9OZXN0YWJsZUV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2EyZTUyMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvZXhjZXB0aW9uL05lc3RhYmxlUnVudGltZUV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ5YzVlMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9leGNlcHRpb24vTmVzdGFibGVSdW50aW1lRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9Eb3VibGVSYW5nZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvRG91YmxlUmFuZ2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiNTE1ZGEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9Eb3VibGVSYW5nZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvRmxvYXRSYW5nZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvRmxvYXRSYW5nZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQxZmU4YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0Zsb2F0UmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0ZyYWN0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9GcmFjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ4NzA4ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0ZyYWN0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9JRUVFNzU0clV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9JRUVFNzU0clV0aWxzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZGUzM2I5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvSUVFRTc1NHJVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvSW50UmFuZ2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0ludFJhbmdlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2M0NTQwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvSW50UmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0pWTVJhbmRvbS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvSlZNUmFuZG9tLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDdlY2M0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvSlZNUmFuZG9tLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9Mb25nUmFuZ2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0xvbmdSYW5nZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI4OTZjOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL0xvbmdSYW5nZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvTnVtYmVyUmFuZ2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL051bWJlclJhbmdlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDBiYzdiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvTnVtYmVyUmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL051bWJlclV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9OdW1iZXJVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc2ZDZiOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL051bWJlclV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9SYW5kb21VdGlscy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvUmFuZG9tVXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0YzJkZTUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbWF0aC9SYW5kb21VdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvUmFuZ2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tYXRoL1JhbmdlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDg3MzBiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL21hdGgvUmFuZ2UuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4ODA3NGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlQm9vbGVhbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZUJvb2xlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwMmQ5MzQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlQm9vbGVhbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZUJ5dGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVCeXRlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTU1YTA2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZUJ5dGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVEb3VibGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVEb3VibGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlODM4M2EuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlRG91YmxlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlRmxvYXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVGbG9hdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWE5OGFkNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVGbG9hdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZUludC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZUludC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlODhhNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVJbnQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVMb25nLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlTG9uZy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2VjNTNiNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy9tdXRhYmxlL011dGFibGVMb25nLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlT2JqZWN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlT2JqZWN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGJhN2IwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZU9iamVjdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL211dGFibGUvTXV0YWJsZVNob3J0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlU2hvcnQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2ZmE3ZjcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvbXV0YWJsZS9NdXRhYmxlU2hvcnQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L0NvbXBvc2l0ZUZvcm1hdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvQ29tcG9zaXRlRm9ybWF0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjdlZGFiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvQ29tcG9zaXRlRm9ybWF0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9FeHRlbmRlZE1lc3NhZ2VGb3JtYXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L0V4dGVuZGVkTWVzc2FnZUZvcm1hdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQxOTVmNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L0V4dGVuZGVkTWVzc2FnZUZvcm1hdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvRm9ybWF0RmFjdG9yeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvRm9ybWF0RmFjdG9yeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJjN2ZhYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L0Zvcm1hdEZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ckJ1aWxkZXIkU3RyQnVpbGRlclJlYWRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyQnVpbGRlciRTdHJCdWlsZGVyUmVhZGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjljODEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyQnVpbGRlciRTdHJCdWlsZGVyUmVhZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJCdWlsZGVyJFN0ckJ1aWxkZXJUb2tlbml6ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ckJ1aWxkZXIkU3RyQnVpbGRlclRva2VuaXplci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQ5OTNlOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ckJ1aWxkZXIkU3RyQnVpbGRlclRva2VuaXplci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyQnVpbGRlciRTdHJCdWlsZGVyV3JpdGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJCdWlsZGVyJFN0ckJ1aWxkZXJXcml0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMTA0ZjMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJCdWlsZGVyJFN0ckJ1aWxkZXJXcml0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ckJ1aWxkZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ckJ1aWxkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NGZiMTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJCdWlsZGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJMb29rdXAkTWFwU3RyTG9va3VwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJMb29rdXAkTWFwU3RyTG9va3VwLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzdjN2IzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTG9va3VwJE1hcFN0ckxvb2t1cC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTG9va3VwLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJMb29rdXAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhMmVmYzMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJMb29rdXAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ck1hdGNoZXIkQ2hhck1hdGNoZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ck1hdGNoZXIkQ2hhck1hdGNoZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNjhiZjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJNYXRjaGVyJENoYXJNYXRjaGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJNYXRjaGVyJENoYXJTZXRNYXRjaGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJNYXRjaGVyJENoYXJTZXRNYXRjaGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjI1ZjFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciRDaGFyU2V0TWF0Y2hlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciROb01hdGNoZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ck1hdGNoZXIkTm9NYXRjaGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmY4Zjk1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciROb01hdGNoZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ck1hdGNoZXIkU3RyaW5nTWF0Y2hlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciRTdHJpbmdNYXRjaGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTc0ZjdhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciRTdHJpbmdNYXRjaGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJNYXRjaGVyJFRyaW1NYXRjaGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJNYXRjaGVyJFRyaW1NYXRjaGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODdmNWEwLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlciRUcmltTWF0Y2hlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RleHQvU3RyTWF0Y2hlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JlYjA4MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0ck1hdGNoZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0clN1YnN0aXR1dG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJTdWJzdGl0dXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmM5OTc1Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0clN1YnN0aXR1dG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGV4dC9TdHJUb2tlbml6ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0clRva2VuaXplci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJjOTBjNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90ZXh0L1N0clRva2VuaXplci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRGF0ZUZvcm1hdFV0aWxzLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9EYXRlRm9ybWF0VXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmMDM0NzMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9EYXRlRm9ybWF0VXRpbHMuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0RhdGVVdGlscyREYXRlSXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0RhdGVVdGlscyREYXRlSXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiM2E2MmYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9EYXRlVXRpbHMkRGF0ZUl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9EYXRlVXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0RhdGVVdGlscy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmZiYmRhOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0RhdGVVdGlscy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRHVyYXRpb25Gb3JtYXRVdGlscyRUb2tlbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRHVyYXRpb25Gb3JtYXRVdGlscyRUb2tlbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWRiYzYxOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0R1cmF0aW9uRm9ybWF0VXRpbHMkVG9rZW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0R1cmF0aW9uRm9ybWF0VXRpbHMuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0R1cmF0aW9uRm9ybWF0VXRpbHMuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZGY2ODQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9EdXJhdGlvbkZvcm1hdFV0aWxzLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjQ0MTA2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkTnVtYmVyUnVsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkTnVtYmVyUnVsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFlNGVjOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JE51bWJlclJ1bGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFBhZGRlZE51bWJlckZpZWxkLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRQYWRkZWROdW1iZXJGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA0N2VjYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFBhZGRlZE51bWJlckZpZWxkLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRQYWlyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRQYWlyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjNjNzZhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkUGFpci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkUnVsZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkUnVsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTlmNmNlMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFJ1bGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFN0cmluZ0xpdGVyYWwuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFN0cmluZ0xpdGVyYWwuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxYmY1YTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRTdHJpbmdMaXRlcmFsLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUZXh0RmllbGQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRleHRGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQzNmI5OC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRleHRGaWVsZC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVGltZVpvbmVEaXNwbGF5S2V5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUaW1lWm9uZURpc3BsYXlLZXkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0NzVmMmMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUaW1lWm9uZURpc3BsYXlLZXkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRpbWVab25lTmFtZVJ1bGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRpbWVab25lTmFtZVJ1bGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2MjcyYjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUaW1lWm9uZU5hbWVSdWxlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUaW1lWm9uZU51bWJlclJ1bGUuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRpbWVab25lTnVtYmVyUnVsZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRhNjg3Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFRpbWVab25lTnVtYmVyUnVsZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVHdlbHZlSG91ckZpZWxkLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUd2VsdmVIb3VyRmllbGQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMDU4ZWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUd2VsdmVIb3VyRmllbGQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3ZW50eUZvdXJIb3VyRmllbGQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3ZW50eUZvdXJIb3VyRmllbGQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYzYwZDUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUd2VudHlGb3VySG91ckZpZWxkLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUd29EaWdpdE1vbnRoRmllbGQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3b0RpZ2l0TW9udGhGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDkzNzgwYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3b0RpZ2l0TW9udGhGaWVsZC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVHdvRGlnaXROdW1iZXJGaWVsZC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVHdvRGlnaXROdW1iZXJGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBlNDJjNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3b0RpZ2l0TnVtYmVyRmllbGQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3b0RpZ2l0WWVhckZpZWxkLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRUd29EaWdpdFllYXJGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA4NWQzMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFR3b0RpZ2l0WWVhckZpZWxkLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdCRVbnBhZGRlZE1vbnRoRmllbGQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFVucGFkZGVkTW9udGhGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ1MzM4My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFVucGFkZGVkTW9udGhGaWVsZC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVW5wYWRkZWROdW1iZXJGaWVsZC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL29yZy9hcGFjaGUvY29tbW9ucy9sYW5nL3RpbWUvRmFzdERhdGVGb3JtYXQkVW5wYWRkZWROdW1iZXJGaWVsZC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFhODRhMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0JFVucGFkZGVkTnVtYmVyRmllbGQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9GYXN0RGF0ZUZvcm1hdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc4ZDQyYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL0Zhc3REYXRlRm9ybWF0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvb3JnL2FwYWNoZS9jb21tb25zL2xhbmcvdGltZS9TdG9wV2F0Y2guY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL1N0b3BXYXRjaC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiNWRkZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuYXBhY2hlLmNvbW1vbnMubGFuZy9vcmcvYXBhY2hlL2NvbW1vbnMvbGFuZy90aW1lL1N0b3BXYXRjaC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5hcGFjaGUuY29tbW9ucy5sYW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0YjMyYTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmFwYWNoZS5jb21tb25zLmxhbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAotIyAKLSMgQ29udHJpYnV0b3JzOiAKLSMgQ2hyaXMgQW5pc3pjenlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9QXBhY2hlIEpha2FydGEgQ29tbW9ucyBMYW5nCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS8uY2xhc3NwYXRoIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkMzJhZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9IiIgc291cmNlcGF0aD0ic291cmNlLWJ1bmRsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9IiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS8ucHJvamVjdCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg0OWE4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmpkb208L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYjNkYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuamRvbQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmpkb207dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLmFkYXB0ZXJzO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuamRvbS5maWx0ZXI7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLmlucHV0O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuamRvbS5vdXRwdXQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLnRyYW5zZm9ybTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20ueHBhdGg7dmVyc2lvbj0iMS4wLjAiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vYWJvdXQuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGZkNTEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPkFib3V0PC90aXRsZT48L2hlYWQ+PHNjcmlwdCBjaGFyc2V0PSJ1dGYtOCIgaWQ9ImluamVjdGlvbl9ncmFwaF9mdW5jIiBzcmM9ImFib3V0X2ZpbGVzL2luamVjdGlvbl9ncmFwaF9mdW5jLmpzIj48L3NjcmlwdD48bGluayBocmVmPSJhYm91dF9maWxlcy9pbmplY3Rpb25fZ3JhcGguY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJ1dGYtOCIgaWQ9ImluamVjdGlvbl9ncmFwaF9jc3MiPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAwOCwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQkJCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5KRE9NIDEuMDwvaDQ+Ci0KLTxwPkpET00gaXMgYXZhaWxhYmxlIHVuZGVyIGFuIEFwYWNoZS1zdHlsZSBvcGVuIHNvdXJjZSBsaWNlbnNlLCB3aXRoIHRoZSBhY2tub3dsZWRnbWVudCBjbGF1c2UgcmVtb3ZlZC4gCi1UaGlzIGxpY2Vuc2UgaXMgYW1vbmcgdGhlIGxlYXN0IHJlc3RyaWN0aXZlIGxpY2Vuc2UgYXZhaWxhYmxlLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIHVzZSBKRE9NIGluIAotY3JlYXRpbmcgbmV3IHByb2R1Y3RzIHdpdGhvdXQgcmVxdWlyaW5nIHRoZW0gdG8gcmVsZWFzZSB0aGVpciBvd24gcHJvZHVjdHMgYXMgb3BlbiBzb3VyY2UuIAotVGhpcyBpcyB0aGUgbGljZW5zZSBtb2RlbCB1c2VkIGJ5IHRoZSBBcGFjaGUgUHJvamVjdCwgd2hpY2ggY3JlYXRlZCB0aGUgQXBhY2hlIHNlcnZlci4gCi1BIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0xJQ0VOU0UudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIAotaXMgYWxzbyBhdmFpbGFibGUgYXQgdGhlIHRvcCBvZiBldmVyeSBzb3VyY2UgZmlsZSBhbmQgaW4gTElDRU5TRS50eHQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KLTwvcD4KLQotPGg0PlNvdXJjZTwvaDQ+Ci08cD5Tb3VyY2UgaXMgYXZhaWxhYmxlIGZyb20gdGhlIE9yYml0IFByb2plY3QgYXQgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IGlzIC0gZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzOm9yZy5lY2xpcHNlLm9yYml0L29yZy5qZG9tPC9wPgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9hYm91dF9maWxlcy9MSUNFTlNFLnR4dCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmFiNThhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyotLSAKLQotICRJZDogTElDRU5TRS50eHQsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uIAotCi0gKi8KLQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vYnVpbGQucHJvcGVydGllcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODFiM2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIG9yZy8KLW91dHB1dC4uPS4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0F0dHJpYnV0ZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0F0dHJpYnV0ZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhYmJjMy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9BdHRyaWJ1dGUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9BdHRyaWJ1dGVMaXN0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vQXR0cmlidXRlTGlzdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5M2E0MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9BdHRyaWJ1dGVMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vQ0RBVEEuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9DREFUQS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkN2I0Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9DREFUQS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbW1lbnQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Db21tZW50LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA2NTAxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbW1lbnQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Db250ZW50LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vQ29udGVudC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NGFhMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Db250ZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vQ29udGVudExpc3QkRmlsdGVyTGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbnRlbnRMaXN0JEZpbHRlckxpc3QuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OGEyNTYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vQ29udGVudExpc3QkRmlsdGVyTGlzdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbnRlbnRMaXN0JEZpbHRlckxpc3RJdGVyYXRvci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbnRlbnRMaXN0JEZpbHRlckxpc3RJdGVyYXRvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4NDMyNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Db250ZW50TGlzdCRGaWx0ZXJMaXN0SXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Db250ZW50TGlzdC5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbnRlbnRMaXN0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA4YzFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0NvbnRlbnRMaXN0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRGF0YUNvbnZlcnNpb25FeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9EYXRhQ29udmVyc2lvbkV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMWFkNC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9EYXRhQ29udmVyc2lvbkV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0RlZmF1bHRKRE9NRmFjdG9yeS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0RlZmF1bHRKRE9NRmFjdG9yeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2YzVjMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9EZWZhdWx0SkRPTUZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9EZXNjZW5kYW50SXRlcmF0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9EZXNjZW5kYW50SXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWIxMjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRGVzY2VuZGFudEl0ZXJhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRG9jVHlwZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0RvY1R5cGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTU5NTkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRG9jVHlwZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0RvY3VtZW50LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRG9jdW1lbnQuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTJhMzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRG9jdW1lbnQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9FbGVtZW50LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRWxlbWVudC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5OTU3MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9FbGVtZW50LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRW50aXR5UmVmLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRW50aXR5UmVmLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzA5YmFlLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0VudGl0eVJlZi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0ZpbHRlckl0ZXJhdG9yLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRmlsdGVySXRlcmF0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjM4ZjYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vRmlsdGVySXRlcmF0b3IuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsQWRkRXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSWxsZWdhbEFkZEV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiZjIzZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsQWRkRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSWxsZWdhbERhdGFFeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsRGF0YUV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmNmRlYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsRGF0YUV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0lsbGVnYWxOYW1lRXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSWxsZWdhbE5hbWVFeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDRiNDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSWxsZWdhbE5hbWVFeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSWxsZWdhbFRhcmdldEV4Y2VwdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYWM2YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9JbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSkRPTUV4Y2VwdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0pET01FeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTVlODIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSkRPTUV4Y2VwdGlvbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL0pET01GYWN0b3J5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSkRPTUZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWQwMTAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vSkRPTUZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9OYW1lc3BhY2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9OYW1lc3BhY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmE2ODQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vTmFtZXNwYWNlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vUGFyZW50LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vUGFyZW50LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGVhNzE0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL1BhcmVudC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlZjkwOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9UZXh0LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vVGV4dC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2ODU0YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9UZXh0LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vVW5jaGVja2VkSkRPTUZhY3RvcnkuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9VbmNoZWNrZWRKRE9NRmFjdG9yeS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjY2E2NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9VbmNoZWNrZWRKRE9NRmFjdG9yeS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL1ZlcmlmaWVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vVmVyaWZpZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGNhNTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vVmVyaWZpZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9BYnN0cmFjdERPTUFkYXB0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9BYnN0cmFjdERPTUFkYXB0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTNmN2UuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvQWJzdHJhY3RET01BZGFwdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvQ3JpbXNvbkRPTUFkYXB0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9Dcmltc29uRE9NQWRhcHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5NWU4YS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9Dcmltc29uRE9NQWRhcHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL0RPTUFkYXB0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9ET01BZGFwdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM3ZjM4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL0RPTUFkYXB0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9KQVhQRE9NQWRhcHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL0pBWFBET01BZGFwdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RmMmI3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL0pBWFBET01BZGFwdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjFET01BZGFwdGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjFET01BZGFwdGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ4NGI5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL09yYWNsZVYxRE9NQWRhcHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL09yYWNsZVYyRE9NQWRhcHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL09yYWNsZVYyRE9NQWRhcHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4NjhiOS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9PcmFjbGVWMkRPTUFkYXB0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9YTUw0SkRPTUFkYXB0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9hZGFwdGVycy9YTUw0SkRPTUFkYXB0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTg2NmQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvWE1MNEpET01BZGFwdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvWGVyY2VzRE9NQWRhcHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2FkYXB0ZXJzL1hlcmNlc0RPTUFkYXB0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmU1ZGIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vYWRhcHRlcnMvWGVyY2VzRE9NQWRhcHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9BYnN0cmFjdEZpbHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9BYnN0cmFjdEZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhMjc0MS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvQWJzdHJhY3RGaWx0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvQW5kRmlsdGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL0FuZEZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjNWM0Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvQW5kRmlsdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL0NvbnRlbnRGaWx0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvQ29udGVudEZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxZmQ5ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvQ29udGVudEZpbHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9FbGVtZW50RmlsdGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL0VsZW1lbnRGaWx0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNTNiNzUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL0VsZW1lbnRGaWx0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvRmlsdGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL0ZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZmI4Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvRmlsdGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL05lZ2F0ZUZpbHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9OZWdhdGVGaWx0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2ZkNDQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vZmlsdGVyL05lZ2F0ZUZpbHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9PckZpbHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2ZpbHRlci9PckZpbHRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZmU0Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9maWx0ZXIvT3JGaWx0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9CdWlsZGVyRXJyb3JIYW5kbGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvQnVpbGRlckVycm9ySGFuZGxlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjMzJhNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9CdWlsZGVyRXJyb3JIYW5kbGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvRE9NQnVpbGRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2lucHV0L0RPTUJ1aWxkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTgxN2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvRE9NQnVpbGRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2lucHV0L0pBWFBQYXJzZXJGYWN0b3J5LmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvSkFYUFBhcnNlckZhY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWUxMzkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvSkFYUFBhcnNlckZhY3RvcnkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9KRE9NUGFyc2VFeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9KRE9NUGFyc2VFeGNlcHRpb24uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWY0MDYuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvSkRPTVBhcnNlRXhjZXB0aW9uLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvU0FYQnVpbGRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2lucHV0L1NBWEJ1aWxkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjE4ZjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvU0FYQnVpbGRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2lucHV0L1NBWEhhbmRsZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9TQVhIYW5kbGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzY2MDI4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL2lucHV0L1NBWEhhbmRsZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9UZXh0QnVmZmVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vaW5wdXQvVGV4dEJ1ZmZlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4MmMwMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9pbnB1dC9UZXh0QnVmZmVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L0RPTU91dHB1dHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9ET01PdXRwdXR0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDUyM2MuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L0RPTU91dHB1dHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Fc2NhcGVTdHJhdGVneS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Fc2NhcGVTdHJhdGVneS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZWMwNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvRXNjYXBlU3RyYXRlZ3kuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvRm9ybWF0JERlZmF1bHRFc2NhcGVTdHJhdGVneS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Gb3JtYXQkRGVmYXVsdEVzY2FwZVN0cmF0ZWd5LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUwZjUzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Gb3JtYXQkRGVmYXVsdEVzY2FwZVN0cmF0ZWd5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L0Zvcm1hdCRUZXh0TW9kZS5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Gb3JtYXQkVGV4dE1vZGUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTUzM2IuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L0Zvcm1hdCRUZXh0TW9kZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Gb3JtYXQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvRm9ybWF0LmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGE4ZTI2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9Gb3JtYXQuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvSkRPTUxvY2F0b3IuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvSkRPTUxvY2F0b3IuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWQ2MDEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L0pET01Mb2NhdG9yLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L05hbWVzcGFjZVN0YWNrLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L05hbWVzcGFjZVN0YWNrLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVlZjFjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9OYW1lc3BhY2VTdGFjay5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9TQVhPdXRwdXR0ZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvU0FYT3V0cHV0dGVyLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTExOGVkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9TQVhPdXRwdXR0ZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvWE1MT3V0cHV0dGVyJE5hbWVzcGFjZVN0YWNrLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L1hNTE91dHB1dHRlciROYW1lc3BhY2VTdGFjay5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1NGU2MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS9vdXRwdXQvWE1MT3V0cHV0dGVyJE5hbWVzcGFjZVN0YWNrLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L1hNTE91dHB1dHRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL291dHB1dC9YTUxPdXRwdXR0ZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODE0YWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vb3V0cHV0L1hNTE91dHB1dHRlci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3RyYW5zZm9ybS9KRE9NUmVzdWx0JERvY3VtZW50QnVpbGRlci5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3RyYW5zZm9ybS9KRE9NUmVzdWx0JERvY3VtZW50QnVpbGRlci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0MmZiZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdCREb2N1bWVudEJ1aWxkZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdCRGcmFnbWVudEhhbmRsZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdCRGcmFnbWVudEhhbmRsZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTMzZTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01SZXN1bHQkRnJhZ21lbnRIYW5kbGVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01SZXN1bHQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzNTU3NS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3RyYW5zZm9ybS9KRE9NU291cmNlJERvY3VtZW50UmVhZGVyLmNsYXNzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01Tb3VyY2UkRG9jdW1lbnRSZWFkZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkY2EwOTguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01Tb3VyY2UkRG9jdW1lbnRSZWFkZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVNvdXJjZSRKRE9NSW5wdXRTb3VyY2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVNvdXJjZSRKRE9NSW5wdXRTb3VyY2UuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZmIyZTUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01Tb3VyY2UkSkRPTUlucHV0U291cmNlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL0pET01Tb3VyY2UuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVNvdXJjZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhZWNkMi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVNvdXJjZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3RyYW5zZm9ybS9YU0xUcmFuc2Zvcm1FeGNlcHRpb24uY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vWFNMVHJhbnNmb3JtRXhjZXB0aW9uLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFjMzQzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3RyYW5zZm9ybS9YU0xUcmFuc2Zvcm1FeGNlcHRpb24uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vWFNMVHJhbnNmb3JtZXIuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS90cmFuc2Zvcm0vWFNMVHJhbnNmb3JtZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYmM3MzAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20vdHJhbnNmb3JtL1hTTFRyYW5zZm9ybWVyLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20veHBhdGgvSmF4ZW5YUGF0aCROU0NvbnRleHQuY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9KYXhlblhQYXRoJE5TQ29udGV4dC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3YjliNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9KYXhlblhQYXRoJE5TQ29udGV4dC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3hwYXRoL0pheGVuWFBhdGguY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9KYXhlblhQYXRoLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RiY2IxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3hwYXRoL0pheGVuWFBhdGguY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9YUGF0aCRYUGF0aFN0cmluZy5jbGFzcyBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3hwYXRoL1hQYXRoJFhQYXRoU3RyaW5nLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUzN2QzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL29yZy9qZG9tL3hwYXRoL1hQYXRoJFhQYXRoU3RyaW5nLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vb3JnL2pkb20veHBhdGgvWFBhdGguY2xhc3MgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9YUGF0aC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmNzY1Yy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9vcmcvamRvbS94cGF0aC9YUGF0aC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzU0ZDMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAotIyAKLSMgQ29udHJpYnV0b3JzOiAKLSMgQ2hyaXMgQW5pc3pjenlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gSkRPTQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVmMTU4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuamRvbS5zb3VyY2UKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5qZG9tO3ZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvYWJvdXQuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMDliNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSA1LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotCi08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgiU291cmNlIFppcHMiKSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQKLWluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4KLURldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gImFib3V0Lmh0bWwiIGZpbGVzICgiQWJvdXRzIikgbG9jYXRlZAotaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZSBzcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMKLWluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTxoND5KRE9NIDEuMDwvaDQ+Ci0KLTxwPkpET00gaXMgYXZhaWxhYmxlIHVuZGVyIGFuIEFwYWNoZS1zdHlsZSBvcGVuIHNvdXJjZSBsaWNlbnNlLCB3aXRoIHRoZSBhY2tub3dsZWRnbWVudCBjbGF1c2UgcmVtb3ZlZC4gCi1UaGlzIGxpY2Vuc2UgaXMgYW1vbmcgdGhlIGxlYXN0IHJlc3RyaWN0aXZlIGxpY2Vuc2UgYXZhaWxhYmxlLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIHVzZSBKRE9NIGluIAotY3JlYXRpbmcgbmV3IHByb2R1Y3RzIHdpdGhvdXQgcmVxdWlyaW5nIHRoZW0gdG8gcmVsZWFzZSB0aGVpciBvd24gcHJvZHVjdHMgYXMgb3BlbiBzb3VyY2UuIAotVGhpcyBpcyB0aGUgbGljZW5zZSBtb2RlbCB1c2VkIGJ5IHRoZSBBcGFjaGUgUHJvamVjdCwgd2hpY2ggY3JlYXRlZCB0aGUgQXBhY2hlIHNlcnZlci4gCi1BIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0xJQ0VOU0UudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIAotaXMgYWxzbyBhdmFpbGFibGUgYXQgdGhlIHRvcCBvZiBldmVyeSBzb3VyY2UgZmlsZSBhbmQgaW4gTElDRU5TRS50eHQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmMxMGQ4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKi0tIAotCi0gJElkOiBMSUNFTlNFLnR4dCx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4gCi0KLSAqLwotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTQyOTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBvcmcvCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0F0dHJpYnV0ZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMDgwYi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAxICswLDAgQEAKLS8qLS0KLQotICRJZDogQXR0cmlidXRlLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNyBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEFuIFhNTCBhdHRyaWJ1dGUuIE1ldGhvZHMgYWxsb3cgdGhlIHVzZXIgdG8gb2J0YWluIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gKiBhcyB3ZWxsIGFzIG5hbWVzcGFjZSBhbmQgdHlwZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZAotICogQGF1dGhvciAgV2VzbGV5IEJpZ2dzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICJAKCMpICRSQ1NmaWxlOiBBdHRyaWJ1dGUuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgdHlwZTogdGhlIGF0dHJpYnV0ZSBoYXMgbm90IGJlZW4gZGVjbGFyZWQgb3IgdHlwZQotICAgICAqIGlzIHVua25vd24uCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5ERUNMQVJFRF9UWVBFID0gMDsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENEQVRBX1RZUEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogQXR0cmlidXRlIHR5cGU6IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgYSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJRF9UWVBFID0gMjsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgcmVmZXJlbmNlIHRvIGEKLSAgICAgKiB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJRFJFRl9UWVBFID0gMzsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvCi0gICAgICogdW5pcXVlIGlkZW50aWZpZXJzLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElEUkVGU19UWVBFID0gNDsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIGFuIGVudGl0eS4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfVFlQRSA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBdHRyaWJ1dGUgdHlwZTogdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZW50aXR5IG5hbWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVElFU19UWVBFID0gNjsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgbmFtZSB0b2tlbi4KLSAgICAgKiA8cD4KLSAgICAgKiBBY2NvcmRpbmcgdG8gU0FYIDIuMCBzcGVjaWZpY2F0aW9uLCBhdHRyaWJ1dGVzIG9mIGVudW1lcmF0ZWQKLSAgICAgKiB0eXBlcyBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgIk5NVE9LRU4iIGJ5IFNBWCBwYXJzZXJzLiAgQnV0IHRoZQotICAgICAqIG1ham9yIHBhcnNlcnMgKFhlcmNlcyBhbmQgQ3JpbXNvbikgcHJvdmlkZSBzcGVjaWZpYyB2YWx1ZXMKLSAgICAgKiB0aGF0IHBlcm1pdCB0byByZWNvZ25pemUgdGhlbSBhcyB7QGxpbmsgI0VOVU1FUkFURURfVFlQRX0uCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk1UT0tFTl9UWVBFID0gNzsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgbGlzdCBvZiBuYW1lIHRva2Vucy4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBOTVRPS0VOU19UWVBFID0gODsKLQotICAgIC8qKgotICAgICAqIEF0dHJpYnV0ZSB0eXBlOiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIGEgbm90YXRpb24uCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9UQVRJT05fVFlQRSA9IDk7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgdHlwZTogdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhIG5hbWUgdG9rZW4gZnJvbSBhbgotICAgICAqIGVudW1lcmF0aW9uLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVU1FUkFURURfVFlQRSA9IDEwOwotCi0gICAgLy8gS2VlcCB0aGUgb2xkIGNvbnN0YW50IG5hbWVzIGZvciBvbmUgYmV0YSBjeWNsZSB0byBoZWxwIG1pZ3JhdGlvbgotCi0KLQotICAgIC8qKiBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiBUaGUgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+IG9mIHRoZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+ICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBOYW1lc3BhY2UgbmFtZXNwYWNlOwotCi0gICAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLSAgICAvKiogVGhlIHR5cGUgb2YgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gKi8KLSAgICBwcm90ZWN0ZWQgaW50IHR5cGUgPSBVTkRFQ0xBUkVEX1RZUEU7Ci0KLSAgICAvKiogUGFyZW50IGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCwgbm8tYXJncyBjb25zdHJ1Y3RvciBmb3IgaW1wbGVtZW50YXRpb25zIHRvIHVzZSBpZiBuZWVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF0dHJpYnV0ZSgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgKGxvY2FsKSBuYW1lIGFuZCB2YWx1ZSwgYW5kIGluIHRoZSBwcm92aWRlZAotICAgICAqIDxjb2RlPntAbGluayBOYW1lc3BhY2V9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiBuYW1lc3BhY2UgZm9yIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuCi0gICAgICogICAgICAgICBhdHRyaWJ1dGUgbmFtZSBvciBpZiBpZiB0aGUgbmV3IG5hbWVzcGFjZSBpcyB0aGUgZGVmYXVsdAotICAgICAqICAgICAgICAgbmFtZXNwYWNlLiBBdHRyaWJ1dGVzIGNhbm5vdCBiZSBpbiBhIGRlZmF1bHQgbmFtZXNwYWNlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBpcwotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgZGF0YSAoYXMgZGV0ZXJtaW5lZCBieQotICAgICAqICAgICAgICAge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCAobG9jYWwpIG5hbWUsIHZhbHVlLCBhbmQgdHlwZSwgYW5kIGluIHRoZSBwcm92aWRlZAotICAgICAqIDxjb2RlPntAbGluayBOYW1lc3BhY2V9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB0eXBlIDxjb2RlPmludDwvY29kZT4gdHlwZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gbmFtZXNwYWNlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgaWxsZWdhbCBhcyBhbgotICAgICAqICAgICAgICAgYXR0cmlidXRlIG5hbWUgb3IgaWYgaWYgdGhlIG5ldyBuYW1lc3BhY2UgaXMgdGhlIGRlZmF1bHQKLSAgICAgKiAgICAgICAgIG5hbWVzcGFjZS4gQXR0cmlidXRlcyBjYW5ub3QgYmUgaW4gYSBkZWZhdWx0IG5hbWVzcGFjZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIGRhdGEgKGFzIGRldGVybWluZWQgYnkKLSAgICAgKiAgICAgICAgIHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KSBvcgotICAgICAqICAgICAgICAgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlCi0gICAgICogICAgICAgICBzdXBwb3J0ZWQgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBpbnQgdHlwZSwgTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVR5cGUodHlwZSk7Ci0gICAgICAgIHNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCAobG9jYWwpIG5hbWUgYW5kIHZhbHVlLCBhbmQgZG9lcyBub3QgcGxhY2UKLSAgICAgKiB0aGUgYXR0cmlidXRlIGluIGEgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIDxiPk5vdGU8L2I+OiBUaGlzIGFjdHVhbGx5IGV4cGxpY2l0bHkgcHV0cyB0aGUKLSAgICAgKiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGluIHRoZSAiZW1wdHkiIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4KLSAgICAgKiAoPGNvZGU+e0BsaW5rIE5hbWVzcGFjZSNOT19OQU1FU1BBQ0V9PC9jb2RlPikuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgPGNvZGU+QXR0cmlidXRlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGlsbGVnYWwgYXMgYW4KLSAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBpcwotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgZGF0YSAoYXMgZGV0ZXJtaW5lZCBieQotICAgICAqICAgICAgICAge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzKG5hbWUsIHZhbHVlLCBVTkRFQ0xBUkVEX1RZUEUsIE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCAobG9jYWwpIG5hbWUsIHZhbHVlIGFuZCB0eXBlLCBhbmQgZG9lcyBub3QgcGxhY2UKLSAgICAgKiB0aGUgYXR0cmlidXRlIGluIGEgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIDxiPk5vdGU8L2I+OiBUaGlzIGFjdHVhbGx5IGV4cGxpY2l0bHkgcHV0cyB0aGUKLSAgICAgKiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGluIHRoZSAiZW1wdHkiIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4KLSAgICAgKiAoPGNvZGU+e0BsaW5rIE5hbWVzcGFjZSNOT19OQU1FU1BBQ0V9PC9jb2RlPikuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgPGNvZGU+QXR0cmlidXRlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IHR5cGUgZm9yIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuCi0gICAgICogICAgICAgICBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIGRhdGEgKGFzIGRldGVybWluZWQgYnkKLSAgICAgKiAgICAgICAgIHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KSBvcgotICAgICAqICAgICAgICAgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlCi0gICAgICogICAgICAgICBzdXBwb3J0ZWQgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBpbnQgdHlwZSkgewotICAgICAgICB0aGlzKG5hbWUsIHZhbHVlLCB0eXBlLCBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIElmIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhlbiB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBhcmVudCBvZiB0aGlzIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0cmlldmVzIHRoZSBvd25pbmcgPGNvZGU+e0BsaW5rIERvY3VtZW50fTwvY29kZT4gZm9yCi0gICAgICogdGhpcyBBdHRyaWJ1dGUsIG9yIG51bGwgaWYgbm90IGEgY3VycmVudGx5IGEgbWVtYmVyIG9mIGEKLSAgICAgKiA8Y29kZT57QGxpbmsgRG9jdW1lbnR9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG93bmluZyB0aGlzIEF0dHJpYnV0ZSwgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICgoRWxlbWVudClwYXJlbnQpLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgcGFyZW50IG9mIHRoaXMgPGNvZGU+QXR0cmlidXRlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdG8gYmUgbmV3IHBhcmVudC4KLSAgICAgKiBAcmV0dXJuIHRoaXMgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlIHNldFBhcmVudChFbGVtZW50IHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBkZXRhY2hlcyB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiBmcm9tIGl0cyBwYXJlbnQsIG9yIGRvZXMKLSAgICAgKiBub3RoaW5nIGlmIHRoZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGhhcyBubyBwYXJlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gLSB0aGlzIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZSBkZXRhY2goKSB7Ci0gICAgICAgIEVsZW1lbnQgcCA9IGdldFBhcmVudCgpOwotICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmdldE5hbWUoKSwgdGhpcy5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSBsb2NhbCBuYW1lIG9mIHRoZQotICAgICAqIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uIEZvciBhbnkgWE1MIGF0dHJpYnV0ZQotICAgICAqIHdoaWNoIGFwcGVhcnMgYXMKLSAgICAgKiA8Y29kZT5bbmFtZXNwYWNlUHJlZml4XTpbYXR0cmlidXRlTmFtZV08L2NvZGU+LAotICAgICAqIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd291bGQgYmUKLSAgICAgKiA8Y29kZT5bYXR0cmlidXRlTmFtZV08L2NvZGU+LiBXaGVuIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBoYXMgbm8gbmFtZXNwYWNlLCB0aGUgbG9jYWwgbmFtZSBpcyBzaW1wbHkgdGhlIGF0dHJpYnV0ZQotICAgICAqIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVG8gb2J0YWluIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciB0aGlzCi0gICAgICogYXR0cmlidXRlLCB0aGUKLSAgICAgKiA8Y29kZT57QGxpbmsgI2dldE5hbWVzcGFjZVByZWZpeCgpfTwvY29kZT4KLSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgYW55IG5hbWVzcGFjZSBwcmVmaXguCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IGxvY2FsIG5hbWUgdG8gc2V0Ci0gICAgICogQHJldHVybiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IC0gdGhlIGF0dHJpYnV0ZSBtb2RpZmllZC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGlsbGVnYWwgYXMgYW4KLSAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyaWJ1dGUgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrQXR0cmlidXRlTmFtZShuYW1lKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxOYW1lRXhjZXB0aW9uKG5hbWUsICJhdHRyaWJ1dGUiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICogRm9yIGFueSBYTUwgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMKLSAgICAgKiA8Y29kZT5bbmFtZXNwYWNlUHJlZml4XTpbZWxlbWVudE5hbWVdPC9jb2RlPiwKLSAgICAgKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3b3VsZCBiZQotICAgICAqIGV2ZXJ5dGhpbmcgKGJvdGggbmFtZXNwYWNlIHByZWZpeCBhbmQKLSAgICAgKiBlbGVtZW50IG5hbWUpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgaGFzIG5vCi0gICAgICogbmFtZXNwYWNlLCB0aGUgcXVhbGlmaWVkIG5hbWUgaXMgc2ltcGx5IHRoZSBhdHRyaWJ1dGUncwotICAgICAqIGxvY2FsIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVG8gb2J0YWluIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZQotICAgICAqIDxjb2RlPntAbGluayAjZ2V0TmFtZSgpfTwvY29kZT4gbWV0aG9kIHNob3VsZCBiZSB1c2VkLgotICAgICAqIDxwPgotICAgICAqIFRvIG9idGFpbiB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhpcyBhdHRyaWJ1dGUsCi0gICAgICogdGhlIDxjb2RlPntAbGluayAjZ2V0TmFtZXNwYWNlUHJlZml4KCl9PC9jb2RlPgotICAgICAqIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIGZ1bGwgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgLy8gTm90ZTogQW55IGNoYW5nZXMgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluCi0gICAgICAgIC8vIFhNTE91dHB1dHRlci5wcmludFF1YWxpZmllZE5hbWUoKQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZXNwYWNlLmdldFByZWZpeCgpOwotICAgICAgICBpZiAoKHByZWZpeCAhPSBudWxsKSAmJiAoIXByZWZpeC5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIocHJlZml4KQotICAgICAgICAgICAgICAgIC5hcHBlbmQoJzonKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIHByZWZpeCBvZiB0aGUKLSAgICAgKiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LiBGb3IgYW55IFhNTCBhdHRyaWJ1dGUKLSAgICAgKiB3aGljaCBhcHBlYXJzIGFzCi0gICAgICogPGNvZGU+W25hbWVzcGFjZVByZWZpeF06W2F0dHJpYnV0ZU5hbWVdPC9jb2RlPiwKLSAgICAgKiB0aGUgbmFtZXNwYWNlIHByZWZpeCBvZiB0aGUgYXR0cmlidXRlIHdvdWxkIGJlCi0gICAgICogPGNvZGU+W25hbWVzcGFjZVByZWZpeF08L2NvZGU+LiBXaGVuIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBoYXMgbm8gbmFtZXNwYWNlLCBhbiBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gbmFtZXNwYWNlIHByZWZpeCBvZiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgVVJJIG1hcHBlZCB0byB0aGlzIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4ncwotICAgICAqIHByZWZpeC4gSWYgbm8gbWFwcGluZyBpcyBmb3VuZCwgYW4gZW1wdHkgPGNvZGU+U3RyaW5nPC9jb2RlPiBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gbmFtZXNwYWNlIFVSSSBmb3IgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlLmdldFVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+J3MKLSAgICAgKiA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gLSBOYW1lc3BhY2Ugb2JqZWN0IGZvciB0aGlzIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+J3MgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+LgotICAgICAqIElmIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgaXMgbnVsbCwgdGhlIGF0dHJpYnV0ZSB3aWxsIGhhdmUgbm8gbmFtZXNwYWNlLgotICAgICAqIFRoZSBuYW1lc3BhY2UgbXVzdCBoYXZlIGEgcHJlZml4LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmV3IG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gPGNvZGU+RWxlbWVudDwvY29kZT4gLSB0aGUgZWxlbWVudCBtb2RpZmllZC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uIGlmIHRoZSBuZXcgbmFtZXNwYWNlIGlzIHRoZSBkZWZhdWx0Ci0gICAgICogICAgICAgICBuYW1lc3BhY2UuIEF0dHJpYnV0ZXMgY2Fubm90IGJlIGluIGEgZGVmYXVsdCBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZSBzZXROYW1lc3BhY2UoTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBWZXJpZnkgdGhlIGF0dHJpYnV0ZSBpc24ndCB0cnlpbmcgdG8gYmUgaW4gYSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAvLyBBdHRyaWJ1dGVzIGNhbid0IGJlIGluIGEgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFICYmCi0gICAgICAgICAgICBuYW1lc3BhY2UuZ2V0UHJlZml4KCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxOYW1lRXhjZXB0aW9uKCIiLCAiYXR0cmlidXRlIG5hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgIkFuIGF0dHJpYnV0ZSBuYW1lc3BhY2Ugd2l0aG91dCBhIHByZWZpeCBjYW4gb25seSBiZSB0aGUgIiArCi0gICAgICAgICAgICAgICAgIk5PX05BTUVTUEFDRSBuYW1lc3BhY2UiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIGFjdHVhbCB0ZXh0dWFsIHZhbHVlIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LiAgVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHRleHQKLSAgICAgKiB3aXRoaW4gdGhlIHF1b3RhdGlvbiBtYXJrcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gLSB0aGlzIEF0dHJpYnV0ZSBtb2RpZmllZC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIGRhdGEgKGFzIGRldGVybWluZWQgYnkKLSAgICAgKiAgICAgICAgIHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gbnVsbDsKLSAgICAgICAgaWYgKChyZWFzb24gPSBWZXJpZmllci5jaGVja0NoYXJhY3RlckRhdGEodmFsdWUpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24odmFsdWUsICJhdHRyaWJ1dGUiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgYWN0dWFsIGRlY2xhcmVkIHR5cGUgb2YgdGhpcwotICAgICAqIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmludDwvY29kZT4gLSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIHR5cGUgb2YgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IHR5cGUgZm9yIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogQHJldHVybiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IC0gdGhpcyBBdHRyaWJ1dGUgbW9kaWZpZWQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHR5cGUgaXMKLSAgICAgKiAgICAgICAgIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIHNldEF0dHJpYnV0ZVR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgaWYgKCh0eXBlIDwgVU5ERUNMQVJFRF9UWVBFKSB8fCAodHlwZSA+IEVOVU1FUkFURURfVFlQRSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZih0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIiwgIklsbGVnYWwgYXR0cmlidXRlIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4sIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgICAgKiAgICAgICAgIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAuYXBwZW5kKCJbQXR0cmlidXRlOiAiKQotICAgICAgICAgICAgLmFwcGVuZChnZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgICAgICAuYXBwZW5kKCI9XCIiKQotICAgICAgICAgICAgLmFwcGVuZCh2YWx1ZSkKLSAgICAgICAgICAgIC5hcHBlbmQoIlwiIikKLSAgICAgICAgICAgIC5hcHBlbmQoIl0iKQotICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0cyBmb3IgZXF1YWxpdHkgb2YgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IHRvIHRoZSBzdXBwbGllZAotICAgICAqIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2IgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBjb21wYXJlIHRvLgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gLSB3aGV0aGVyIHRoZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBlcXVhbCB0byB0aGUgc3VwcGxpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iKSB7Ci0gICAgICAgIHJldHVybiAob2IgPT0gdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgPGNvZGU+QXR0cmlidXRlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+aW50PC9jb2RlPiAtIGhhc2ggY29kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5PYmplY3Q8L2NvZGU+IC0gY2xvbmUgb2YgdGhpcyA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBzdXBlci5jbG9uZSgpOwotICAgICAgICB9IGNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBXb24ndCBoYXBwZW4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5hbWUsIG5hbWVzcGFjZSwgYW5kIHZhbHVlIGFyZSByZWZlcmVuY2VzIHRvIGltdXRhYmxlIG9iamVjdHMKLSAgICAgICAgLy8gYW5kIGFyZSBjb3BpZWQgYnkgc3VwZXIuY2xvbmUoKSAoYWthIE9iamVjdC5jbG9uZSgpKQotCi0gICAgICAgIC8vIHN1cGVyLmNsb25lKCkgY29waWVzIHJlZmVyZW5jZSB0byBzZXQgcGFyZW50IHRvIG51bGwKLSAgICAgICAgYXR0cmlidXRlLnBhcmVudCA9IG51bGw7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBDb252ZW5pZW5jZSBNZXRob2RzIGJlbG93IGhlcmUKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLyoqCi0gICAgICogVGhpcyBnZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLCBpbgotICAgICAqIDxjb2RlPmludDwvY29kZT4gZm9ybSwgYW5kIGlmIG5vIGNvbnZlcnNpb24KLSAgICAgKiBjYW4gb2NjdXIsIHRocm93cyBhCi0gICAgICogPGNvZGU+e0BsaW5rIERhdGFDb252ZXJzaW9uRXhjZXB0aW9ufTwvY29kZT4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBvZiBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbiB3aGVuIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpIHRocm93cyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZS50cmltKCkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFDb252ZXJzaW9uRXhjZXB0aW9uKG5hbWUsICJpbnQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSwgaW4KLSAgICAgKiA8Y29kZT5sb25nPC9jb2RlPiBmb3JtLCBhbmQgaWYgbm8gY29udmVyc2lvbgotICAgICAqIGNhbiBvY2N1ciwgdGhyb3dzIGEKLSAgICAgKiA8Y29kZT57QGxpbmsgRGF0YUNvbnZlcnNpb25FeGNlcHRpb259PC9jb2RlPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSBvZiBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbiB3aGVuIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKCkgdGhyb3dzIERhdGFDb252ZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZS50cmltKCkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFDb252ZXJzaW9uRXhjZXB0aW9uKG5hbWUsICJsb25nIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGdldHMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIGluCi0gICAgICogPGNvZGU+ZmxvYXQ8L2NvZGU+IGZvcm0sIGFuZCBpZiBubyBjb252ZXJzaW9uCi0gICAgICogY2FuIG9jY3VyLCB0aHJvd3MgYQotICAgICAqIDxjb2RlPntAbGluayBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbn08L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSBvZiBhdHRyaWJ1dGUuCi0gICAgICogQHRocm93cyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbiB3aGVuIGNvbnZlcnNpb24gZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKSB0aHJvd3MgRGF0YUNvbnZlcnNpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQXZvaWQgRmxvYXQucGFyc2VGbG9hdCgpIHRvIHN1cHBvcnQgSkRLIDEuMQotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2YodmFsdWUudHJpbSgpKS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YUNvbnZlcnNpb25FeGNlcHRpb24obmFtZSwgImZsb2F0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGdldHMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIGluCi0gICAgICogPGNvZGU+ZG91YmxlPC9jb2RlPiBmb3JtLCBhbmQgaWYgbm8gY29udmVyc2lvbgotICAgICAqIGNhbiBvY2N1ciwgdGhyb3dzIGEKLSAgICAgKiA8Y29kZT57QGxpbmsgRGF0YUNvbnZlcnNpb25FeGNlcHRpb259PC9jb2RlPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIG9mIGF0dHJpYnV0ZS4KLSAgICAgKiBAdGhyb3dzIERhdGFDb252ZXJzaW9uRXhjZXB0aW9uIHdoZW4gY29udmVyc2lvbiBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkgdGhyb3dzIERhdGFDb252ZXJzaW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEF2b2lkIERvdWJsZS5wYXJzZURvdWJsZSgpIHRvIHN1cHBvcnQgSkRLIDEuMQotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHZhbHVlLnRyaW0oKSkuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbihuYW1lLCAiZG91YmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGdldHMgdGhlIGVmZmVjdGl2ZSBib29sZWFuIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIG9yIHRocm93cyBhCi0gICAgICogPGNvZGU+e0BsaW5rIERhdGFDb252ZXJzaW9uRXhjZXB0aW9ufTwvY29kZT4gaWYgYSBjb252ZXJzaW9uIGNhbid0IGJlCi0gICAgICogcGVyZm9ybWVkLiAgVHJ1ZSB2YWx1ZXMgYXJlOiAidHJ1ZSIsICJvbiIsICIxIiwgYW5kICJ5ZXMiLiAgRmFsc2UKLSAgICAgKiB2YWx1ZXMgYXJlOiAiZmFsc2UiLCAib2ZmIiwgIjAiLCBhbmQgIm5vIi4gIFZhbHVlcyBhcmUgdHJpbW1lZCBiZWZvcmUKLSAgICAgKiBjb21wYXJpc29uLiAgVmFsdWVzIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkIGhlcmUgdGhyb3cgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgb2YgYXR0cmlidXRlLgotICAgICAqIEB0aHJvd3MgRGF0YUNvbnZlcnNpb25FeGNlcHRpb24gd2hlbiBjb252ZXJzaW9uIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHRocm93cyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZVRyaW0gPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgIGlmICgodmFsdWVUcmltLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgfHwKLSAgICAgICAgICAgICh2YWx1ZVRyaW0uZXF1YWxzSWdub3JlQ2FzZSgib24iKSkgfHwKLSAgICAgICAgICAgICh2YWx1ZVRyaW0uZXF1YWxzSWdub3JlQ2FzZSgiMSIpKSB8fAotICAgICAgICAgICAgKHZhbHVlVHJpbS5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCh2YWx1ZVRyaW0uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgfHwKLSAgICAgICAgICAgICAgICAgICAodmFsdWVUcmltLmVxdWFsc0lnbm9yZUNhc2UoIm9mZiIpKSB8fAotICAgICAgICAgICAgICAgICAgICh2YWx1ZVRyaW0uZXF1YWxzSWdub3JlQ2FzZSgiMCIpKSB8fAotICAgICAgICAgICAgICAgICAgICh2YWx1ZVRyaW0uZXF1YWxzSWdub3JlQ2FzZSgibm8iKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbihuYW1lLCAiYm9vbGVhbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU3VwcG9ydCBhIGN1c3RvbSBOYW1lc3BhY2Ugc2VyaWFsaXphdGlvbiBzbyBubyB0d28gbmFtZXNwYWNlCi0gICAgLy8gb2JqZWN0IGluc3RhbmNlcyBtYXkgZXhpc3QgZm9yIHRoZSBzYW1lIHByZWZpeC91cmkgcGFpcgotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIG91dC5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQotICAgICAgICAvLyBXZSB1c2Ugd3JpdGVPYmplY3QoKSBhbmQgbm90IHdyaXRlVVRGKCkgdG8gbWluaW1pemUgc3BhY2UKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIHdyaXRpbmcgcG9pbnRlcnMgdG8gYWxyZWFkeSB3cml0dGVuIHN0cmluZ3MKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG5hbWVzcGFjZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChuYW1lc3BhY2UuZ2V0VVJJKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0gICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgbmFtZXNwYWNlID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgKLSAgICAgICAgICAgIChTdHJpbmcpaW4ucmVhZE9iamVjdCgpLCAoU3RyaW5nKWluLnJlYWRPYmplY3QoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9BdHRyaWJ1dGVMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0F0dHJpYnV0ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkZTEzOC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0F0dHJpYnV0ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IEF0dHJpYnV0ZUxpc3QuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb207Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiA8Y29kZT5BdHRyaWJ1dGVMaXN0PC9jb2RlPiByZXByZXNlbnRzIGxlZ2FsIEpET00gPGNvZGU+QXR0cmlidXRlPC9jb2RlPgotICogY29udGVudC4gIFRoaXMgY2xhc3MgaXMgTk9UIFBVQkxJQzsgdXNlcnMgc2hvdWxkIHNlZSBpdCBhcyBhIHNpbXBsZSBMaXN0Ci0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEFsZXggUm9zZW4KLSAqIEBhdXRob3IgUGhpbGlwcGUgUmlhbmQKLSAqIEBhdXRob3IgQnJhZGxleSBTLiBIdWZmbWFuCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAc2VlIENEQVRBCi0gKiBAc2VlIENvbW1lbnQKLSAqIEBzZWUgRWxlbWVudAotICogQHNlZSBFbnRpdHlSZWYKLSAqIEBzZWUgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0gKiBAc2VlIFRleHQKLSAqLwotY2xhc3MgQXR0cmlidXRlTGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdAotICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIExpc3QsIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IEF0dHJpYnV0ZUxpc3QuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkICROYW1lOiAgJCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9BUlJBWV9TSVpFID0gNTsKLQotICAgIC8qKiBUaGUgYmFja2luZyBsaXN0ICovCi0gICAgcHJpdmF0ZSBBdHRyaWJ1dGUgZWxlbWVudERhdGFbXTsKLSAgICBwcml2YXRlIGludCBzaXplOwotCi0gICAgLyoqIFRoZSBwYXJlbnQgRWxlbWVudCAqLwotICAgIHByaXZhdGUgRWxlbWVudCBwYXJlbnQ7Ci0KLSAgICAvKiogRm9yY2UgYW4gRWxlbWVudCBwYXJlbnQgKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZUxpc3QoKSB7fQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBdHRyaWJ1dGVMaXN0IHJlcHJlc2VudGluZwotICAgICAqIEVsZW1lbnQgY29udGVudAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBlbGVtZW50IHdob3NlIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIGhlbGQKLSAgICAgKi8KLSAgICBBdHRyaWJ1dGVMaXN0KEVsZW1lbnQgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgaW50ZXJuYWwgbWV0aG9kIHRvIHN1cHBvcnQgYnVpbGRpbmcgZnJvbSBzb3VyY2VzIHRoYXQgYXJlCi0gICAgICogMTAwJSB0cnVzdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGEgYXR0cmlidXRlIHRvIGFkZCB3aXRob3V0IGFueSBjaGVja3MKLSAgICAgKi8gCi0gICAgZmluYWwgdm9pZCB1bmNoZWNrZWRBZGRBdHRyaWJ1dGUoQXR0cmlidXRlIGEpIHsKLSAgICAgICAgYS5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIGVuc3VyZUNhcGFjaXR5KHNpemUgKyAxKTsKLSAgICAgICAgZWxlbWVudERhdGFbc2l6ZSsrXSA9IGE7Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgYXR0cmlidXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb3IgcmVwbGFjZSBhIGV4aXN0aW5nCi0gICAgICogYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBpbnNlcnQgaW50byB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuIHRydWUgKGFzIHBlciB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiBDb2xsZWN0aW9uLmFkZCkuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBvYmo7Ci0gICAgICAgICAgICBpbnQgZHVwbGljYXRlID0gaW5kZXhPZkR1cGxpY2F0ZShhdHRyaWJ1dGUpOwotICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSA8IDApIHsKLSAgICAgICAgICAgICAgICBhZGQoc2l6ZSgpLCBhdHRyaWJ1dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0KGR1cGxpY2F0ZSwgYXR0cmlidXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkNhbm5vdCBhZGQgbnVsbCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKCJDbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhbiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgICAqIFNoaWZ0cyB0aGUgYXR0cmlidXRlIGN1cnJlbnRseSBhdCB0aGF0IHBvc2l0aW9uIChpZiBhbnkpIGFuZCBhbnkKLSAgICAgKiBzdWJzZXF1ZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgbG9jYXRpb24gdG8gc2V0IHRoZSB2YWx1ZSB0by4KLSAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gaW5zZXJ0IGludG8gdGhlIGxpc3QuCi0gICAgICogdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggPCAwIHx8IGluZGV4ID4gc2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgb2JqOwotICAgICAgICAgICAgaW50IGR1cGxpY2F0ZSA9IGluZGV4T2ZEdXBsaWNhdGUoYXR0cmlidXRlKTsKLSAgICAgICAgICAgIGlmIChkdXBsaWNhdGUgPj0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKCJDYW5ub3QgYWRkIGR1cGxpY2F0ZSBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZChpbmRleCwgYXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkNhbm5vdCBhZGQgbnVsbCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKCJDbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhbiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGFuZCBhZGQgdGhlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gdG8gdGhpcyBsaXN0IGF0Ci0gICAgICogdGhlIGdpdmVuIGluZGV4LiBOb3RlOiBkb2VzIG5vdCBjaGVjayBmb3IgZHVwbGljYXRlCi0gICAgICogYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCB3aGVyZSB0byBhZGQgPGNvZGU+QXR0cmlidXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB0byBhZGQKLSAgICAgKi8KLSAgICB2b2lkIGFkZChpbnQgaW5kZXgsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBoYXMgYW4gZXhpc3RpbmcgcGFyZW50IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRQYXJlbnQoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiXCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja05hbWVzcGFjZUNvbGxpc2lvbihhdHRyaWJ1dGUsIHBhcmVudCk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24ocGFyZW50LCBhdHRyaWJ1dGUsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD5zaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXR0cmlidXRlLnNldFBhcmVudChwYXJlbnQpOwotCi0gICAgICAgIGVuc3VyZUNhcGFjaXR5KHNpemUrMSk7Ci0gICAgICAgIGlmKCBpbmRleD09c2l6ZSApIHsKLSAgICAgICAgICAgIGVsZW1lbnREYXRhW3NpemUrK10gPSBhdHRyaWJ1dGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnREYXRhLCBpbmRleCwgZWxlbWVudERhdGEsIGluZGV4ICsgMSwgc2l6ZSAtIGluZGV4KTsKLSAgICAgICAgICAgIGVsZW1lbnREYXRhW2luZGV4XSA9IGF0dHJpYnV0ZTsKLSAgICAgICAgICAgIHNpemUrKzsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gY29udGFpbmluZyBhbGwgdGhlIG9iamVjdHMgdG8gYWRkLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgd2FzIG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mCi0gICAgICogdGhlIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBhZGRBbGwoc2l6ZSgpLCBjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgY29sbGVjdG9uIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgICAqIFNoaWZ0cyB0aGUgYXR0cmlidXRlIGN1cnJlbnRseSBhdCB0aGF0IHBvc2l0aW9uIChpZiBhbnkpIGFuZCBhbnkKLSAgICAgKiBzdWJzZXF1ZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IHRvIHN0YXJ0IGFkZGluZyB0aGUgZGF0YSBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc2VydCBpbnRvIHRoZSBsaXN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgd2FzIG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWRkLgotICAgICAqIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD5zaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChjb2xsZWN0aW9uID09IG51bGwpIHx8IChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhcGFjaXR5KHNpemUoKSArIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZChpbmRleCArIGNvdW50LCBvYmopOwotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGN1cnJlbnQgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgaWYgKGVsZW1lbnREYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGVsZW1lbnREYXRhW2ldOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRQYXJlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50RGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjdXJyZW50IGxpc3QgYW5kIHNldCBpdCB0byB0aGUgY29udGVudHMKLSAgICAgKiBvZiB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4uCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gdXNlLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJBbmRTZXQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIEF0dHJpYnV0ZVtdIG9sZCA9IGVsZW1lbnREYXRhOwotICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemU7Ci0KLSAgICAgICAgZWxlbWVudERhdGEgPSBudWxsOwotICAgICAgICBzaXplID0gMDsKLQotICAgICAgICBpZiAoKGNvbGxlY3Rpb24gIT0gbnVsbCkgJiYgKGNvbGxlY3Rpb24uc2l6ZSgpICE9IDApKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYXBhY2l0eShjb2xsZWN0aW9uLnNpemUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFkZEFsbCgwLCBjb2xsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhID0gb2xkOwotICAgICAgICAgICAgICAgIHNpemUgPSBvbGRTaXplOwotICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gb2xkW2ldOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRQYXJlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgPGNvZGU+QXR0cmlidXRlTGlzdDwvY29kZT4gaW5zdGFuY2UsCi0gICAgICogaWYgbmVjZXNzYXJ5LCB0byBlbnN1cmUgdGhhdCBpdCBjYW4gaG9sZCBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mCi0gICAgICogaXRlbXMgc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtIGNhcGFjaXR5IGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbkNhcGFjaXR5IHRoZSBkZXNpcmVkIG1pbmltdW0gY2FwYWNpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBtaW5DYXBhY2l0eSkgewotICAgICAgICBpZiAoZWxlbWVudERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudERhdGEgPSBuZXcgQXR0cmlidXRlW01hdGgubWF4KG1pbkNhcGFjaXR5LCBJTklUSUFMX0FSUkFZX1NJWkUpXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCBvbGRDYXBhY2l0eSA9IGVsZW1lbnREYXRhLmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChtaW5DYXBhY2l0eSA+IG9sZENhcGFjaXR5KSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIG9sZERhdGFbXSA9IGVsZW1lbnREYXRhOwotICAgICAgICAgICAgICAgIGludCBuZXdDYXBhY2l0eSA9IChvbGRDYXBhY2l0eSAqIDMpLzIgKyAxOwotICAgICAgICAgICAgICAgIGlmIChuZXdDYXBhY2l0eSA8IG1pbkNhcGFjaXR5KQotICAgICAgICAgICAgICAgICAgICBuZXdDYXBhY2l0eSA9IG1pbkNhcGFjaXR5OwotICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhID0gbmV3IEF0dHJpYnV0ZVtuZXdDYXBhY2l0eV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGREYXRhLCAwLCBlbGVtZW50RGF0YSwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IG9mIHRoZSBvYmplY3QuCi0gICAgICogQHJldHVybiBUaGUgT2JqZWN0IHdoaWNoIHdhcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4PDAgfHwgaW5kZXg+PXNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU2l6ZTogIiArIHNpemUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWxlbWVudERhdGFbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgYW5kIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGF0dHJpYnV0ZSB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LCBvciBudWxsIGlmIG9uZSBkb2Vzbid0IGV4aXN0LgotICAgICAqLwotICAgIE9iamVjdCBnZXQoU3RyaW5nIG5hbWUsIE5hbWVzcGFjZSBuYW1lc3BhY2UpIHsKLSAgICAgICAgaW50IGluZGV4ID0gaW5kZXhPZihuYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudERhdGFbaW5kZXhdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBpbmRleCBvZiB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgYW5kIHVyaS4KLSAgICAgKi8KLSAgICBpbnQgaW5kZXhPZihTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlLmdldFVSSSgpOwotICAgICAgICBpZiAoZWxlbWVudERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgb2xkID0gZWxlbWVudERhdGFbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9sZFVSSSA9IG9sZC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG9sZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFVSSS5lcXVhbHModXJpKSAmJiBvbGROYW1lLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBvZmZzZXQgb2YgdGhlIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBPYmplY3Qgd2hpY2ggd2FzIHJlbW92ZWQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleDwwIHx8IGluZGV4Pj1zaXplKQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTaXplOiAiICsgc2l6ZSgpKTsKLQotICAgICAgICBBdHRyaWJ1dGUgb2xkID0gZWxlbWVudERhdGFbaW5kZXhdOwotICAgICAgICBvbGQuc2V0UGFyZW50KG51bGwpOwotICAgICAgICBpbnQgbnVtTW92ZWQgPSBzaXplIC0gaW5kZXggLSAxOwotICAgICAgICBpZiAobnVtTW92ZWQgPiAwKQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShlbGVtZW50RGF0YSwgaW5kZXgrMSwgZWxlbWVudERhdGEsIGluZGV4LG51bU1vdmVkKTsKLSAgICAgICAgZWxlbWVudERhdGFbLS1zaXplXSA9IG51bGw7IC8vIExldCBnYyBkbyBpdHMgd29yawotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUgYW5kIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gdG8gbWF0Y2gKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQsCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIGJvb2xlYW4gcmVtb3ZlKFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGluZGV4T2YobmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZShpbmRleCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gdG8gdGhlIHN1cHBsaWVkCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBsb2NhdGlvbiB0byBzZXQgdGhlIHZhbHVlIHRvLgotICAgICAqIEBwYXJhbSBvYmogVGhlIGxvY2F0aW9uIHRvIHNldCB0aGUgdmFsdWUgdG8uCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IHdoaWNoIHdhcyByZXBsYWNlZC4KLSAgICAgKiB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBvYmo7Ci0gICAgICAgICAgICBpbnQgZHVwbGljYXRlID0gaW5kZXhPZkR1cGxpY2F0ZShhdHRyaWJ1dGUpOwotICAgICAgICAgICAgaWYgKChkdXBsaWNhdGUgPj0gMCkgJiYgKGR1cGxpY2F0ZSAhPSBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBkdXBsaWNhdGUgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2V0KGluZGV4LCBhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkNsYXNzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGFuIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB0byB0aGUgc3VwcGxpZWQKLSAgICAgKiBvYmplY3QuIE5vdGU6IGRvZXMgbm90IGNoZWNrIGZvciBkdXBsaWNhdGUgYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgbG9jYXRpb24gdG8gc2V0IHRoZSB2YWx1ZSB0by4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCB3aGljaCB3YXMgcmVwbGFjZWQuCi0gICAgICogdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKQotICAgICAqLwotICAgIE9iamVjdCBzZXQoaW50IGluZGV4LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU2l6ZTogIiArIHNpemUoKSk7Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBoYXMgYW4gZXhpc3RpbmcgcGFyZW50IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRQYXJlbnQoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiXCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja05hbWVzcGFjZUNvbGxpc2lvbihhdHRyaWJ1dGUsIHBhcmVudCk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24ocGFyZW50LCBhdHRyaWJ1dGUsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBBdHRyaWJ1dGUgb2xkID0gKEF0dHJpYnV0ZSkgZWxlbWVudERhdGFbaW5kZXhdOwotICAgICAgICBvbGQuc2V0UGFyZW50KG51bGwpOwotCi0gICAgICAgIGVsZW1lbnREYXRhW2luZGV4XSA9IGF0dHJpYnV0ZTsKLSAgICAgICAgYXR0cmlidXRlLnNldFBhcmVudChwYXJlbnQpOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBpbmRleCBvZiBhdHRyaWJ1dGUgd2l0aCBzYW1lIG5hbWUgYW5kIE5hbWVzcGFjZSwgb3IKLSAgICAgKiAtMSBpZiBvbmUgZG9lc24ndCBleGlzdAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGluZGV4T2ZEdXBsaWNhdGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotICAgICAgICBpbnQgZHVwbGljYXRlID0gLTE7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLSAgICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IGF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgZHVwbGljYXRlID0gaW5kZXhPZihuYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICByZXR1cm4gZHVwbGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgbGlzdAotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIGxpc3QgYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9DREFUQS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9DREFUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE0MmZhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vQ0RBVEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IENEQVRBLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIEFuIFhNTCBDREFUQSBzZWN0aW9uLiBSZXByZXNlbnRzIGNoYXJhY3Rlci1iYXNlZCBjb250ZW50IHdpdGhpbiBhbiBYTUwKLSAqIGRvY3VtZW50IHRoYXQgc2hvdWxkIGJlIG91dHB1dCB3aXRoaW4gc3BlY2lhbCBDREFUQSB0YWdzLiBTZW1hbnRpY2FsbHkgaXQncwotICogaWRlbnRpY2FsIHRvIGEgc2ltcGxlIHtAbGluayBUZXh0fSBvYmplY3QsIGJ1dCBvdXRwdXQgYmVoYXZpb3IgaXMgZGlmZmVyZW50LgotICogQ0RBVEEgbWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mCi0gKiBjaGFyYWN0ZXIgZGF0YSwgYnV0IGRvZXMgZXhwb3NlIHRoYXQgZGF0YSBhcyBhIEphdmEgU3RyaW5nLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqIEBhdXRob3IgIERhbiBTY2hhZmZlcgotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqLwotcHVibGljIGNsYXNzIENEQVRBIGV4dGVuZHMgVGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0gCi0gICAgICAiQCgjKSAkUkNTZmlsZTogQ0RBVEEuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSBwcm90ZWN0ZWQsIG5vLWFyZ3MgY29uc3RydWN0b3Igc3RhbmRhcmQgaW4gYWxsIEpET00KLSAgICAgKiBjbGFzc2VzLiBJdCBhbGxvd3Mgc3ViY2xhc3NlcnMgdG8gZ2V0IGEgcmF3IGluc3RhbmNlIHdpdGggbm8KLSAgICAgKiBpbml0aWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ0RBVEEoKSB7IH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyA8Y29kZT5DREFUQTwvY29kZT4gbm9kZSwgd2l0aCB0aGUKLSAgICAgKiBzdXBwbGllZCBzdHJpbmcgdmFsdWUgYXMgaXQncyBjaGFyYWN0ZXIgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgdGhlIG5vZGUncyBjaGFyYWN0ZXIgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gY29udGFpbnMgYW4gCi0gICAgICogICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlciBzdWNoIGFzIGEgdmVydGljYWwgdGFiIChhcyBkZXRlcm1pbmVkCi0gICAgICogICAgICAgICAgYnkge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pCi0gICAgICogICAgICAgICBvciB0aGUgQ0RBVEEgZW5kIGRlbGltaXRlciA8Y29kZT5dXSZndDs8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBDREFUQShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHNldFRleHQoc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGlzIDxjb2RlPkNEQVRBPC9jb2RlPiBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciB2YWx1ZSBmb3Igbm9kZSdzIGNvbnRlbnQuCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gY29udGFpbnMgYW4gCi0gICAgICogICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlciBzdWNoIGFzIGEgdmVydGljYWwgdGFiIChhcyBkZXRlcm1pbmVkCi0gICAgICogICAgICAgICAgYnkge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pCi0gICAgICogICAgICAgICBvciB0aGUgQ0RBVEEgZW5kIGRlbGltaXRlciA8Y29kZT5dXSZndDs8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBUZXh0IHNldFRleHQoU3RyaW5nIHN0cikgewotICAgICAgICAvLyBPdmVycmlkZXMgVGV4dC5zZXRUZXh0KCkgYmVjYXVzZSB0aGlzIG5lZWRzIHRvIGNoZWNrIENEQVRBCi0gICAgICAgIC8vIHJ1bGVzIGFyZSBlbmZvcmNlZC4gIFdlIGNvdWxkIGhhdmUgYSBzZXBhcmF0ZSBWZXJpZmllciBjaGVjawotICAgICAgICAvLyBmb3IgQ0RBVEEgYmV5b25kIFRleHQgYW5kIGNhbGwgdGhhdCBhbG9uZSBiZWZvcmUgc3VwZXIuc2V0VGV4dCgpLgotCi0gICAgICAgIFN0cmluZyByZWFzb247Ci0KLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZWFzb24gPSBWZXJpZmllci5jaGVja0NEQVRBU2VjdGlvbihzdHIpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24oc3RyLCAiQ0RBVEEgc2VjdGlvbiIsIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUgPSBzdHI7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBhcHBlbmQgY2hhcmFjdGVyIGNvbnRlbnQgdG8gd2hhdGV2ZXIgY29udGVudCBhbHJlYWR5Ci0gICAgICogZXhpc3RzIHdpdGhpbiB0aGlzIDxjb2RlPkNEQVRBPC9jb2RlPiBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciBjaGFyYWN0ZXIgY29udGVudCB0byBhcHBlbmQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiA8Y29kZT5zdHI8L2NvZGU+IGNvbnRhaW5zIGFuIAotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgc3VjaCBhcyBhIHZlcnRpY2FsIHRhYiAoYXMgZGV0ZXJtaW5lZAotICAgICAqICAgICAgICAgIGJ5IHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KQotICAgICAqICAgICAgICAgb3IgdGhlIENEQVRBIGVuZCBkZWxpbWl0ZXIgPGNvZGU+XV0mZ3Q7PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIHN0cikgewotICAgICAgICAvLyBPdmVycmlkZXMgVGV4dC5zZXRUZXh0KCkgYmVjYXVzZSB0aGlzIG5lZWRzIHRvIGNoZWNrIENEQVRBCi0gICAgICAgIC8vIHJ1bGVzIGFyZSBlbmZvcmNlZC4gIFdlIGNvdWxkIGhhdmUgYSBzZXBhcmF0ZSBWZXJpZmllciBjaGVjawotICAgICAgICAvLyBmb3IgQ0RBVEEgYmV5b25kIFRleHQgYW5kIGNhbGwgdGhhdCBhbG9uZSBiZWZvcmUgc3VwZXIuc2V0VGV4dCgpLgotCi0gICAgICAgIFN0cmluZyByZWFzb247Ci0KLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChyZWFzb24gPSBWZXJpZmllci5jaGVja0NEQVRBU2VjdGlvbihzdHIpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24oc3RyLCAiQ0RBVEEgc2VjdGlvbiIsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgPT0gRU1QVFlfU1RSSU5HKQotICAgICAgICAgICAgIHZhbHVlID0gc3RyOwotICAgICAgICBlbHNlIHZhbHVlICs9IHN0cjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPkNEQVRBPC9jb2RlPiBub2RlLCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiBJZiB0aGUgWE1MCi0gICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPkNEQVRBPC9jb2RlPiBub2RlIGlzIGRlc2lyZWQsCi0gICAgICogZWl0aGVyIDxjb2RlPntAbGluayAjZ2V0VGV4dH08L2NvZGU+IG9yCi0gICAgICoge0BsaW5rIG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXIjb3V0cHV0KENEQVRBLCBqYXZhLmlvLldyaXRlcil9PC9jb2RlPgotICAgICAqIHNob3VsZCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKDY0KQotICAgICAgICAgICAgLmFwcGVuZCgiW0NEQVRBOiAiKQotICAgICAgICAgICAgLmFwcGVuZChnZXRUZXh0KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCJdIikKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vQ29tbWVudC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGI0MTcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyotLQotCi0gJElkOiBDb21tZW50LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIEFuIFhNTCBjb21tZW50LiBNZXRob2RzIGFsbG93IHRoZSB1c2VyIHRvIGdldCBhbmQgc2V0IHRoZSB0ZXh0IG9mIHRoZQotICogY29tbWVudC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBDb250ZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IENvbW1lbnQuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKiogVGV4dCBvZiB0aGUgPGNvZGU+Q29tbWVudDwvY29kZT4gKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0LCBuby1hcmdzIGNvbnN0cnVjdG9yIGZvciBpbXBsZW1lbnRhdGlvbnMgdG8gdXNlIGlmIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tbWVudCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQgdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IDxjb2RlPlN0cmluZzwvY29kZT4gY29udGVudCBvZiBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDb21tZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHNldFRleHQodGV4dCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYUGF0aCAxLjAgc3RyaW5nIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgd2hpY2ggaXMgdGhlCi0gICAgICogdGV4dCBvZiB0aGlzIGNvbW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgY29tbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgdGV4dHVhbCBkYXRhIHdpdGhpbiB0aGUgPGNvZGU+Q29tbWVudDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSB0ZXh0IG9mIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Q29tbWVudDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCA8Y29kZT5TdHJpbmc8L2NvZGU+IHRleHQgZm9yIGNvbW1lbnQuCi0gICAgICogQHJldHVybiA8Y29kZT5Db21tZW50PC9jb2RlPiAtIHRoaXMgQ29tbWVudCBtb2RpZmllZC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIGlsbGVnYWwgZm9yIGEKLSAgICAgKiAgICAgICAgIENvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENvbW1lbnQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrQ29tbWVudERhdGEodGV4dCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbih0ZXh0LCAiY29tbWVudCIsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPkNvbW1lbnQ8L2NvZGU+LCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiBJZiB0aGUgWE1MCi0gICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPkNvbW1lbnQ8L2NvZGU+IGlzIGRlc2lyZWQsCi0gICAgICoge0BsaW5rIG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXIjb3V0cHV0U3RyaW5nKENvbW1lbnQpfQotICAgICAqIHNob3VsZCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICogICAgICAgICA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgLmFwcGVuZCgiW0NvbW1lbnQ6ICIpCi0gICAgICAgICAgICAuYXBwZW5kKG5ldyBvcmcuamRvbS5vdXRwdXQuWE1MT3V0cHV0dGVyKCkub3V0cHV0U3RyaW5nKHRoaXMpKQotICAgICAgICAgICAgLmFwcGVuZCgiXSIpCi0gICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vQ29udGVudC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Db250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZThlNzUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyotLQotCi0gJElkOiBDb250ZW50LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBTdXBlcmNsYXNzIGZvciBKRE9NIG9iamVjdHMgd2hpY2ggY2FuIGJlIGxlZ2FsIGNoaWxkIGNvbnRlbnQKLSAqIG9mIHtAbGluayBvcmcuamRvbS5QYXJlbnR9IG5vZGVzLgotICoKLSAqIEBzZWUgb3JnLmpkb20uQ29tbWVudAotICogQHNlZSBvcmcuamRvbS5Eb2NUeXBlCi0gKiBAc2VlIG9yZy5qZG9tLkVsZW1lbnQKLSAqIEBzZWUgb3JnLmpkb20uRW50aXR5UmVmCi0gKiBAc2VlIG9yZy5qZG9tLlBhcmVudAotICogQHNlZSBvcmcuamRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLSAqIEBzZWUgb3JnLmpkb20uVGV4dAotICoKLSAqIEBhdXRob3IgQnJhZGxleSBTLiBIdWZmbWFuCi0gKiBAYXV0aG9yIEphc29uIEh1bnRlcgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTkgJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudCBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByb3RlY3RlZCBQYXJlbnQgcGFyZW50ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBDb250ZW50KCkge30KLQotICAgIC8qKgotICAgICAqIERldGFjaGVzIHRoaXMgY2hpbGQgZnJvbSBpdHMgcGFyZW50IG9yIGRvZXMgbm90aGluZyBpZiB0aGUgY2hpbGQKLSAgICAgKiBoYXMgbm8gcGFyZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIGNoaWxkIGRldGFjaGVkCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnQgZGV0YWNoKCkgewotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDb250ZW50KHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIGNoaWxkJ3MgcGFyZW50LCBvciBudWxsIGlmIHRoaXMgY2hpbGQgaXMgY3VycmVudGx5Ci0gICAgICogbm90IGF0dGFjaGVkLiBUaGUgcGFyZW50IGNhbiBiZSBlaXRoZXIgYW4ge0BsaW5rIEVsZW1lbnR9Ci0gICAgICogb3IgYSB7QGxpbmsgRG9jdW1lbnR9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIGNoaWxkJ3MgcGFyZW50IG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJlbnQgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhbnkgcGFyZW50IGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCwKLSAgICAgKiBvciBudWxsIGlmIHRoZSBlbGVtZW50IGlzIHVuYXR0YWNoZWQgb3IgaXMgYSByb290IGVsZW1lbnQuICBUaGlzIHdhcyB0aGUKLSAgICAgKiBvcmlnaW5hbCBiZWhhdmlvciBvZiBnZXRQYXJlbnQoKSBpbiBKRE9NIEJldGEgOSB3aGljaCBiZWdhbiByZXR1cm5pbmcKLSAgICAgKiBQYXJlbnQgaW4gQmV0YSAxMC4gIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgY29udmVuaWVudCB1cGdyYWRlIHBhdGggZm9yCi0gICAgICogSkRPTSBCZXRhIDEwIGFuZCAxLjAgdXNlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluaW5nIEVsZW1lbnQgb3IgbnVsbCBpZiB1bmF0dGFjaGVkIG9yIGEgcm9vdCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpIHsKLSAgICAgICAgUGFyZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICByZXR1cm4gKEVsZW1lbnQpICgocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgPyBwYXJlbnQgOiBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBDb250ZW50LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZwotICAgICAqIGFueSBwcmUtZXhpc3RpbmcgcGFyZW50YWdlLgotICAgICAqCi0gICAgICogQHBhcmFtICBwYXJlbnQgICAgICAgICAgICAgIG5ldyBwYXJlbnQgZWxlbWVudAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udGVudCBzZXRQYXJlbnQoUGFyZW50IHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgY2hpbGQncyBvd25pbmcgZG9jdW1lbnQgb3IgbnVsbCBpZiB0aGUgYnJhbmNoIGNvbnRhaW5pbmcKLSAgICAgKiB0aGlzIGNoaWxkIGlzIGN1cnJlbnRseSBub3QgYXR0YWNoZWQgdG8gYSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcyBjaGlsZCdzIG93bmluZyBkb2N1bWVudCBvciBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFhQYXRoIDEuMCBzdHJpbmcgdmFsdWUgb2YgdGhpcyBjaGlsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4geHBhdGggc3RyaW5nIHZhbHVlIG9mIHRoaXMgY2hpbGQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGRlZXAsIHVuYXR0YWNoZWQgY29weSBvZiB0aGlzIGNoaWxkIGFuZCBpdHMgZGVzY2VuZGFudHMKLSAgICAgKiBkZXRhY2hlZCBmcm9tIGFueSBwYXJlbnQgb3IgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgZGV0YWNoZWQgZGVlcCBjb3B5IG9mIHRoaXMgY2hpbGQgYW5kIGRlc2NlbmRhbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbnRlbnQgYyA9IChDb250ZW50KXN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICBjLnBhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9DYW4gbm90IGhhcHBlbiAuLi4uCi0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdHMgZm9yIGVxdWFsaXR5IG9mIHRoaXMgQ29udGVudCBvYmplY3QgdG8gdGhlIHN1cHBsaWVkIG9iamVjdC4KLSAgICAgKiBDb250ZW50IGl0ZW1zIGFyZSBjb25zaWRlcmVkIGVxdWFsIG9ubHkgaWYgdGhleSBhcmUgcmVmZXJlbnRpYWxseSBlcXVhbAotICAgICAqIChpJiM0NjtlJiM0NjsgdGhlIHNhbWUgb2JqZWN0KS4gIFVzZXIgY29kZSBtYXkgY2hvb3NlIHRvIGNvbXBhcmUgb2JqZWN0cwotICAgICAqIGJhc2VkIG9uIHRoZWlyIHByb3BlcnRpZXMgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGNvbXBhcmUgdG8uCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiAtIHdoZXRoZXIgdGhlIDxjb2RlPkNvbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogICAgICAgICBlcXVhbCB0byB0aGUgc3VwcGxpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iKSB7Ci0gICAgICAgIHJldHVybiAob2IgPT0gdGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgPGNvZGU+Q29udGVudDwvY29kZT4gaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+aW50PC9jb2RlPiAtIGhhc2ggY29kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0NvbnRlbnRMaXN0LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0NvbnRlbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWIwNzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Db250ZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NSArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IENvbnRlbnRMaXN0LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnKS4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuamRvbS5maWx0ZXIuKjsKLQotLyoqCi0gKiBBIG5vbi1wdWJsaWMgbGlzdCBpbXBsZW1lbnRhdGlvbiBob2xkaW5nIG9ubHkgbGVnYWwgSkRPTSBjb250ZW50LCBpbmNsdWRpbmcKLSAqIGNvbnRlbnQgZm9yIERvY3VtZW50IG9yIEVsZW1lbnQgbm9kZXMuIFVzZXJzIHNlZSB0aGlzIGNsYXNzIGFzIGEgc2ltcGxlIExpc3QKLSAqIGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBzZWUgICAgIENEQVRBCi0gKiBAc2VlICAgICBDb21tZW50Ci0gKiBAc2VlICAgICBFbGVtZW50Ci0gKiBAc2VlICAgICBFbnRpdHlSZWYKLSAqIEBzZWUgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotICogQHNlZSAgICAgVGV4dAotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQKLSAqIEBhdXRob3IgIEFsZXggUm9zZW4KLSAqIEBhdXRob3IgIFBoaWxpcHBlIFJpYW5kCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqLwotZmluYWwgY2xhc3MgQ29udGVudExpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICJAKCMpICRSQ1NmaWxlOiBDb250ZW50TGlzdC5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQgJE5hbWU6ICAkIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0FSUkFZX1NJWkUgPSA1OwotCi0gICAgLyoqCi0gICAgICogVXNlZCBpbm5lciBjbGFzcyBGaWx0ZXJMaXN0SXRlcmF0b3IgdG8gaGVscCBoYXNOZXh0IGFuZAotICAgICAqIGhhc1ByZXZpb3VzIHRoZSBuZXh0IGluZGV4IG9mIG91ciBjdXJzb3IgKG11c3QgYmUgaGVyZQotICAgICAqIGZvciBKREsxLjEpLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUkVBVEUgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTUFJFViA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU05FWFQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVWICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVYVCAgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERCAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgID0gNjsKLQotICAgIC8qKiBPdXIgYmFja2luZyBsaXN0ICovCi0vLyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGxpc3Q7Ci0gICAgcHJpdmF0ZSBDb250ZW50IGVsZW1lbnREYXRhW107Ci0gICAgcHJpdmF0ZSBpbnQgc2l6ZTsKLQotICAgIC8qKiBEb2N1bWVudCBvciBFbGVtZW50IHRoaXMgbGlzdCBiZWxvbmdzIHRvICovCi0gICAgcHJpdmF0ZSBQYXJlbnQgcGFyZW50OwotCi0gICAgLyoqIEZvcmNlIGVpdGhlciBhIERvY3VtZW50IG9yIEVsZW1lbnQgcGFyZW50ICovCi0gICAgQ29udGVudExpc3QoUGFyZW50IHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYWNrYWdlIGludGVybmFsIG1ldGhvZCB0byBzdXBwb3J0IGJ1aWxkaW5nIGZyb20gc291cmNlcyB0aGF0IGFyZQotICAgICAqIDEwMCUgdHJ1c3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIGNvbnRlbnQgdG8gYWRkIHdpdGhvdXQgYW55IGNoZWNrcwotICAgICAqLwotICAgIGZpbmFsIHZvaWQgdW5jaGVja2VkQWRkQ29udGVudChDb250ZW50IGMpIHsKLSAgICAgICAgYy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIGVuc3VyZUNhcGFjaXR5KHNpemUgKyAxKTsKLSAgICAgICAgZWxlbWVudERhdGFbc2l6ZSsrXSA9IGM7Ci0gICAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KLSAgICAgKiBTaGlmdHMgdGhlIG9iamVjdCBjdXJyZW50bHkgYXQgdGhhdCBwb3NpdGlvbiAoaWYgYW55KSBhbmQgYW55Ci0gICAgICogc3Vic2VxdWVudCBvYmplY3RzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGxvY2F0aW9uIHRvIHNldCB0aGUgdmFsdWUgdG8uCi0gICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGluc2VydCBpbnRvIHRoZSBsaXN0LgotICAgICAqIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudCkpIHsKLSAgICAgICAgICAgIGFkZChpbmRleCwgKENvbnRlbnQpIG9iaik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQ2xhc3MgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG9mIHVucmVjb2duaXplZCB0eXBlIGFuZCBjYW5ub3QgYmUgYWRkZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmpkb20uQ29udGVudExpc3QjYWRkKGludCwgb3JnLmpkb20uQ29udGVudCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9jdW1lbnRDYW5Db250YWluKGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXhPZkZpcnN0RWxlbWVudCgpID49IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWRkIGEgc2Vjb25kIHJvb3QgZWxlbWVudCwgb25seSBvbmUgaXMgYWxsb3dlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4T2ZEb2NUeXBlKCkgPiBpbmRleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkEgcm9vdCBlbGVtZW50IGNhbm5vdCBiZSBhZGRlZCBiZWZvcmUgdGhlIERvY1R5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBEb2NUeXBlKSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXhPZkRvY1R5cGUoKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGFkZCBhIHNlY29uZCBkb2N0eXBlLCBvbmx5IG9uZSBpcyBhbGxvd2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgZmlyc3RFbHQgPSBpbmRleE9mRmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFbHQgIT0gLTEgJiYgZmlyc3RFbHQgPCBpbmRleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkEgRG9jVHlwZSBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgdGhlIHJvb3QgZWxlbWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENEQVRBKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQSBDREFUQSBpcyBub3QgYWxsb3dlZCBhdCB0aGUgZG9jdW1lbnQgcm9vdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkEgVGV4dCBpcyBub3QgYWxsb3dlZCBhdCB0aGUgZG9jdW1lbnQgcm9vdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRW50aXR5UmVmKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiQW4gRW50aXR5UmVmIGlzIG5vdCBhbGxvd2VkIGF0IHRoZSBkb2N1bWVudCByb290Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVsZW1lbnRDYW5Db250YWluKGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBEb2NUeXBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkEgRG9jVHlwZSBpcyBub3QgYWxsb3dlZCBleGNlcHQgYXQgdGhlIGRvY3VtZW50IGxldmVsIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBhbmQgYWRkIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byB0aGlzIGxpc3QgYXQKLSAgICAgKiB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggd2hlcmUgdG8gYWRkIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICAgICogQHBhcmFtIGNoaWxkIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRvIGFkZAotICAgICAqLwotICAgIHZvaWQgYWRkKGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkNhbm5vdCBhZGQgbnVsbCBvYmplY3QiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICBkb2N1bWVudENhbkNvbnRhaW4oaW5kZXgsIGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBlbGVtZW50Q2FuQ29udGFpbihpbmRleCwgY2hpbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoaWxkLmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmVudCBwID0gY2hpbGQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oKEVsZW1lbnQpY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgIlRoZSBDb250ZW50IGFscmVhZHkgaGFzIGFuIGV4aXN0aW5nIHBhcmVudCBkb2N1bWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIENvbnRlbnQgYWxyZWFkeSBoYXMgYW4gZXhpc3RpbmcgcGFyZW50IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpcCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hpbGQgPT0gcGFyZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIEVsZW1lbnQgY2Fubm90IGJlIGFkZGVkIHRvIGl0c2VsZiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZWN0IGlmIHdlIGhhdmUgPGE+PGI+PGMvPjwvYj48L2E+IGFuZCBjLmFkZChhKQotICAgICAgICBpZiAoKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KSAmJgotICAgICAgICAgICAgICAgICgoRWxlbWVudCkgY2hpbGQpLmlzQW5jZXN0b3IoKEVsZW1lbnQpcGFyZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBFbGVtZW50IGNhbm5vdCBiZSBhZGRlZCBhcyBhIGRlc2NlbmRlbnQgb2YgaXRzZWxmIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD5zaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hpbGQuc2V0UGFyZW50KHBhcmVudCk7Ci0KLSAgICAgICAgZW5zdXJlQ2FwYWNpdHkoc2l6ZSsxKTsKLSAgICAgICAgaWYoIGluZGV4PT1zaXplICkgewotICAgICAgICAgICAgZWxlbWVudERhdGFbc2l6ZSsrXSA9IGNoaWxkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShlbGVtZW50RGF0YSwgaW5kZXgsIGVsZW1lbnREYXRhLCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgICAgICAgICBlbGVtZW50RGF0YVtpbmRleF0gPSBjaGlsZDsKLSAgICAgICAgICAgIHNpemUrKzsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIGNvbGxlY3RvbiB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0byB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0IHdhcyBtb2RpZmllZCBhcyBhIHJlc3VsdCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBhZGRBbGwoc2l6ZSgpLCBjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgY29sbGVjdG9uIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgICAqIFNoaWZ0cyB0aGUgb2JqZWN0IGN1cnJlbnRseSBhdCB0aGF0IHBvc2l0aW9uIChpZiBhbnkpIGFuZCBhbnkKLSAgICAgKiBzdWJzZXF1ZW50IG9iamVjdHMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IHRvIHN0YXJ0IGFkZGluZyB0aGUgZGF0YSBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc2VydCBpbnRvIHRoZSBsaXN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3Qgd2FzIG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWRkLgotICAgICAqIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD5zaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChjb2xsZWN0aW9uID09IG51bGwpIHx8IChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhcGFjaXR5KHNpemUoKSArIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGQoaW5kZXggKyBjb3VudCwgb2JqKTsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjdXJyZW50IGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50RGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIENvbnRlbnQgb2JqID0gZWxlbWVudERhdGFbaV07Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUGFyZW50KG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50RGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjdXJyZW50IGxpc3QgYW5kIHNldCBpdCB0byB0aGUgY29udGVudHMKLSAgICAgKiBvZiB0aGUgPGNvZGU+Q29sbGVjdGlvbjwvY29kZT4uCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gdXNlLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJBbmRTZXQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIENvbnRlbnRbXSBvbGQgPSBlbGVtZW50RGF0YTsKLSAgICAgICAgaW50IG9sZFNpemUgPSBzaXplOwotCi0gICAgICAgIGVsZW1lbnREYXRhID0gbnVsbDsKLSAgICAgICAgc2l6ZSA9IDA7Ci0KLSAgICAgICAgaWYgKChjb2xsZWN0aW9uICE9IG51bGwpICYmIChjb2xsZWN0aW9uLnNpemUoKSAhPSAwKSkgewotICAgICAgICAgICAgZW5zdXJlQ2FwYWNpdHkoY29sbGVjdGlvbi5zaXplKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhZGRBbGwoMCwgY29sbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50RGF0YSA9IG9sZDsKLSAgICAgICAgICAgICAgICBzaXplID0gb2xkU2l6ZTsKLSAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUGFyZW50KG9sZFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgPGNvZGU+Q29udGVudExpc3Q8L2NvZGU+IGluc3RhbmNlLAotICAgICAqIGlmIG5lY2Vzc2FyeSwgdG8gZW5zdXJlIHRoYXQgaXQgY2FuIGhvbGQgYXQgbGVhc3QgdGhlIG51bWJlciBvZgotICAgICAqIGl0ZW1zIHNwZWNpZmllZCBieSB0aGUgbWluaW11bSBjYXBhY2l0eSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtaW5DYXBhY2l0eSB0aGUgZGVzaXJlZCBtaW5pbXVtIGNhcGFjaXR5LgotICAgICAqLwotICAgIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG1pbkNhcGFjaXR5KSB7Ci0gICAgICAgIGlmKCBlbGVtZW50RGF0YT09bnVsbCApIHsKLSAgICAgICAgICAgIGVsZW1lbnREYXRhID0gbmV3IENvbnRlbnRbTWF0aC5tYXgobWluQ2FwYWNpdHksIElOSVRJQUxfQVJSQVlfU0laRSldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IG9sZENhcGFjaXR5ID0gZWxlbWVudERhdGEubGVuZ3RoOwotICAgICAgICAgICAgaWYgKG1pbkNhcGFjaXR5ID4gb2xkQ2FwYWNpdHkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2xkRGF0YVtdID0gZWxlbWVudERhdGE7Ci0gICAgICAgICAgICAgICAgaW50IG5ld0NhcGFjaXR5ID0gKG9sZENhcGFjaXR5ICogMykvMiArIDE7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0NhcGFjaXR5IDwgbWluQ2FwYWNpdHkpCi0gICAgICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0gbWluQ2FwYWNpdHk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudERhdGEgPSBuZXcgQ29udGVudFtuZXdDYXBhY2l0eV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGREYXRhLCAwLCBlbGVtZW50RGF0YSwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IG9mIHRoZSBvYmplY3QuCi0gICAgICogQHJldHVybiBUaGUgT2JqZWN0IHdoaWNoIHdhcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4PDAgfHwgaW5kZXg+PXNpemUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU2l6ZTogIiArIHNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnREYXRhW2luZGV4XTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2aWV3IG9mIHRoaXMgbGlzdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmlsdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlciA8Y29kZT5GaWx0ZXI8L2NvZGU+IGZvciB0aGlzIHZpZXcuCi0gICAgICogQHJldHVybiBhIGxpc3QgcmVwcmVzZW50aW5nIHRoZSBydWxlcyBvZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLSAgICAgKi8KLSAgICBMaXN0IGdldFZpZXcoRmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXR1cm4gbmV3IEZpbHRlckxpc3QoZmlsdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBFbGVtZW50IGluIHRoZSBsaXN0LiAgSWYgdGhlIHBhcmVudAotICAgICAqIGlzIGEgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IHRoZW4gdGhlIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgKiBJZiB0aGUgbGlzdCBjb250YWlucyBubyBFbGVtZW50cywgaXQgcmV0dXJucyAtMS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gaW5kZXggb2YgZmlyc3QgZWxlbWVudCwgb3IgLTEgaWYgb25lIGRvZXNuJ3QgZXhpc3QKLSAgICAgKi8KLSAgICBpbnQgaW5kZXhPZkZpcnN0RWxlbWVudCgpIHsKLSAgICAgICAgaWYoIGVsZW1lbnREYXRhIT1udWxsICkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudERhdGFbaV0gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgRG9jVHlwZSBlbGVtZW50IGluIHRoZSBsaXN0LiBJZiB0aGUgbGlzdCBjb250YWlucwotICAgICAqIG5vIERvY1R5cGUsIGl0IHJldHVybnMgLTEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgaW5kZXggb2YgdGhlIERvY1R5cGUsIG9yIC0xIGlmIGl0IGRvZXNuJ3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QKLSAgICAgKi8KLSAgICBpbnQgaW5kZXhPZkRvY1R5cGUoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50RGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YVtpXSBpbnN0YW5jZW9mIERvY1R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IG9mIHRoZSBvYmplY3QuCi0gICAgICogQHJldHVybiBUaGUgT2JqZWN0IHdoaWNoIHdhcyByZW1vdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD49c2l6ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotCi0gICAgICAgIENvbnRlbnQgb2xkID0gZWxlbWVudERhdGFbaW5kZXhdOwotICAgICAgICByZW1vdmVQYXJlbnQob2xkKTsKLSAgICAgICAgaW50IG51bU1vdmVkID0gc2l6ZSAtIGluZGV4IC0gMTsKLSAgICAgICAgaWYgKG51bU1vdmVkID4gMCkKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZWxlbWVudERhdGEsIGluZGV4KzEsIGVsZW1lbnREYXRhLCBpbmRleCxudW1Nb3ZlZCk7Ci0gICAgICAgIGVsZW1lbnREYXRhWy0tc2l6ZV0gPSBudWxsOyAvLyBMZXQgZ2MgZG8gaXRzIHdvcmsKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIG9sZDsKLSAgICB9Ci0KLQotICAgIC8qKiBSZW1vdmUgdGhlIHBhcmVudCBvZiBhIE9iamVjdCAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlUGFyZW50KENvbnRlbnQgYykgewotICAgICAgICBjLnNldFBhcmVudChudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHRvIHRoZSBzdXBwbGllZAotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgbG9jYXRpb24gdG8gc2V0IHRoZSB2YWx1ZSB0by4KLSAgICAgKiBAcGFyYW0gb2JqIFRoZSBsb2NhdGlvbiB0byBzZXQgdGhlIHZhbHVlIHRvLgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCB3aGljaCB3YXMgcmVwbGFjZWQuCi0gICAgICogdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoaW5kZXg8MCB8fCBpbmRleD49c2l6ZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBzaXplKCkpOwotCi0gICAgICAgIGlmICgob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgaW50IHJvb3QgPSBpbmRleE9mRmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoKHJvb3QgPj0gMCkgJiYgKHJvb3QgIT0gaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAiQ2Fubm90IGFkZCBhIHNlY29uZCByb290IGVsZW1lbnQsIG9ubHkgb25lIGlzIGFsbG93ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgob2JqIGluc3RhbmNlb2YgRG9jVHlwZSkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgaW50IGRvY1R5cGVJbmRleCA9IGluZGV4T2ZEb2NUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoKGRvY1R5cGVJbmRleCA+PSAwKSAmJiAoZG9jVHlwZUluZGV4ICE9IGluZGV4KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhZGQgYSBzZWNvbmQgZG9jdHlwZSwgb25seSBvbmUgaXMgYWxsb3dlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG9sZCA9IHJlbW92ZShpbmRleCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGQoaW5kZXgsIG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBhZGQoaW5kZXgsIG9sZCk7Ci0gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9sZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGxpc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBsaXN0IGFzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKiogR2l2ZSBhY2Nlc3Mgb2YgQ29udGVudExpc3QubW9kQ291bnQgdG8gRmlsdGVyTGlzdCAqLwotICAgIHByaXZhdGUgaW50IGdldE1vZENvdW50KCkgewotICAgICAgICByZXR1cm4gbW9kQ291bnQ7Ci0gICAgfQotCi0gICAgLyogKiAqICogKiAqICogKiAqICogKiAqICogRmlsdGVyTGlzdCAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotICAgIC8qICogKiAqICogKiAqICogKiAqICogKiAqIEZpbHRlckxpc3QgKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLQotICAgIC8qKgotICAgICAqIDxjb2RlPkZpbHRlckxpc3Q8L2NvZGU+IHJlcHJlc2VudHMgbGVnYWwgSkRPTSBjb250ZW50LCBpbmNsdWRpbmcgY29udGVudAotICAgICAqIGZvciA8Y29kZT5Eb2N1bWVudDwvY29kZT5zIG9yIDxjb2RlPkVsZW1lbnQ8L2NvZGU+cy4KLSAgICAgKi8KLQotICAgIGNsYXNzIEZpbHRlckxpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICAgICAgLyoqIFRoZSBGaWx0ZXIgKi8KLSAgICAgICAgRmlsdGVyIGZpbHRlcjsKLQotICAgICAgICAvKiogQ3VycmVudCBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyB2aWV3ICovCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgLyoqIEV4cGVjdGVkIG1vZENvdW50IGluIG91ciBiYWNraW5nIGxpc3QgKi8KLSAgICAgICAgaW50IGV4cGVjdGVkID0gLTE7Ci0KLSAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gTm90ZTogRGlyZWN0bHkgYWZ0ZXIgc2l6ZSgpIGlzIGNhbGxlZCwgZXhwZWN0ZWQKLSAgICAgICAgLy8gICAgICAgaXMgc3luYydkIHdpdGggQ29udGVudExpc3QubW9kQ291bnQgYW5kIGNvdW50IHByb3ZpZGVzCi0gICAgICAgIC8vICAgICAgIHRoZSB0cnVlIHNpemUgb2YgdGhpcyB2aWV3LiAgQmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvCi0gICAgICAgIC8vICAgICAgIHNpemUoKSBvciBpZiB0aGUgYmFja2luZyBsaXN0IGlzIG1vZGlmaWVkIG91dHNpZGUgdGhpcwotICAgICAgICAvLyAgICAgICBGaWx0ZXJMaXN0LCBib3RoIG1pZ2h0IGNvbnRhaW4gYm9ndXMgdmFsdWVzIGFuZCBzaG91bGQKLSAgICAgICAgLy8gICAgICAgbm90IGJlIHVzZWQgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHNpemUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBGaWx0ZXJMaXN0IHdpdGggdGhlIHNwZWNpZmllZCBGaWx0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBGaWx0ZXJMaXN0KEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuCi0gICAgICAgICAqIFNoaWZ0cyB0aGUgb2JqZWN0IGN1cnJlbnRseSBhdCB0aGF0IHBvc2l0aW9uIChpZiBhbnkpIGFuZCBhbnkKLSAgICAgICAgICogc3Vic2VxdWVudCBvYmplY3RzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgbG9jYXRpb24gdG8gc2V0IHRoZSB2YWx1ZSB0by4KLSAgICAgICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGluc2VydCBpbnRvIHRoZSBsaXN0LgotICAgICAgICAgKiB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCA8IDAgfHwgaW5kZXggPiBzaXplKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhvYmopKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFkanVzdGVkID0gZ2V0QWRqdXN0ZWRJbmRleChpbmRleCk7Ci0gICAgICAgICAgICAgICAgQ29udGVudExpc3QudGhpcy5hZGQoYWRqdXN0ZWQsIG9iaik7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWQrKzsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiRmlsdGVyIHdvbid0IGFsbG93IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnIiArIG9iaiArICInIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgb2Zmc2V0IG9mIHRoZSBvYmplY3QuCi0gICAgICAgICAqIEByZXR1cm4gVGhlIE9iamVjdCB3aGljaCB3YXMgcmV0dXJuZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBhZGp1c3RlZCA9IGdldEFkanVzdGVkSW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRMaXN0LnRoaXMuZ2V0KGFkanVzdGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyTGlzdEl0ZXJhdG9yKGZpbHRlciwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyTGlzdEl0ZXJhdG9yKGZpbHRlciwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyTGlzdEl0ZXJhdG9yKGZpbHRlciwgIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBvZmZzZXQgb2YgdGhlIG9iamVjdC4KLSAgICAgICAgICogQHJldHVybiBUaGUgT2JqZWN0IHdoaWNoIHdhcyByZW1vdmVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgYWRqdXN0ZWQgPSBnZXRBZGp1c3RlZEluZGV4KGluZGV4KTsKLSAgICAgICAgICAgIE9iamVjdCBvbGQgPSBDb250ZW50TGlzdC50aGlzLmdldChhZGp1c3RlZCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2xkKSkgewotICAgICAgICAgICAgICAgIG9sZCA9IENvbnRlbnRMaXN0LnRoaXMucmVtb3ZlKGFkanVzdGVkKTsKLSAgICAgICAgICAgICAgICBleHBlY3RlZCsrOwotICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiRmlsdGVyIHdvbid0IGFsbG93IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGQuZ2V0Q2xhc3MoKSkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJyIgKyBvbGQgKyAiJyAoaW5kZXggIiArIGluZGV4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHRvIGJlIHJlbW92ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB0byB0aGUgc3VwcGxpZWQKLSAgICAgICAgICogb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGxvY2F0aW9uIHRvIHNldCB0aGUgdmFsdWUgdG8uCi0gICAgICAgICAqIEBwYXJhbSBvYmogVGhlIGxvY2F0aW9uIHRvIHNldCB0aGUgdmFsdWUgdG8uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCB3aGljaCB3YXMgcmVwbGFjZWQuCi0gICAgICAgICAqIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgT2JqZWN0IG9sZCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2JqKSkgewotICAgICAgICAgICAgICAgIGludCBhZGp1c3RlZCA9IGdldEFkanVzdGVkSW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgICAgIG9sZCA9IENvbnRlbnRMaXN0LnRoaXMuZ2V0KGFkanVzdGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbHRlci5tYXRjaGVzKG9sZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkZpbHRlciB3b24ndCBhbGxvdyB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkLmdldENsYXNzKCkpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICciICsgb2xkICsgIicgKGluZGV4ICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB0byBiZSByZW1vdmVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9sZCA9IENvbnRlbnRMaXN0LnRoaXMuc2V0KGFkanVzdGVkLCBvYmopOwotICAgICAgICAgICAgICAgIGV4cGVjdGVkICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiRmlsdGVyIHdvbid0IGFsbG93IGluZGV4ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICsgIiB0byBiZSBzZXQgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iai5nZXRDbGFzcygpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGxpc3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIE5vdGU6IERpcmVjdGx5IGFmdGVyIHNpemUoKSBpcyBjYWxsZWQsIGV4cGVjdGVkCi0gICAgICAgICAgICAvLyAgICAgICBpcyBzeW5jJ2Qgd2l0aCBDb250ZW50TGlzdC5tb2RDb3VudCBhbmQgY291bnQgcHJvdmlkZXMKLSAgICAgICAgICAgIC8vICAgICAgIHRoZSB0cnVlIHNpemUgb2YgdGhpcyB2aWV3LiAgQmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvCi0gICAgICAgICAgICAvLyAgICAgICBzaXplKCkgb3IgaWYgdGhlIGJhY2tpbmcgbGlzdCBpcyBtb2RpZmllZCBvdXRzaWRlIHRoaXMKLSAgICAgICAgICAgIC8vICAgICAgIEZpbHRlckxpc3QsIGJvdGggbWlnaHQgY29udGFpbiBib2d1cyB2YWx1ZXMgYW5kIHNob3VsZAotICAgICAgICAgICAgLy8gICAgICAgbm90IGJlIHVzZWQgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHNpemUoKTsKLQotICAgICAgICAgICAgaWYgKGV4cGVjdGVkID09IENvbnRlbnRMaXN0LnRoaXMuZ2V0TW9kQ291bnQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb250ZW50TGlzdC50aGlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IENvbnRlbnRMaXN0LnRoaXMuZWxlbWVudERhdGFbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKG9iaikpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHBlY3RlZCA9IENvbnRlbnRMaXN0LnRoaXMuZ2V0TW9kQ291bnQoKTsKLSAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIGFkanVzdGVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiBpbiB0aGlzIHZpZXcuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpbmRleCBpbiBiYWNraW5nIGxpc3QKLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIHByaXZhdGUgaW50IGdldEFkanVzdGVkSW5kZXgoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgYWRqdXN0ZWQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb250ZW50TGlzdC50aGlzLnNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBDb250ZW50TGlzdC50aGlzLmVsZW1lbnREYXRhW2ldOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhvYmopKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBhZGp1c3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCA9PSBhZGp1c3RlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb250ZW50TGlzdC50aGlzLnNpemU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBDb250ZW50TGlzdC50aGlzLnNpemUgKyAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKiAqICogKiAqICogKiAqICogKiAqICogRmlsdGVyTGlzdEl0ZXJhdG9yICogKiAqICogKiAqICogKiAqICogKiAqLwotICAgIC8qICogKiAqICogKiAqICogKiAqICogKiAqIEZpbHRlckxpc3RJdGVyYXRvciAqICogKiAqICogKiAqICogKiAqICogKi8KLQotICAgIGNsYXNzIEZpbHRlckxpc3RJdGVyYXRvciBpbXBsZW1lbnRzIExpc3RJdGVyYXRvciB7Ci0KLSAgICAgICAgLyoqIFRoZSBGaWx0ZXIgdGhhdCBhcHBsaWVzICovCi0gICAgICAgIEZpbHRlciBmaWx0ZXI7Ci0KLSAgICAgICAgLyoqIFRoZSBsYXN0IG9wZXJhdGlvbiBwZXJmb3JtZWQgKi8KLSAgICAgICAgaW50IGxhc3RPcGVyYXRpb247Ci0KLSAgICAgICAgLyoqIEluaXRpYWwgc3RhcnQgaW5kZXggaW4gYmFja2luZyBsaXN0ICovCi0gICAgICAgIGludCBpbml0aWFsQ3Vyc29yOwotCi0gICAgICAgIC8qKiBJbmRleCBpbiBiYWNraW5nIGxpc3Qgb2YgbmV4dCBvYmplY3QgKi8KLSAgICAgICAgaW50IGN1cnNvcjsKLQotICAgICAgICAvKiogSW5kZXggaW4gYmFja2luZyBsaXN0IG9mIGxhc3Qgb2JqZWN0IHJldHVybmVkICovCi0gICAgICAgIGludCBsYXN0OwotCi0gICAgICAgIC8qKiBFeHBlY3RlZCBtb2RDb3VudCBpbiBvdXIgYmFja2luZyBsaXN0ICovCi0gICAgICAgIGludCBleHBlY3RlZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgRmlsdGVyTGlzdEl0ZXJhdG9yKEZpbHRlciBmaWx0ZXIsIGludCBzdGFydCkgewotICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgICAgICAgICBpbml0aWFsQ3Vyc29yID0gaW5pdGlhbGl6ZUN1cnNvcihzdGFydCk7Ci0gICAgICAgICAgICBsYXN0ID0gLTE7Ci0gICAgICAgICAgICBleHBlY3RlZCA9IENvbnRlbnRMaXN0LnRoaXMuZ2V0TW9kQ291bnQoKTsKLSAgICAgICAgICAgIGxhc3RPcGVyYXRpb24gPSBDUkVBVEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGxpc3QgaXRlcmF0b3IgaGFzIGEgbmV4dCBlbGVtZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbigpOwotCi0gICAgICAgICAgICBzd2l0Y2gobGFzdE9wZXJhdGlvbikgewotICAgICAgICAgICAgY2FzZSBDUkVBVEU6ICBjdXJzb3IgPSBpbml0aWFsQ3Vyc29yOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUFJFVjogICAgY3Vyc29yID0gbGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFERDoKLSAgICAgICAgICAgIGNhc2UgTkVYVDogICAgY3Vyc29yID0gbW92ZUZvcndhcmQobGFzdCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVNT1ZFOiAgY3Vyc29yID0gbW92ZUZvcndhcmQobGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQVNQUkVWOiBjdXJzb3IgPSBtb3ZlRm9yd2FyZChjdXJzb3IgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhBU05FWFQ6IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGFzdE9wZXJhdGlvbiAhPSBDUkVBVEUpIHsKLSAgICAgICAgICAgICAgICBsYXN0T3BlcmF0aW9uID0gSEFTTkVYVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIChjdXJzb3IgPCBDb250ZW50TGlzdC50aGlzLnNpemUoKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gY3Vyc29yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IENvbnRlbnRMaXN0LnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RPcGVyYXRpb24gPSBORVhUOwotICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRMaXN0LnRoaXMuZ2V0KGxhc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBsaXN0IGl0ZXJhdG9yIGhhcyBtb3JlCi0gICAgICAgICAqIGVsZW1lbnRzIHdoZW4gdHJhdmVyc2luZyB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLSAgICAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbigpOwotCi0gICAgICAgICAgICBzd2l0Y2gobGFzdE9wZXJhdGlvbikgewotICAgICAgICAgICAgY2FzZSBDUkVBVEU6ICBjdXJzb3IgPSBpbml0aWFsQ3Vyc29yOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IENvbnRlbnRMaXN0LnRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID49IHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9IG1vdmVCYWNrd2FyZChzaXplIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBSRVY6Ci0gICAgICAgICAgICBjYXNlIFJFTU9WRTogIGN1cnNvciA9IG1vdmVCYWNrd2FyZChsYXN0IC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQVNORVhUOiBjdXJzb3IgPSBtb3ZlQmFja3dhcmQoY3Vyc29yIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBREQ6Ci0gICAgICAgICAgICBjYXNlIE5FWFQ6ICAgIGN1cnNvciA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQVNQUkVWOiBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxhc3RPcGVyYXRpb24gIT0gQ1JFQVRFKSB7Ci0gICAgICAgICAgICAgICAgbGFzdE9wZXJhdGlvbiA9IEhBU1BSRVY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoY3Vyc29yIDwgMCkgPyBmYWxzZSA6IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7Ci0gICAgICAgICAgICBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKGhhc1ByZXZpb3VzKCkpIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gY3Vyc29yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IC0xOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RPcGVyYXRpb24gPSBQUkVWOwotICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRMaXN0LnRoaXMuZ2V0KGxhc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgYQotICAgICAgICAgKiBzdWJzZXF1ZW50IGNhbGwgdG8gPGNvZGU+bmV4dDwvY29kZT4uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgaGFzTmV4dCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb250ZW50TGlzdC50aGlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKENvbnRlbnRMaXN0LnRoaXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBjdXJzb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4cGVjdGVkID0gQ29udGVudExpc3QudGhpcy5nZXRNb2RDb3VudCgpOwotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgYQotICAgICAgICAgKiBzdWJzZXF1ZW50IGNhbGwgdG8gPGNvZGU+cHJldmlvdXM8L2NvZGU+LiAoUmV0dXJucyAtMSBpZiB0aGUKLSAgICAgICAgICogbGlzdCBpdGVyYXRvciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoaGFzUHJldmlvdXMoKSkgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb250ZW50TGlzdC50aGlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhDb250ZW50TGlzdC50aGlzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGN1cnNvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKG9iaikpIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gY3Vyc29yICsgMTsKLSAgICAgICAgICAgICAgICBDb250ZW50TGlzdC50aGlzLmFkZChsYXN0LCBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkZpbHRlciB3b24ndCBhbGxvdyBhZGQgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iai5nZXRDbGFzcygpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwZWN0ZWQgPSBDb250ZW50TGlzdC50aGlzLmdldE1vZENvdW50KCk7Ci0gICAgICAgICAgICBsYXN0T3BlcmF0aW9uID0gQUREOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgZnJvbSB0aGUgbGlzdCB0aGUgbGFzdCBlbGVtZW50IHRoYXQgd2FzIHJldHVybmVkIGJ5Ci0gICAgICAgICAqIDxjb2RlPm5leHQ8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzPC9jb2RlPi4KLSAgICAgICAgICogdGhlIGxhc3QgY2FsbCB0byA8Y29kZT5uZXh0PC9jb2RlPiBvciA8Y29kZT5wcmV2aW91czwvY29kZT4uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKChsYXN0IDwgMCkgfHwgKGxhc3RPcGVyYXRpb24gPT0gUkVNT1ZFKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHByZWNlZWRpbmcgY2FsbCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmV2KCkgb3IgbmV4dCgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsYXN0T3BlcmF0aW9uID09IEFERCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBjYWxsIHJlbW92ZSgpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIGFkZCgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBvbGQgPSBDb250ZW50TGlzdC50aGlzLmdldChsYXN0KTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhvbGQpKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudExpc3QudGhpcy5yZW1vdmUobGFzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKCJGaWx0ZXIgd29uJ3QgYWxsb3cgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkLmdldENsYXNzKCkpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChpbmRleCAiICsgbGFzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB0byBiZSByZW1vdmVkIik7Ci0gICAgICAgICAgICBleHBlY3RlZCA9IENvbnRlbnRMaXN0LnRoaXMuZ2V0TW9kQ291bnQoKTsKLSAgICAgICAgICAgIGxhc3RPcGVyYXRpb24gPSBSRU1PVkU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwbGFjZXMgdGhlIGxhc3QgZWxlbWVudCByZXR1cm5lZCBieSA8Y29kZT5uZXh0PC9jb2RlPiBvcgotICAgICAgICAgKiA8Y29kZT5wcmV2aW91czwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmICgobGFzdE9wZXJhdGlvbiA9PSBBREQpIHx8IChsYXN0T3BlcmF0aW9uID09IFJFTU9WRSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgY2FsbCBzZXQoKSBhZnRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGQoKSBvciByZW1vdmUoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGFzdCA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyBwcmVjZWVkaW5nIGNhbGwgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJldigpIG9yIG5leHQoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2JqKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvbGQgPSBDb250ZW50TGlzdC50aGlzLmdldChsYXN0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbHRlci5tYXRjaGVzKG9sZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBZGRFeGNlcHRpb24oIkZpbHRlciB3b24ndCBhbGxvdyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkLmdldENsYXNzKCkpLmdldE5hbWUoKSArICIgKGluZGV4ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgKyAiKSB0byBiZSByZW1vdmVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnRlbnRMaXN0LnRoaXMuc2V0KGxhc3QsIG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbigiRmlsdGVyIHdvbid0IGFsbG93IGluZGV4ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgKyAiIHRvIGJlIHNldCB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqLmdldENsYXNzKCkpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4cGVjdGVkID0gQ29udGVudExpc3QudGhpcy5nZXRNb2RDb3VudCgpOwotICAgICAgICAgICAgLy8gRG9uJ3Qgc2V0IGxhc3RPcGVyYXRpb24KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGluZGV4IGluIHRoZSBiYWNraW5nIGxpc3QgYnkgbW92aW5nIGZvcndhcmQgc3RhcnQKLSAgICAgICAgICogb2JqZWN0cyB0aGF0IG1hdGNoIG91ciBmaWx0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGludCBpbml0aWFsaXplQ3Vyc29yKGludCBzdGFydCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIHN0YXJ0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ29udGVudExpc3QudGhpcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBDb250ZW50TGlzdC50aGlzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2JqKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBjb3VudCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIHN0YXJ0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNpemU6ICIgKyBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBDb250ZW50TGlzdC50aGlzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGluZGV4IGluIHRoZSBiYWNraW5nIGxpc3Qgb2YgdGhlIG5leHQgb2JqZWN0IG1hdGNoaW5nCi0gICAgICAgICAqIG91ciBmaWx0ZXIsIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBpbmRleCBhbmQgbW92aW5nIGZvcndhcmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgbW92ZUZvcndhcmQoaW50IHN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgQ29udGVudExpc3QudGhpcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBDb250ZW50TGlzdC50aGlzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2JqKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ29udGVudExpc3QudGhpcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBpbmRleCBpbiB0aGUgYmFja2luZyBsaXN0IG9mIHRoZSBuZXh0IG9iamVjdCBtYXRjaGluZwotICAgICAgICAgKiBvdXIgZmlsdGVyLCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXggYW5kIG1vdmluZyBiYWNrd2FyZHMuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGludCBtb3ZlQmFja3dhcmQoaW50IHN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPj0gQ29udGVudExpc3QudGhpcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9IENvbnRlbnRMaXN0LnRoaXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBDb250ZW50TGlzdC50aGlzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMob2JqKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2sgaWYgYXJlIGJhY2tpbmcgbGlzdCBpcyBiZWluZyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uKCkgewotICAgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IENvbnRlbnRMaXN0LnRoaXMuZ2V0TW9kQ291bnQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0RhdGFDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0RhdGFDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTkzMGIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9EYXRhQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyotLSAKLQotICRJZDogRGF0YUNvbnZlcnNpb25FeGNlcHRpb24uamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE5IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIFRocm93biB3aGVuIGEgZGF0YSBjb252ZXJzaW9uIGZyb20gYSBzdHJpbmcgdG8gdmFsdWUgdHlwZSBmYWlscywgc3VjaCBhcwotICogY2FuIGhhcHBlbiB3aXRoIHRoZSB7QGxpbmsgQXR0cmlidXRlfSBjb252ZW5pZW5jZSBnZXR0ZXIgZnVuY3Rpb25zLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0YUNvbnZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBKRE9NRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdoZXJlIHRoZSBuYW1lZCBjb25zdHJ1Y3QgY291bGRuJ3QgYmUgY29udmVydGVkCi0gICAgICogdG8gdGhlIG5hbWVkIGRhdGEgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGNvbnN0cnVjdCB3aG9zZSB2YWx1ZSBmYWlsZWQgY29udmVyc2lvbgotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0eXBlIHRoZSBjb252ZXJzaW9uIHdhcyBhdHRlbXB0aW5nIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHB1YmxpYyBEYXRhQ29udmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGFUeXBlKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgWE1MIGNvbnN0cnVjdCAiKQotICAgICAgICAgICAgICAuYXBwZW5kKG5hbWUpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIiBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvIGEgIikKLSAgICAgICAgICAgICAgLmFwcGVuZChkYXRhVHlwZSkKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRGVmYXVsdEpET01GYWN0b3J5LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0RlZmF1bHRKRE9NRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDdmMWU1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRGVmYXVsdEpET01GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyotLQotCi0gJElkOiBEZWZhdWx0SkRPTUZhY3RvcnkuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb207Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgSkRPTSBjbGFzc2VzIChFbGVtZW50LCBEb2N1bWVudCwgQ29tbWVudCwKLSAqIGV0YykuIEEgc3ViY2xhc3Mgb2YgdGhpcyBmYWN0b3J5IG1pZ2h0IGNvbnN0cnVjdCBjdXN0b20gY2xhc3Nlcy4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAYXV0aG9yICBLZW4gUnVuZSBIb2xsYW5kCi0gKiBAYXV0aG9yICBQaGlsIE5lbHNvbgotICogQGF1dGhvciAgQnJhZGxleSBTLiBIdWZmbWFuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SkRPTUZhY3RvcnkgaW1wbGVtZW50cyBKRE9NRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAiQCgjKSAkUkNTZmlsZTogRGVmYXVsdEpET01GYWN0b3J5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTggJCAkTmFtZTogICQiOwotCi0gICAgcHVibGljIERlZmF1bHRKRE9NRmFjdG9yeSgpIHsgfQotCi0gICAgLy8gQWxsb3cgSmF2YWRvY3MgdG8gaW5oZXJpdCBmcm9tIEpET01GYWN0b3J5Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGUgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0eXBlLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGUgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGUgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ0RBVEEgY2RhdGEoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDREFUQSh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGV4dCB0ZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWVudCBjb21tZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tbWVudCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jVHlwZSBkb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRG9jVHlwZShlbGVtZW50TmFtZSwgcHVibGljSUQsIHN5c3RlbUlEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jVHlwZSBkb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRG9jVHlwZShlbGVtZW50TmFtZSwgc3lzdGVtSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2NUeXBlIGRvY1R5cGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRG9jVHlwZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGRvY3VtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQsIERvY1R5cGUgZG9jVHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50KHJvb3RFbGVtZW50LCBkb2NUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCwgRG9jVHlwZSBkb2NUeXBlLCBTdHJpbmcgYmFzZVVSSSkgewotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50KHJvb3RFbGVtZW50LCBkb2NUeXBlLCBiYXNlVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCkgewotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50KHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBlbGVtZW50KFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KG5hbWUsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQobmFtZSwgcHJlZml4LCB1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlSZWYobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50aXR5UmVmKG5hbWUsIHB1YmxpY0lELCBzeXN0ZW1JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBzeXN0ZW1JRCkgewotICAgICAgICByZXR1cm4gbmV3IEVudGl0eVJlZihuYW1lLCBzeXN0ZW1JRCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gTGlzdCBtYW5pcHVsYXRpb24KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnQoUGFyZW50IHBhcmVudCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICgoRG9jdW1lbnQpIHBhcmVudCkuYWRkQ29udGVudChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAoKEVsZW1lbnQpIHBhcmVudCkuYWRkQ29udGVudChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoRWxlbWVudCBwYXJlbnQsIEF0dHJpYnV0ZSBhKSB7Ci0gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoYSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oRWxlbWVudCBwYXJlbnQsIE5hbWVzcGFjZSBhZGRpdGlvbmFsKSB7Ci0gICAgICAgIHBhcmVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihhZGRpdGlvbmFsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0Rlc2NlbmRhbnRJdGVyYXRvci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9EZXNjZW5kYW50SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjZGI3MC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0Rlc2NlbmRhbnRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qLS0KLQotICRJZDogRGVzY2VuZGFudEl0ZXJhdG9yLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmpkb20uQ29udGVudDsKLWltcG9ydCBvcmcuamRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy5qZG9tLlBhcmVudDsKLQotLyoqCi0gKiBUcmF2ZXJzZSBhbGwgYSBwYXJlbnQncyBkZXNjZW5kYW50cyAoYWxsIGNoaWxkcmVuIGF0IGFueSBsZXZlbCBiZWxvdwotICogdGhlIHBhcmVudCkuCi0gKgotICogQGF1dGhvciBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEBhdXRob3IgSmFzb24gSHVudGVyCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKi8KLWNsYXNzIERlc2NlbmRhbnRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgIHByaXZhdGUgSXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgcHJpdmF0ZSBJdGVyYXRvciBuZXh0SXRlcmF0b3I7Ci0gICAgcHJpdmF0ZSBMaXN0IHN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAgICAgICAiQCgjKSAkUkNTZmlsZTogRGVzY2VuZGFudEl0ZXJhdG9yLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTggJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogSXRlcmF0b3IgZm9yIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCBkb2N1bWVudCBvciBlbGVtZW50IHdob3NlIGRlc2NlbmRhbnRzIHdpbGwgYmUgaXRlcmF0ZWQKLSAgICAgKi8KLSAgICBEZXNjZW5kYW50SXRlcmF0b3IoUGFyZW50IHBhcmVudCkgewotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudCBwYXJhbWV0ZXIgd2FzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLml0ZXJhdG9yID0gcGFyZW50LmdldENvbnRlbnQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZT4gaWYgdGhlIGl0ZXJhdGlvbiBoYXMgbW9yZSB7QGxpbmsgQ29udGVudH0gZGVzY2VuZGFudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaXMgdGhlIGl0ZXJhdG9yIGhhcyBtb3JlIGRlc2NlbmRhbnRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yICE9IG51bGwgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG5leHRJdGVyYXRvciAhPSBudWxsICYmIG5leHRJdGVyYXRvci5oYXNOZXh0KCkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoc3RhY2tIYXNBbnlOZXh0KCkpIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCB7QGxpbmsgQ29udGVudH0gZGVzY2VuZGFudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5leHQgZGVzY2VuZGFudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIGRlc2NlbmQsIGdvIGZvciBpdCBhbmQgcmVjb3JkIHdoZXJlIHdlIGFyZS4KLSAgICAgICAgLy8gV2UgZG8gdGhlIHNodWZmbGUgaGVyZSBvbiB0aGUgbmV4dCBuZXh0KCkgY2FsbCBzbyByZW1vdmUoKSBpcyBlYXN5Ci0gICAgICAgIC8vIHRvIGNvZGUgdXAuCi0gICAgICAgIGlmIChuZXh0SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcHVzaChpdGVyYXRvcik7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG5leHRJdGVyYXRvcjsKLSAgICAgICAgICAgIG5leHRJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGlzIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCB0cnkgbW92aW5nIHVwIHRoZSBzdGFjawotICAgICAgICB3aGlsZSAoIWl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKHN0YWNrLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpdGVyYXRvciA9IHBvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJTb21laG93IHdlIGxvc3Qgb3VyIGl0ZXJhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50IGNoaWxkID0gKENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgbmV4dEl0ZXJhdG9yID0gKChFbGVtZW50KWNoaWxkKS5nZXRDb250ZW50KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0YWNoZXMgdGhlIGxhc3Qge0BsaW5rIG9yZy5qZG9tLkNvbnRlbnR9IHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8KLSAgICAgKiBuZXh0IGZyb20gaXQncyBwYXJlbnQuICA8Yj5Ob3RlPC9iPjogdGhpcyA8Yj5kb2VzIG5vdDwvYj4gYWZmZWN0Ci0gICAgICogaXRlcmF0aW9uIGFuZCBhbGwgY2hpbGRyZW4sIHNpYmxpbmdzLCBhbmQgYW55IG5vZGUgZm9sbG93aW5nIHRoZQotICAgICAqIHJlbW92ZWQgbm9kZSAoaW4gZG9jdW1lbnQgb3JkZXIpIHdpbGwgYmUgdmlzaXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSXRlcmF0b3IgcG9wKCkgewotICAgICAgICBpbnQgc3RhY2tTaXplID0gc3RhY2suc2l6ZSgpOwotICAgICAgICBpZiAoc3RhY2tTaXplID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJlbXB0eSBzdGFjayIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoSXRlcmF0b3IpIHN0YWNrLnJlbW92ZShzdGFja1NpemUgLSAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHVzaChJdGVyYXRvciBpdHIpIHsKLSAgICAgICAgc3RhY2suYWRkKGl0cik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YWNrSGFzQW55TmV4dCgpIHsKLSAgICAgICAgaW50IHNpemUgPSBzdGFjay5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdHIgPSAoSXRlcmF0b3IpIHN0YWNrLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRG9jVHlwZS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Eb2NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTM0NjguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Eb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyotLQotCi0gJElkOiBEb2NUeXBlLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIEFuIFhNTCBET0NUWVBFIGRlY2xhcmF0aW9uLiAgTWV0aG9kIGFsbG93IHRoZSB1c2VyIHRvIGdldCBhbmQgc2V0IHRoZQotICogcm9vdCBlbGVtZW50IG5hbWUsIHB1YmxpYyBpZCwgYW5kIHN5c3RlbSBpZC4KLSAqCi0gKiBAYXV0aG9yIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgSmFzb24gSHVudGVyCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NUeXBlIGV4dGVuZHMgQ29udGVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICJAKCMpICRSQ1NmaWxlOiBEb2NUeXBlLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTggJCAkTmFtZTogICQiOwotCi0gICAgLyoqIFRoZSBlbGVtZW50IGJlaW5nIGNvbnN0cmFpbmVkICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TmFtZTsKLQotICAgIC8qKiBUaGUgcHVibGljIElEIG9mIHRoZSBET0NUWVBFICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRDsKLQotICAgIC8qKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBET0NUWVBFICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRDsKLQotICAgIC8qKiBUaGUgaW50ZXJuYWwgc3Vic2V0IG9mIHRoZSBET0NUWVBFICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpbnRlcm5hbFN1YnNldDsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQsIG5vLWFyZ3MgY29uc3RydWN0b3IgZm9yIGltcGxlbWVudGF0aW9ucyB0byB1c2UgaWYgbmVlZGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2NUeXBlKCkge30KLQotICAgIC8qCi0gICAgICogWFhYOgotICAgICAqICAgV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgZW50aXRpZXMgYW5kIG5vdGF0aW9ucyBoZXJlLgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lIGFuZCBhIHJlZmVyZW5jZSB0byBhbgotICAgICAqIGV4dGVybmFsIERURC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YKLSAgICAgKiAgICAgICAgZWxlbWVudCBiZWluZyBjb25zdHJhaW5lZC4KLSAgICAgKiBAcGFyYW0gcHVibGljSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBwdWJsaWMgSUQgb2YKLSAgICAgKiAgICAgICAgcmVmZXJlbmNlZCBEVEQKLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBzeXN0ZW0gSUQgb2YKLSAgICAgKiAgICAgICAgcmVmZXJlbmNlZCBEVEQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzeXN0ZW0gSUQgaXMgbm90IGEgbGVnYWwKLSAgICAgKiAgICAgICAgIHN5c3RlbSBsaXRlcmFsIG9yIHRoZSBwdWJsaWMgSUQgaXMgbm90IGEgbGVnYWwgcHVibGljIElELgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJvb3QgZWxlbWVudCBuYW1lIGlzIG5vdCBhCi0gICAgICogICAgICAgICBsZWdhbCBYTUwgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBEb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLSAgICAgICAgc2V0RWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICBzZXRQdWJsaWNJRChwdWJsaWNJRCk7Ci0gICAgICAgIHNldFN5c3RlbUlEKHN5c3RlbUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIHRoZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiB3aXRoCi0gICAgICogdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUgYW5kIHJlZmVyZW5jZSB0byBhbgotICAgICAqIGV4dGVybmFsIERURC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YKLSAgICAgKiAgICAgICAgZWxlbWVudCBiZWluZyBjb25zdHJhaW5lZC4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBzeXN0ZW0gSUQgb2YKLSAgICAgKiAgICAgICAgcmVmZXJlbmNlZCBEVEQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzeXN0ZW0gSUQgaXMgbm90IGEgbGVnYWwKLSAgICAgKiAgICAgICAgIHN5c3RlbSBsaXRlcmFsLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJvb3QgZWxlbWVudCBuYW1lIGlzIG5vdCBhCi0gICAgICogICAgICAgICBsZWdhbCBYTUwgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBEb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIHRoaXMoZWxlbWVudE5hbWUsIG51bGwsIHN5c3RlbUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIHRoZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiB3aXRoCi0gICAgICogdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YKLSAgICAgKiAgICAgICAgZWxlbWVudCBiZWluZyBjb25zdHJhaW5lZC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByb290IGVsZW1lbnQgbmFtZSBpcyBub3QgYQotICAgICAqICAgICAgICAgbGVnYWwgWE1MIGVsZW1lbnQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jVHlwZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgICAgICAgdGhpcyhlbGVtZW50TmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSBlbGVtZW50IG5hbWUgYmVpbmcgY29uc3RyYWluZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBlbGVtZW50IG5hbWUgZm9yIERPQ1RZUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgcm9vdCBlbGVtZW50IG5hbWUgZGVjbGFyZWQgYnkgdGhpcwotICAgICAqIERPQ1RZUEUgZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIERvY1R5cGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gdGhpcyBEb2NUeXBlIG9iamVjdAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YKLSAgICAgKiAgICAgICAgcm9vdCBlbGVtZW50IGJlaW5nIGNvbnN0cmFpbmVkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJvb3QgZWxlbWVudCBuYW1lIGlzIG5vdCBhCi0gICAgICogICAgICAgICBsZWdhbCBYTUwgZWxlbWVudCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBEb2NUeXBlIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICAvLyBUaGlzIGNhbiBjb250YWluIGEgY29sb24gc28gd2UgdXNlIGNoZWNrWE1MTmFtZSgpCi0gICAgICAgIC8vIGluc3RlYWQgb2YgY2hlY2tFbGVtZW50TmFtZSgpCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1hNTE5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbihlbGVtZW50TmFtZSwgIkRvY1R5cGUiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSBwdWJsaWMgSUQgb2YgYW4gZXh0ZXJuYWxseQotICAgICAqIHJlZmVyZW5jZWQgRFRELCBvciBhbiBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IGlmCi0gICAgICogbm9uZSBpcyByZWZlcmVuY2VkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gcHVibGljIElEIG9mIHJlZmVyZW5jZWQgRFRELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0gICAgICAgIHJldHVybiBwdWJsaWNJRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSBwdWJsaWMgSUQgb2YgYW4gZXh0ZXJuYWxseQotICAgICAqIHJlZmVyZW5jZWQgRFRELgotICAgICAqCi0gICAgICogQHBhcmFtIHB1YmxpY0lEIGlkIHRvIHNldAotICAgICAqIEByZXR1cm4gRG9jVHlwZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiB0aGlzIERvY1R5cGUgb2JqZWN0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcHVibGljIElEIGlzIG5vdCBhIGxlZ2FsCi0gICAgICogICAgICAgICBwdWJsaWMgSUQuCi0gICAgICovCi0gICAgcHVibGljIERvY1R5cGUgc2V0UHVibGljSUQoU3RyaW5nIHB1YmxpY0lEKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1B1YmxpY0lEKHB1YmxpY0lEKTsKLSAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24ocHVibGljSUQsICJEb2NUeXBlIiwgcmVhc29uKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnB1YmxpY0lEID0gcHVibGljSUQ7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSBzeXN0ZW0gSUQgb2YgYW4gZXh0ZXJuYWxseQotICAgICAqIHJlZmVyZW5jZWQgRFRELCBvciBhbiBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IGlmCi0gICAgICogbm9uZSBpcyByZWZlcmVuY2VkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gc3lzdGVtIElEIG9mIHJlZmVyZW5jZWQgRFRELgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0gICAgICAgIHJldHVybiBzeXN0ZW1JRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSBzeXN0ZW0gSUQgb2YgYW4gZXh0ZXJuYWxseQotICAgICAqIHJlZmVyZW5jZWQgRFRELgotICAgICAqCi0gICAgICogQHBhcmFtIHN5c3RlbUlEIGlkIHRvIHNldAotICAgICAqIEByZXR1cm4gc3lzdGVtSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBzeXN0ZW0gSUQgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgRFRELgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHN5c3RlbSBJRCBpcyBub3QgYSBsZWdhbAotICAgICAqICAgICAgICAgc3lzdGVtIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIERvY1R5cGUgc2V0U3lzdGVtSUQoU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1N5c3RlbUxpdGVyYWwoc3lzdGVtSUQpOwotICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbihzeXN0ZW1JRCwgIkRvY1R5cGUiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgc2luY2UgZG9jdHlwZXMgZG9uJ3QgaGF2ZSBhbiBYUGF0aAotICAgICAqIDEuMCBzdHJpbmcgdmFsdWUuCi0gICAgICogQHJldHVybiB0aGUgZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuICIiOyAgLy8gZG9jdHlwZXMgZG9uJ3QgaGF2ZSBhbiBYUGF0aCBzdHJpbmcgdmFsdWUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgdGhlIGRhdGEgZm9yIHRoZSBpbnRlcm5hbCBzdWJzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3RGF0YSBkYXRhIGZvciB0aGUgaW50ZXJuYWwgc3Vic2V0LCBhcyBhCi0gICAgICogICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIG5ld0RhdGEpIHsKLSAgICAgICAgaW50ZXJuYWxTdWJzZXQgPSBuZXdEYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIGludGVybmFsIHN1YnNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIHRoZSBpbnRlcm5hbCBzdWJzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotICAgICAgICByZXR1cm4gaW50ZXJuYWxTdWJzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5Eb2NUeXBlPC9jb2RlPiwgc3VpdGFibGUgZm9yIGRlYnVnZ2luZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAqICAgICAgICAgPGNvZGU+RG9jVHlwZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAuYXBwZW5kKCJbRG9jVHlwZTogIikKLSAgICAgICAgICAgIC5hcHBlbmQobmV3IG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXIoKS5vdXRwdXRTdHJpbmcodGhpcykpCi0gICAgICAgICAgICAuYXBwZW5kKCJdIikKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRG9jdW1lbnQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlODlkNy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjcgKzAsMCBAQAotLyotLQotCi0gJElkOiBEb2N1bWVudC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTkgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5qZG9tLmZpbHRlci4qOwotCi0vKioKLSAqIEFuIFhNTCBkb2N1bWVudC4gTWV0aG9kcyBhbGxvdyBhY2Nlc3MgdG8gdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsIGFzIHRoZQotICoge0BsaW5rIERvY1R5cGV9IGFuZCBvdGhlciBkb2N1bWVudC1sZXZlbCBpbmZvcm1hdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIEpvb2xzIEVudGlja25hcAotICogQGF1dGhvciAgQnJhZGxleSBTLiBIdWZmbWFuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudCBpbXBsZW1lbnRzIFBhcmVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICJAKCMpICRSQ1NmaWxlOiBEb2N1bWVudC5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZG9jdW1lbnQncyBjb250ZW50IGluY2x1ZGluZyBjb21tZW50cywgUElzLCBhIHBvc3NpYmxlCi0gICAgICogRG9jVHlwZSwgYW5kIGEgcm9vdCBlbGVtZW50LgotICAgICAqIFN1YmNsYXNzZXJzIGhhdmUgdG8gdHJhY2sgY29udGVudCB1c2luZyB0aGVpciBvd24KLSAgICAgKiBtZWNoYW5pc20uCi0gICAgICovCi0gICAgQ29udGVudExpc3QgY29udGVudCA9IG5ldyBDb250ZW50TGlzdCh0aGlzKTsKLQotICAgIC8qKgotICAgICAqICBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDMwMjI2L2NvcmUuaHRtbCNiYXNlVVJJcy1Db25zaWRlcmF0aW9ucwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZVVSSSA9IG51bGw7Ci0KLSAgICAvLyBTdXBwb3J0cyB0aGUgc2V0UHJvcGVydHkvZ2V0UHJvcGVydHkgY2FsbHMKLSAgICBwcml2YXRlIEhhc2hNYXAgcHJvcGVydHlNYXAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBkb2N1bWVudC4gIEEgZG9jdW1lbnQgbXVzdCBoYXZlIGEgcm9vdCBlbGVtZW50LAotICAgICAqIHNvIHRoaXMgZG9jdW1lbnQgd2lsbCBub3QgYmUgd2VsbC1mb3JtZWQgYW5kIGFjY2Vzc29yIG1ldGhvZHMgd2lsbAotICAgICAqIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGRvY3VtZW50IGlzIGFjY2Vzc2VkIGJlZm9yZSBhCi0gICAgICogcm9vdCBlbGVtZW50IGlzIGFkZGVkLiAgVGhpcyBtZXRob2QgaXMgbW9zdCB1c2VmdWwgZm9yIGJ1aWxkIHRvb2xzLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkRvY3VtZW50PC9jb2RlPiwKLSAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+Ci0gICAgICogYXMgdGhlIHJvb3QgZWxlbWVudCwgdGhlIHN1cHBsaWVkCi0gICAgICogPGNvZGU+e0BsaW5rIERvY1R5cGV9PC9jb2RlPiBkZWNsYXJhdGlvbiwgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBiYXNlIFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb290RWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiBmb3IgZG9jdW1lbnQgcm9vdC4KLSAgICAgKiBAcGFyYW0gZG9jVHlwZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gYmFzZVVSSSB0aGUgVVJJIGZyb20gd2hpY2ggdGhpcyBkb3VjbWVudCB3YXMgbG9hZGVkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gZG9jVHlwZSBvYmplY3QKLSAgICAgKiAgICAgICAgIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCBvciB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgIHJvb3RFbGVtZW50IGFscmVhZHkgaGFzIGEgcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQsIERvY1R5cGUgZG9jVHlwZSwgU3RyaW5nIGJhc2VVUkkpIHsKLSAgICAgICAgaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFJvb3RFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREb2NUeXBlKGRvY1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEJhc2VVUkkoYmFzZVVSSSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkRvY3VtZW50PC9jb2RlPiwKLSAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+Ci0gICAgICogYXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgdGhlIHN1cHBsaWVkCi0gICAgICogPGNvZGU+e0BsaW5rIERvY1R5cGV9PC9jb2RlPiBkZWNsYXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb290RWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiBmb3IgZG9jdW1lbnQgcm9vdC4KLSAgICAgKiBAcGFyYW0gZG9jVHlwZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiBkZWNsYXJhdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIERvY1R5cGUgb2JqZWN0Ci0gICAgICogICAgICAgICBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgZG9jdW1lbnQgb3IgdGhlIGdpdmVuCi0gICAgICogICAgICAgICByb290RWxlbWVudCBhbHJlYWR5IGhhcyBhIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudChFbGVtZW50IHJvb3RFbGVtZW50LCBEb2NUeXBlIGRvY1R5cGUpIHsKLSAgICAgICAgdGhpcyhyb290RWxlbWVudCwgZG9jVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5Eb2N1bWVudDwvY29kZT4sCi0gICAgICogd2l0aCB0aGUgc3VwcGxpZWQgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPgotICAgICAqIGFzIHRoZSByb290IGVsZW1lbnQsIGFuZCBubyA8Y29kZT57QGxpbmsgRG9jVHlwZX08L2NvZGU+Ci0gICAgICogZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gZm9yIGRvY3VtZW50IHJvb3QKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJvb3RFbGVtZW50IGFscmVhZHkgaGFzCi0gICAgICogICAgICAgICBhIHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCkgewotICAgICAgICB0aGlzKHJvb3RFbGVtZW50LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkRvY3VtZW50PC9jb2RlPiwKLSAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCBsaXN0IG9mIGNvbnRlbnQsIGFuZCBhCi0gICAgICogPGNvZGU+e0BsaW5rIERvY1R5cGV9PC9jb2RlPiBkZWNsYXJhdGlvbiBvbmx5IGlmIHRoZSBjb250ZW50Ci0gICAgICogY29udGFpbnMgYSBEb2NUeXBlIGluc3RhbmNlLiAgQSBudWxsIGxpc3QgaXMgdHJlYXRlZCB0aGUKLSAgICAgKiBzYW1lIGFzIHRoZSBuby1hcmcgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudCA8Y29kZT5MaXN0PC9jb2RlPiBvZiBzdGFydGVyIGNvbnRlbnQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIExpc3QgY29udGFpbnMgbW9yZSB0aGFuCi0gICAgICogICAgICAgICBvbmUgRWxlbWVudCBvciBvYmplY3RzIG9mIGlsbGVnYWwgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50KExpc3QgY29udGVudCkgewotICAgICAgICBzZXRDb250ZW50KGNvbnRlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50LnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoQ29udGVudCBjaGlsZCkgewotICAgICAgICByZXR1cm4gY29udGVudC5pbmRleE9mKGNoaWxkKTsKLSAgICB9Ci0KLS8vICAgIC8qKgotLy8gICAgICogU3RhcnRpbmcgYXQgdGhlIGdpdmVuIGluZGV4IChpbmNsdXNpdmUpLCByZXR1cm4gdGhlIGluZGV4IG9mCi0vLyAgICAgKiB0aGUgZmlyc3QgY2hpbGQgbWF0Y2hpbmcgdGhlIHN1cHBsaWVkIGZpbHRlciwgb3IgLTEKLS8vICAgICAqIGlmIG5vbmUgaXMgZm91bmQuCi0vLyAgICAgKgotLy8gICAgICogQHJldHVybiBpbmRleCBvZiBjaGlsZCwgb3IgLTEgaWYgbm9uZSBmb3VuZC4KLS8vICAgICAqLwotLy8gICAgcHJpdmF0ZSBpbnQgaW5kZXhPZihpbnQgc3RhcnQsIEZpbHRlciBmaWx0ZXIpIHsKLS8vICAgICAgICBpbnQgc2l6ZSA9IGdldENvbnRlbnRTaXplKCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc2l6ZTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhnZXRDb250ZW50KGkpKSkgewotLy8gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIC0xOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGRvY3VtZW50IGhhcyBhCi0gICAgICogcm9vdCBlbGVtZW50LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGRvY3VtZW50IGhhcyBhIHJvb3QgZWxlbWVudCwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUm9vdEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoY29udGVudC5pbmRleE9mRmlyc3RFbGVtZW50KCkgPCAwKSA/IGZhbHNlIDogdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSByb290IDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICAgICogZm9yIHRoaXMgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IC0gdGhlIGRvY3VtZW50J3Mgcm9vdCBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRSb290RWxlbWVudCgpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY29udGVudC5pbmRleE9mRmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJvb3QgZWxlbWVudCBub3Qgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBjb250ZW50LmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzZXRzIHRoZSByb290IDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4gZm9yIHRoZQotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4gSWYgdGhlIGRvY3VtZW50IGFscmVhZHkgaGFzIGEgcm9vdAotICAgICAqIGVsZW1lbnQsIGl0IGlzIHJlcGxhY2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRvIGJlIG5ldyByb290LgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gbW9kaWZpZWQgRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByb290RWxlbWVudCBhbHJlYWR5IGhhcwotICAgICAqICAgICAgICAgYSBwYXJlbnQuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IHNldFJvb3RFbGVtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY29udGVudC5pbmRleE9mRmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGNvbnRlbnQuYWRkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0KGluZGV4LCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0YWNoIHRoZSByb290IDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4gZnJvbSB0aGlzIGRvY3VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiByZW1vdmVkIHJvb3QgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBkZXRhY2hSb290RWxlbWVudCgpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY29udGVudC5pbmRleE9mRmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSByZW1vdmVDb250ZW50KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSA8Y29kZT57QGxpbmsgRG9jVHlwZX08L2NvZGU+Ci0gICAgICogZGVjbGFyYXRpb24gZm9yIHRoaXMgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+LCBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZXhpc3RzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2NUeXBlPC9jb2RlPiAtIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBEb2NUeXBlIGdldERvY1R5cGUoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZkRvY1R5cGUoKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKERvY1R5cGUpIGNvbnRlbnQuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIDxjb2RlPntAbGluayBEb2NUeXBlfTwvY29kZT4KLSAgICAgKiBkZWNsYXJhdGlvbiBmb3IgdGhpcyA8Y29kZT5Eb2N1bWVudDwvY29kZT4uIE5vdGUKLSAgICAgKiB0aGF0IGEgRG9jVHlwZSBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBvbmUgRG9jdW1lbnQuCi0gICAgICogQXR0ZW1wdGluZyB0byBzZXQgdGhlIERvY1R5cGUgdG8gYSBEb2NUeXBlIG9iamVjdAotICAgICAqIHRoYXQgYWxyZWFkeSBiZWxvbmdzIHRvIGEgRG9jdW1lbnQgd2lsbCByZXN1bHQgaW4gYW4KLSAgICAgKiBJbGxlZ2FsQWRkRXhjZXB0aW9uIGJlaW5nIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2NUeXBlIDxjb2RlPkRvY1R5cGU8L2NvZGU+IGRlY2xhcmF0aW9uLgotICAgICAqIEByZXR1cm4gb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGRvY1R5cGUgaXMKLSAgICAgKiAgIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBEb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgc2V0RG9jVHlwZShEb2NUeXBlIGRvY1R5cGUpIHsKLSAgICAgICAgaWYgKGRvY1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBleGlzdGluZyBkb2N0eXBlCi0gICAgICAgICAgICBpbnQgZG9jVHlwZUluZGV4ID0gY29udGVudC5pbmRleE9mRG9jVHlwZSgpOwotICAgICAgICAgICAgaWYgKGRvY1R5cGVJbmRleCA+PSAwKSBjb250ZW50LnJlbW92ZShkb2NUeXBlSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9jVHlwZS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFkZEV4Y2VwdGlvbihkb2NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBEb2NUeXBlIGFscmVhZHkgaXMgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIERvY1R5cGUgdG8gaGVhZCBpZiBuZXcsIHJlcGxhY2Ugb2xkIG90aGVyd2lzZQotICAgICAgICBpbnQgZG9jVHlwZUluZGV4ID0gY29udGVudC5pbmRleE9mRG9jVHlwZSgpOwotICAgICAgICBpZiAoZG9jVHlwZUluZGV4IDwgMCkgewotICAgICAgICAgICAgY29udGVudC5hZGQoMCwgZG9jVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50LnNldChkb2NUeXBlSW5kZXgsIGRvY1R5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgY2hpbGQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNoaWxkICAgY2hpbGQgdG8gYXBwZW5kIHRvIGVuZCBvZiBjb250ZW50IGxpc3QKLSAgICAgKiBAcmV0dXJuICAgICAgICB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgYWRkQ29udGVudChDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIGNvbnRlbnQuYWRkKGNoaWxkKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhbGwgY2hpbGRyZW4gaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZgotICAgICAqIHRoZSBjb250ZW50IGxpc3QuICBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gZHVyaW5nIGFkZCB0aGUKLSAgICAgKiBvcmlnaW5hbCBjb250ZW50IHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCB0aGUgb2JqZWN0cyBpbiB0aGUgc3VwcGxpZWQKLSAgICAgKiBjb2xsZWN0aW9uIHdpbGwgYmUgdW5hbHRlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgICBjb2xsZWN0aW9uIHRvIGFwcGVuZAotICAgICAqIEByZXR1cm4gICAgdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGNhbGxlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiBhbnkgaXRlbSBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqICAgICAgICAgYWxyZWFkeSBoYXMgYSBwYXJlbnQgb3IgaXMgb2YgYW4gaWxsZWdhbCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBhZGRDb250ZW50KENvbGxlY3Rpb24gYykgewotICAgICAgICBjb250ZW50LmFkZEFsbChjKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgY2hpbGQgaW50byB0aGUgY29udGVudCBsaXN0IGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBsb2NhdGlvbiBmb3IgYWRkaW5nIHRoZSBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGNoaWxkICAgICAgY2hpbGQgdG8gaW5zZXJ0Ci0gICAgICogQHJldHVybiAgICAgICAgICAgdGhlIHBhcmVudCBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggaXMgbmVnYXRpdmUgb3IgYmV5b25kCi0gICAgICogICAgICAgICB0aGUgY3VycmVudCBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGNoaWxkIGFscmVhZHkgaGFzIGEgcGFyZW50LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBhZGRDb250ZW50KGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBjb250ZW50LmFkZChpbmRleCwgY2hpbGQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBjb250ZW50IGluIGEgY29sbGVjdGlvbiBpbnRvIHRoZSBjb250ZW50IGxpc3QKLSAgICAgKiBhdCB0aGUgZ2l2ZW4gaW5kZXguICBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQKLSAgICAgKiB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgdGhlIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkIGNvbGxlY3Rpb24gd2lsbCBiZQotICAgICAqIHVuYWx0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBsb2NhdGlvbiBmb3IgYWRkaW5nIHRoZSBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGMgIGNvbGxlY3Rpb24gdG8gaW5zZXJ0Ci0gICAgICogQHJldHVybiAgICAgICAgICAgIHRoZSBwYXJlbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGJleW9uZAotICAgICAqICAgICAgICAgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIGFueSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICBhbHJlYWR5IGhhcyBhIHBhcmVudCBvciBpcyBvZiBhbiBpbGxlZ2FsIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGFkZENvbnRlbnQoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLSAgICAgICAgY29udGVudC5hZGRBbGwoaW5kZXgsIGMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBjbG9uZUNvbnRlbnQoKSB7Ci0gICAgICAgIGludCBzaXplID0gZ2V0Q29udGVudFNpemUoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnQgY2hpbGQgPSBnZXRDb250ZW50KGkpOwotICAgICAgICAgICAgbGlzdC5hZGQoY2hpbGQuY2xvbmUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnQgZ2V0Q29udGVudChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChDb250ZW50KSBjb250ZW50LmdldChpbmRleCk7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgQ29udGVudCBnZXRDaGlsZChGaWx0ZXIgZmlsdGVyKSB7Ci0vLyAgICAgICAgaW50IGkgPSBpbmRleE9mKDAsIGZpbHRlcik7Ci0vLyAgICAgICAgcmV0dXJuIChpIDwgMCkgPyBudWxsIDogZ2V0Q29udGVudChpKTsKLS8vICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gYWxsIGNvbnRlbnQgZm9yIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4uCi0gICAgICogVGhlIHJldHVybmVkIGxpc3QgaXMgImxpdmUiIGluIGRvY3VtZW50IG9yZGVyIGFuZCBjaGFuZ2VzIHRvIGl0Ci0gICAgICogYWZmZWN0IHRoZSBkb2N1bWVudCdzIGFjdHVhbCBjb250ZW50LgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogU2VxdWVudGlhbCB0cmF2ZXJzYWwgdGhyb3VnaCB0aGUgTGlzdCBpcyBiZXN0IGRvbmUgd2l0aCBhIEl0ZXJhdG9yCi0gICAgICogc2luY2UgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50IG9mIExpc3Quc2l6ZSgpIG1heSByZXF1aXJlIHdhbGtpbmcgdGhlCi0gICAgICogZW50aXJlIGxpc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiAtIGFsbCBEb2N1bWVudCBjb250ZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb250ZW50KCkgewotICAgICAgICBpZiAoIWhhc1Jvb3RFbGVtZW50KCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSb290IGVsZW1lbnQgbm90IHNldCIpOwotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBmaWx0ZXJlZCB2aWV3IG9mIHRoaXMgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+J3MgY29udGVudC4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFNlcXVlbnRpYWwgdHJhdmVyc2FsIHRocm91Z2ggdGhlIExpc3QgaXMgYmVzdCBkb25lIHdpdGggYSBJdGVyYXRvcgotICAgICAqIHNpbmNlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudCBvZiBMaXN0LnNpemUoKSBtYXkgcmVxdWlyZSB3YWxraW5nIHRoZQotICAgICAqIGVudGlyZSBsaXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXIgPGNvZGU+RmlsdGVyPC9jb2RlPiB0byBhcHBseQotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4gLSBmaWx0ZXJlZCBEb2N1bWVudCBjb250ZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb250ZW50KEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgaWYgKCFoYXNSb290RWxlbWVudCgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUm9vdCBlbGVtZW50IG5vdCBzZXQiKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQuZ2V0VmlldyhmaWx0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGNoaWxkIGNvbnRlbnQgZnJvbSB0aGlzIHBhcmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgb2xkIGNoaWxkcmVuIGRldGFjaGVkIGZyb20gdGhpcyBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCByZW1vdmVDb250ZW50KCkgewotICAgICAgICBMaXN0IG9sZCA9IG5ldyBBcnJheUxpc3QoY29udGVudCk7Ci0gICAgICAgIGNvbnRlbnQuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIG9sZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIGNoaWxkIGNvbnRlbnQgZnJvbSB0aGlzIHBhcmVudCBtYXRjaGluZyB0aGUgc3VwcGxpZWQgZmlsdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlciBmaWx0ZXIgdG8gc2VsZWN0IHdoaWNoIGNvbnRlbnQgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBvbGQgY2hpbGRyZW4gZGV0YWNoZWQgZnJvbSB0aGlzIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHJlbW92ZUNvbnRlbnQoRmlsdGVyIGZpbHRlcikgewotICAgICAgICBMaXN0IG9sZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gY29udGVudC5nZXRWaWV3KGZpbHRlcikuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENvbnRlbnQgY2hpbGQgPSAoQ29udGVudCkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIG9sZC5hZGQoY2hpbGQpOwotICAgICAgICAgICAgaXRyLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzZXRzIHRoZSBjb250ZW50IG9mIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4uICBUaGUgc3VwcGxpZWQKLSAgICAgKiBMaXN0IHNob3VsZCBjb250YWluIG9ubHkgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+LAotICAgICAqIDxjb2RlPkNvbW1lbnQ8L2NvZGU+LCBhbmQgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYWxsIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkIExpc3QgYXJlIGxlZ2FsIGFuZCBiZWZvcmUgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgaXMgYWRkZWQsIGFsbCBvYmplY3RzIGluIHRoZSBvbGQgY29udGVudCB3aWxsIGhhdmUgdGhlaXIKLSAgICAgKiBwYXJlbnRhZ2Ugc2V0IHRvIG51bGwgKG5vIHBhcmVudCkgYW5kIHRoZSBvbGQgY29udGVudCBsaXN0IHdpbGwgYmUKLSAgICAgKiBjbGVhcmVkLiBUaGlzIGhhcyB0aGUgZWZmZWN0IHRoYXQgYW55IGFjdGl2ZSBsaXN0IChwcmV2aW91c2x5IG9idGFpbmVkCi0gICAgICogd2l0aCBhIGNhbGwgdG8ge0BsaW5rICNnZXRDb250ZW50fSkgd2lsbCBhbHNvCi0gICAgICogY2hhbmdlIHRvIHJlZmxlY3QgdGhlIG5ldyBjb250ZW50LiAgSW4gYWRkaXRpb24sIGFsbCBvYmplY3RzIGluIHRoZQotICAgICAqIHN1cHBsaWVkIExpc3Qgd2lsbCBoYXZlIHRoZWlyIHBhcmVudGFnZSBzZXQgdG8gdGhpcyBkb2N1bWVudCwgYnV0IHRoZQotICAgICAqIExpc3QgaXRzZWxmIHdpbGwgbm90IGJlICJsaXZlIiBhbmQgZnVydGhlciByZW1vdmFscyBhbmQgYWRkaXRpb25zIHdpbGwKLSAgICAgKiBoYXZlIG5vIGVmZmVjdCBvbiB0aGlzIGRvY3VtZW50IGNvbnRlbnQuIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlCi0gICAgICogd29ya2luZyB3aXRoIGEgImxpdmUiIGxpc3QsIHRoZW4gYSBjYWxsIHRvIHNldENvbnRlbnQgc2hvdWxkIGJlCi0gICAgICogZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHtAbGluayAjZ2V0Q29udGVudH0gdG8KLSAgICAgKiBvYnRhaW4gYSAibGl2ZSIgdmVyc2lvbiBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBQYXNzaW5nIGEgbnVsbCBvciBlbXB0eSBMaXN0IGNsZWFycyB0aGUgZXhpc3RpbmcgY29udGVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2lsbCBiZSB1bmNoYW5nZWQgYW5kCi0gICAgICogdGhlIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkIGNvbnRlbnQgd2lsbCBiZSB1bmFsdGVyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld0NvbnRlbnQgPGNvZGU+TGlzdDwvY29kZT4gb2YgY29udGVudCB0byBzZXQKLSAgICAgKiBAcmV0dXJuIHRoaXMgZG9jdW1lbnQgbW9kaWZpZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIExpc3QgY29udGFpbnMgb2JqZWN0cyBvZgotICAgICAqICAgICAgICAgaWxsZWdhbCB0eXBlcyBvciB3aXRoIGV4aXN0aW5nIHBhcmVudGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgc2V0Q29udGVudChDb2xsZWN0aW9uIG5ld0NvbnRlbnQpIHsKLSAgICAgICAgY29udGVudC5jbGVhckFuZFNldChuZXdDb250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBTZXRzIHRoZSBlZmZlY3RpdmUgVVJJIGZyb20gd2hpY2ggdGhpcyBkb2N1bWVudCB3YXMgbG9hZGVkLAotICAgICAqIGFuZCBhZ2FpbnN0IHdoaWNoIHJlbGF0aXZlIFVSTHMgaW4gdGhpcyBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgdGhlIGJhc2UgVVJJIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRCYXNlVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgdGhpcy5iYXNlVVJJID0gdXJpOyAgLy8gWFhYIFdlIGRvbid0IGNoZWNrIHRoZSBVUkkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiAgIFJldHVybnMgdGhlIFVSSSBmcm9tIHdoaWNoIHRoaXMgZG9jdW1lbnQgd2FzIGxvYWRlZCwKLSAgICAgKiAgIG9yIG51bGwgaWYgdGhpcyBpcyBub3Qga25vd24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYmFzZSBVUkkgb2YgdGhpcyBkb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VVUkk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXBsYWNlIHRoZSBjdXJyZW50IGNoaWxkIHRoZSBnaXZlbiBpbmRleCB3aXRoIHRoZSBzdXBwbGllZCBjaGlsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2lsbCBiZSB1bmNoYW5nZWQgYW5kCi0gICAgICogdGhlIHN1cHBsaWVkIGNoaWxkIHdpbGwgYmUgdW5hbHRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCAtIGluZGV4IG9mIGNoaWxkIHRvIHJlcGxhY2UuCi0gICAgICogQHBhcmFtIGNoaWxkIC0gY2hpbGQgdG8gYWRkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgY2hpbGQgaXMgYWxyZWFkeSBhdHRhY2hlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgbGVnYWwgY29udGVudCBmb3IgdGhpcyBwYXJlbnQuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIKLSAgICAgKiAgICAgICAgIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBzZXRDb250ZW50KGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBjb250ZW50LnNldChpbmRleCwgY2hpbGQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIHRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggd2hpdGggdGhlIHN1cHBsaWVkCi0gICAgICogY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2lsbCBiZSB1bmNoYW5nZWQgYW5kCi0gICAgICogdGhlIGNvbnRlbnQgaW4gdGhlIHN1cHBsaWVkIGNvbGxlY3Rpb24gd2lsbCBiZSB1bmFsdGVyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgY2hpbGQgdG8gcmVwbGFjZS4KLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiAtIGNvbGxlY3Rpb24gb2YgY29udGVudCB0byBhZGQuCi0gICAgICogQHJldHVybiBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgaW52b2tlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBvYmplY3RzIG9mCi0gICAgICogICAgICAgICBpbGxlZ2FsIHR5cGVzLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBuZWdhdGl2ZSBvciBncmVhdGVyCi0gICAgICogICAgICAgICB0aGFuIHRoZSBjdXJyZW50IG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgc2V0Q29udGVudChpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotICAgICAgICBjb250ZW50LnJlbW92ZShpbmRleCk7Ci0gICAgICAgIGNvbnRlbnQuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29udGVudChDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50LnJlbW92ZShjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnQgcmVtb3ZlQ29udGVudChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChDb250ZW50KSBjb250ZW50LnJlbW92ZShpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBjb250ZW50IHRvIGJlIHRoZSBzdXBwbGllZCBjaGlsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgc3VwcGxpZWQgY2hpbGQgaXMgbGVnYWwgY29udGVudCBmb3IgYSBEb2N1bWVudCBhbmQgYmVmb3JlCi0gICAgICogaXQgaXMgYWRkZWQsIGFsbCBjb250ZW50IGluIHRoZSBjdXJyZW50IGNvbnRlbnQgbGlzdCB3aWxsCi0gICAgICogYmUgY2xlYXJlZCBhbmQgYWxsIGN1cnJlbnQgY2hpbGRyZW4gd2lsbCBoYXZlIHRoZWlyIHBhcmVudGFnZSBzZXQgdG8KLSAgICAgKiBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3QgdGhhdCBhbnkgYWN0aXZlIGxpc3QgKHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aAotICAgICAqIGEgY2FsbCB0byBvbmUgb2YgdGhlIHtAbGluayAjZ2V0Q29udGVudH0gbWV0aG9kcyB3aWxsIGFsc28gY2hhbmdlCi0gICAgICogdG8gcmVmbGVjdCB0aGUgbmV3IGNvbnRlbnQuICBJbiBhZGRpdGlvbiwgYWxsIGNvbnRlbnQgaW4gdGhlIHN1cHBsaWVkCi0gICAgICogY29sbGVjdGlvbiB3aWxsIGhhdmUgdGhlaXIgcGFyZW50YWdlIHNldCB0byB0aGlzIERvY3VtZW50LiAgSWYgdGhlIHVzZXIKLSAgICAgKiB3YW50cyB0byBjb250aW51ZSB3b3JraW5nIHdpdGggYSA8Yj4ibGl2ZSI8L2I+IGxpc3Qgb2YgdGhpcyBEb2N1bWVudCdzCi0gICAgICogY2hpbGQsIHRoZW4gYSBjYWxsIHRvIHNldENvbnRlbnQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBvbmUKLSAgICAgKiBvZiB0aGUge0BsaW5rICNnZXRDb250ZW50fSBtZXRob2RzIHRvIG9idGFpbiBhIDxiPiJsaXZlIjwvYj4KLSAgICAgKiB2ZXJzaW9uIG9mIHRoZSBjaGlsZHJlbi4KLSAgICAgKiA8cD4KLSAgICAgKiBQYXNzaW5nIGEgbnVsbCBjaGlsZCBjbGVhcnMgdGhlIGV4aXN0aW5nIGNvbnRlbnQuCi0gICAgICogPHA+Ci0gICAgICogSW4gZXZlbnQgb2YgYW4gZXhjZXB0aW9uIHRoZSBvcmlnaW5hbCBjb250ZW50IHdpbGwgYmUgdW5jaGFuZ2VkIGFuZAotICAgICAqIHRoZSBzdXBwbGllZCBjaGlsZCB3aWxsIGJlIHVuYWx0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGlsZCBuZXcgY29udGVudCB0byByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICB0aGUgcGFyZW50IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGNhbGxlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgY2hpbGQgaXMgYWxyZWFkeSBhdHRhY2hlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgbGVnYWwgY29udGVudCBmb3IgdGhpcyBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgc2V0Q29udGVudChDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIGNvbnRlbnQuY2xlYXIoKTsKLSAgICAgICAgY29udGVudC5hZGQoY2hpbGQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPiwgc3VpdGFibGUgZm9yIGRlYnVnZ2luZy4gSWYgdGhlIFhNTAotICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaXMgZGVzaXJlZCwKLSAgICAgKiB7QGxpbmsgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlciNvdXRwdXRTdHJpbmcoRG9jdW1lbnQpfQotICAgICAqIHNob3VsZCBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICogICAgICAgICA8Y29kZT5Eb2N1bWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nRm9ybSA9IG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgLmFwcGVuZCgiW0RvY3VtZW50OiAiKTsKLQotICAgICAgICBEb2NUeXBlIGRvY1R5cGUgPSBnZXREb2NUeXBlKCk7Ci0gICAgICAgIGlmIChkb2NUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmluZ0Zvcm0uYXBwZW5kKGRvY1R5cGUudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyaW5nRm9ybS5hcHBlbmQoIiBObyBET0NUWVBFIGRlY2xhcmF0aW9uLCAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBnZXRSb290RWxlbWVudCgpOwotICAgICAgICBpZiAocm9vdEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RyaW5nRm9ybS5hcHBlbmQoIlJvb3QgaXMgIikKLSAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJvb3RFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyaW5nRm9ybS5hcHBlbmQoIiBObyByb290IGVsZW1lbnQiKTsgLy8gc2hvdWxkbid0IGhhcHBlbgotICAgICAgICB9Ci0KLSAgICAgICAgc3RyaW5nRm9ybS5hcHBlbmQoIl0iKTsKLQotICAgICAgICByZXR1cm4gc3RyaW5nRm9ybS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdHMgZm9yIGVxdWFsaXR5IG9mIHRoaXMgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IHRvIHRoZSBzdXBwbGllZAotICAgICAqIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2IgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBjb21wYXJlIHRvCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aGV0aGVyIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgIGVxdWFsIHRvIHRoZSBzdXBwbGllZCA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYikgewotICAgICAgICByZXR1cm4gKG9iID09IHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+aW50PC9jb2RlPiBoYXNoIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIGEgZGVlcCBjbG9uZSBvZiB0aGlzIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+T2JqZWN0PC9jb2RlPiBjbG9uZSBvZiB0aGlzIDxjb2RlPkRvY3VtZW50PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvYyA9IChEb2N1bWVudCkgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIC8vIENhbid0IGhhcHBlbgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGNsb25lIGhhcyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCdzIGNvbnRlbnQgbGlzdCwgc28KLSAgICAgICAgLy8gb3dlcndyaXRlIHdpdGggYSBlbXB0eSBsaXN0Ci0gICAgICAgIGRvYy5jb250ZW50ID0gbmV3IENvbnRlbnRMaXN0KGRvYyk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBjbG9uZWQgY29udGVudCB0byBjbG9uZQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnRlbnQuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkoKEVsZW1lbnQpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGRvYy5jb250ZW50LmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLSAgICAgICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCkoKENvbW1lbnQpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGRvYy5jb250ZW50LmFkZChjb21tZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilvYmopLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgZG9jLmNvbnRlbnQuYWRkKHBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERvY1R5cGUpIHsKLSAgICAgICAgICAgICAgICBEb2NUeXBlIGR0ID0gKERvY1R5cGUpICgoRG9jVHlwZSlvYmopLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgZG9jLmNvbnRlbnQuYWRkKGR0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgYWxsIGRlc2NlbmRhbnRzIGluIGRvY3VtZW50IG9yZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciB0byB3YWxrIGRlc2NlbmRhbnRzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCkgewotICAgICAgICByZXR1cm4gbmV3IERlc2NlbmRhbnRJdGVyYXRvcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciBhbGwgZGVzY2VuZGFudHMgaW4gZG9jdW1lbnQgb3JkZXIKLSAgICAgKiBhcHBseWluZyB0aGUgRmlsdGVyIHRvIHJldHVybiBvbmx5IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciBydWxlLgotICAgICAqIFdpdGggZmlsdGVycyB5b3UgY2FuIG1hdGNoIG9ubHkgRWxlbWVudHMsIG9ubHkgQ29tbWVudHMsIEVsZW1lbnRzIG9yCi0gICAgICogQ29tbWVudHMsIG9ubHkgRWxlbWVudHMgd2l0aCBhIGdpdmVuIG5hbWUgYW5kL29yIHByZWZpeCwgYW5kIHNvIG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlciBmaWx0ZXIgdG8gc2VsZWN0IHdoaWNoIGRlc2NlbmRhbnRzIHRvIHNlZQotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gd2FsayBkZXNjZW5kYW50cyB3aXRoaW4gYSBmaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoRmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXR1cm4gbmV3IEZpbHRlckl0ZXJhdG9yKG5ldyBEZXNjZW5kYW50SXRlcmF0b3IodGhpcyksIGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmVudCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy8gZG9jdW1lbnRzIG5ldmVyIGhhdmUgcGFyZW50cwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5qZG9tLlBhcmVudCNnZXREb2N1bWVudCgpCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIGFuIGFyYml0cmFyeSBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQgdW5kZXIKLSAgICAgKiB0aGUgZ2l2ZW4gImlkIiBzdHJpbmcuICBOdWxsIHZhbHVlcyBhcmUgcGVybWl0dGVkLiAgU3RyaW5ncyBiZWdpbm5pbmcKLSAgICAgKiB3aXRoICJodHRwOi8vd3d3Lmpkb20ub3JnLyBhcmUgcmVzZXJ2ZWQgZm9yIEpET00gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGlkICAgICB0aGUgaWQgb2YgdGhlIHN0b3JlZCBvYmplY3QKLSAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBvYmplY3QgdG8gc3RvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgaWQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAocHJvcGVydHlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChpZCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudCB1bmRlciB0aGUgZ2l2ZW4gImlkIgotICAgICAqIHN0cmluZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBiaW5kaW5nIG9yIGlmIHRoZSBiaW5kaW5nIGV4cGxpY2l0bHkKLSAgICAgKiBzdG9yZWQgYSBudWxsIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGlkICAgdGhlIGlkIG9mIHRoZSBzdG9yZWQgb2JqZWN0IHRvIHJldHVybgotICAgICAqIEByZXR1cm4gICAgIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TWFwLmdldChpZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9FbGVtZW50LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYTQ4ZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjAgKzAsMCBAQAotLyotLQotCi0gJElkOiBFbGVtZW50LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmpkb20uZmlsdGVyLio7Ci0KLS8qKgotICogQW4gWE1MIGVsZW1lbnQuIE1ldGhvZHMgYWxsb3cgdGhlIHVzZXIgdG8gZ2V0IGFuZCBtYW5pcHVsYXRlIGl0cyBjaGlsZAotICogZWxlbWVudHMgYW5kIGNvbnRlbnQsIGRpcmVjdGx5IGFjY2VzcyB0aGUgZWxlbWVudCdzIHRleHR1YWwgY29udGVudCwKLSAqIG1hbmlwdWxhdGUgaXRzIGF0dHJpYnV0ZXMsIGFuZCBtYW5hZ2UgbmFtZXNwYWNlcy4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIEx1Y2FzIEdvbnplCi0gKiBAYXV0aG9yICBLZXZpbiBSZWdhbgotICogQGF1dGhvciAgRGFuIFNjaGFmZmVyCi0gKiBAYXV0aG9yICBZdXN1ZiBHb29sYW1hYmJhcwotICogQGF1dGhvciAgS2VudCBDLiBKb2huc29uCi0gKiBAYXV0aG9yICBKb29scyBFbnRpY2tuYXAKLSAqIEBhdXRob3IgIEFsZXggUm9zZW4KLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudCBleHRlbmRzIENvbnRlbnQgaW1wbGVtZW50cyBQYXJlbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgIkAoIykgJFJDU2ZpbGU6IEVsZW1lbnQuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkICROYW1lOiAgJCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9BUlJBWV9TSVpFID0gNTsKLQotICAgIC8qKiBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgZWxlbWVudCAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50ICovCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBOYW1lc3BhY2UgbmFtZXNwYWNlOwotCi0gICAgLyoqIEFkZGl0aW9uYWwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBzdG9yZSBvbiB0aGlzIGVsZW1lbnQ7IHVzZWZ1bAotICAgICAqIGR1cmluZyBvdXRwdXQgKi8KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3QgYWRkaXRpb25hbE5hbWVzcGFjZXM7Ci0KLSAgICAvLyBTZWUgaHR0cDovL2xpc3RzLmRlbnZlcm9ubGluZS5uZXQvbGlzdHMvamRvbS1pbnRlcmVzdC8yMDAwLVNlcHRlbWJlci8wMDMwMzAuaHRtbAotICAgIC8vIGZvciBhIHBvc3NpYmxlIG1lbW9yeSBvcHRpbWl6YXRpb24gaGVyZSAodXNpbmcgYSBSb290RWxlbWVudCBzdWJjbGFzcykKLQotICAgIC8qKgotICAgICAqICBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC4gIFN1YmNsYXNzZXJzIGhhdmUgdG8KLSAgICAgKiB0cmFjayBhdHRyaWJ1dGVzIHVzaW5nIHRoZWlyIG93biBtZWNoYW5pc20uCi0gICAgICovCi0gICAgQXR0cmlidXRlTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUxpc3QodGhpcyk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgZWxlbWVudC4gIFN1YmNsYXNzZXJzIGhhdmUgdG8KLSAgICAgKiB0cmFjayBjb250ZW50IHVzaW5nIHRoZWlyIG93biBtZWNoYW5pc20uCi0gICAgICovCi0gICAgQ29udGVudExpc3QgY29udGVudCA9IG5ldyBDb250ZW50TGlzdCh0aGlzKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgYW4gRWxlbWVudAotICAgICAqIHN1YmNsYXNzIHRoYXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uIEl0Ci0gICAgICogaW50ZW50aW9uYWxseSBsZWF2ZXMgYWxsIGluc3RhbmNlIHZhcmlhYmxlcyBudWxsLCBhbGxvd2luZyBhIGxpZ2h0d2VpZ2h0Ci0gICAgICogc3ViY2xhc3MgaW1wbGVtZW50YXRpb24uIFRoZSBzdWJjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgYWxsIHRoZQotICAgICAqIGdldCBhbmQgc2V0IG1ldGhvZHMgb24gRWxlbWVudCBiZWhhdmUgYXMgZG9jdW1lbnRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGltcGxlbWVudGluZyBhbiBFbGVtZW50IHN1YmNsYXNzIHdoaWNoIGRvZXNuJ3QgcmVxdWlyZSBmdWxsIGNvbnRyb2wKLSAgICAgKiBvdmVyIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLCBiZSBhd2FyZSB0aGF0IHNpbXBseSBjYWxsaW5nIHN1cGVyKCkgKG9yCi0gICAgICogbGV0dGluZyB0aGUgY29tcGlsZXIgYWRkIHRoZSBpbXBsaWNpdCBzdXBlcigpIGNhbGwpIHdpbGwgbm90IGluaXRpYWxpemUKLSAgICAgKiB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIHdoaWNoIHdpbGwgY2F1c2UgbWFueSBvZiB0aGUgbWV0aG9kcyB0byB0aHJvdyBhCi0gICAgICogTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoZXJlZm9yZSwgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGVzZSBzdWJjbGFzc2VzCi0gICAgICogc2hvdWxkIGNhbGwgb25lIG9mIHRoZSBwdWJsaWMgY29uc3RydWN0b3JzIHNvIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGlzCi0gICAgICogaGFuZGxlZCBhdXRvbWF0aWNhbGx5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50KCkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQgKGxvY2FsKSBuYW1lIGFuZCBuYW1lc3BhY2UuIElmCi0gICAgICogdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyBudWxsLCB0aGUgZWxlbWVudCB3aWxsIGhhdmUgbm8gbmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgICAgICAgICAgICBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtICBuYW1lc3BhY2UgICAgICAgICAgICBuYW1lc3BhY2UgZm9yIHRoZSBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudChTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIHRoZSBzdXBwbGllZCAobG9jYWwpIG5hbWUgYW5kIG5vIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgICAgICAgICAgICAgICAgbG9jYWwgbmFtZSBvZiB0aGUgZWxlbWVudAotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgaWxsZWdhbCBhcyBhbiBlbGVtZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMobmFtZSwgKE5hbWVzcGFjZSkgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIChsb2NhbCkgbmFtZSBhbmQgYSBuYW1lc3BhY2UKLSAgICAgKiBnaXZlbiBieSBhIFVSSS4gVGhlIGVsZW1lbnQgd2lsbCBiZSBwdXQgaW50byB0aGUgdW5wcmVmaXhlZCAoZGVmYXVsdCkKLSAgICAgKiBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gIHVyaSAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuIGVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgb3IgdGhlIGdpdmVuIFVSSSBpcyBpbGxlZ2FsIGFzIGEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzKG5hbWUsIE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoIiIsIHVyaSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZWxlbWVudCB3aXRoIHRoZSBzdXBwbGllZCAobG9jYWwpIG5hbWUgYW5kIGEgbmFtZXNwYWNlCi0gICAgICogZ2l2ZW4gYnkgdGhlIHN1cHBsaWVkIHByZWZpeCBhbmQgVVJJIGNvbWJpbmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgICAgICAgICAgICBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtICBwcmVmaXggICAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICogQHBhcmFtICB1cmkgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgVVJJIGZvciB0aGUgZWxlbWVudAotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgaWxsZWdhbCBhcyBhbiBlbGVtZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0aGUgZ2l2ZW4gcHJlZml4IGlzIGlsbGVnYWwgYXMgYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHByZWZpeCwgb3IgdGhlIGdpdmVuIFVSSSBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxsZWdhbCBhcyBhIG5hbWVzcGFjZSBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzKG5hbWUsIE5hbWVzcGFjZS5nZXROYW1lc3BhY2UocHJlZml4LCB1cmkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAobG9jYWwpIG5hbWUgb2YgdGhlIGVsZW1lbnQgKHdpdGhvdXQgYW55IG5hbWVzcGFjZSBwcmVmaXgpLgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIGxvY2FsIGVsZW1lbnQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgKGxvY2FsKSBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgICAgICAgICAgICB0aGUgbmV3IChsb2NhbCkgbmFtZSBvZiB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgdGhlIHRhcmdldCBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuIEVsZW1lbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja0VsZW1lbnROYW1lKG5hbWUpOwotICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbihuYW1lLCAiZWxlbWVudCIsIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudCdzIHtAbGluayBOYW1lc3BhY2V9LgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIE5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCdzIHtAbGluayBOYW1lc3BhY2V9LiBJZiB0aGUgcHJvdmlkZWQgbmFtZXNwYWNlIGlzIG51bGwsCi0gICAgICogdGhlIGVsZW1lbnQgd2lsbCBoYXZlIG5vIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICAgICAgICAgICB0aGUgbmV3IG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXROYW1lc3BhY2UoTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBvZiB0aGUgZWxlbWVudCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqIGV4aXN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBVUkkgbWFwcGVkIHRvIHRoaXMgZWxlbWVudCdzIHByZWZpeCAob3IgdGhlCi0gICAgICogaW4tc2NvcGUgZGVmYXVsdCBuYW1lc3BhY2UgVVJJIGlmIG5vIHByZWZpeCkuIElmIG5vIG1hcHBpbmcgaXMgZm91bmQsIGFuCi0gICAgICogZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZS5nZXRVUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTmFtZXNwYWNlfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcmVmaXggaW4gc2NvcGUKLSAgICAgKiBmb3IgdGhpcyBlbGVtZW50LiBUaGlzIGludm9sdmVzIHNlYXJjaGluZyB1cCB0aGUgdHJlZSwgc28gdGhlIHJlc3VsdHMKLSAgICAgKiBkZXBlbmQgb24gdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcwotICAgICAqIG5vIG5hbWVzcGFjZSBpbiBzY29wZSB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYXQgdGhpcyBwb2ludCBpbiB0aGUKLSAgICAgKiBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgcHJlZml4ICAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4IHRvIGxvb2sgdXAKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgdGhlIE5hbWVzcGFjZSBmb3IgdGhpcyBwcmVmaXggYXQgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIE5hbWVzcGFjZSBnZXROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbCIpKSB7Ci0gICAgICAgICAgICAvLyBOYW1lc3BhY2UgInhtbCIgaXMgYWx3YXlzIGJvdW5kLgotICAgICAgICAgICAgcmV0dXJuIE5hbWVzcGFjZS5YTUxfTkFNRVNQQUNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByZWZpeCBpcyB0aGUgcHJlZml4IGZvciB0aGlzIGVsZW1lbnQKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoZ2V0TmFtZXNwYWNlUHJlZml4KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY2FuIHRoZSBhZGRpdGlvbmFsIG5hbWVzcGFjZXMKLSAgICAgICAgaWYgKGFkZGl0aW9uYWxOYW1lc3BhY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbE5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBhZGRpdGlvbmFsTmFtZXNwYWNlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMobnMuZ2V0UHJlZml4KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgbWF0Y2gsIGFzayB0aGUgcGFyZW50Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFbGVtZW50KXBhcmVudCkuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGVsZW1lbnQsIGluIHRoZSBmb3JtCi0gICAgICogW25hbWVzcGFjZVByZWZpeF06W2xvY2FsTmFtZV0uIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBuYW1lc3BhY2UKLSAgICAgKiBwcmVmaXgsIHRoZW4gdGhlIGxvY2FsIG5hbWUgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVsZW1lbnQgKGluY2x1ZGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgLy8gTm90ZTogQW55IGNoYW5nZXMgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluCi0gICAgICAgIC8vIFhNTE91dHB1dHRlci5wcmludFF1YWxpZmllZE5hbWUoKQotICAgICAgICBpZiAobmFtZXNwYWNlLmdldFByZWZpeCgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihuYW1lc3BhY2UuZ2V0UHJlZml4KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCc6JykKLSAgICAgICAgICAgIC5hcHBlbmQobmFtZSkKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHRvIHRoaXMgZWxlbWVudC4gVGhpcyBzaG91bGQgPGk+bm90PC9pPiBiZQotICAgICAqIHVzZWQgdG8gYWRkIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhpcyBlbGVtZW50IGl0c2VsZjsgdGhhdCBzaG91bGQgYmUKLSAgICAgKiBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGlzIGlzIGZvciBhZGRpbmcKLSAgICAgKiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9uIHRoZSBlbGVtZW50IG5vdCByZWxhdGluZyBkaXJlY3RseSB0byBpdHNlbGYuCi0gICAgICogSXQncyB1c2VkIGR1cmluZyBvdXRwdXQgdG8gZm9yIHN0eWxpc3RpYyByZWFzb25zIG1vdmUgbmFtZXNwYWNlCi0gICAgICogZGVjbGFyYXRpb25zIGhpZ2hlciBpbiB0aGUgdHJlZSB0aGFuIHRoZXkgd291bGQgaGF2ZSB0byBiZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgYWRkaXRpb25hbCAgICAgICAgICBuYW1lc3BhY2UgdG8gYWRkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBuYW1lc3BhY2UgcHJlZml4IGNvbGxpZGVzIHdpdGggYW5vdGhlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcHJlZml4IG9uIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oTmFtZXNwYWNlIGFkZGl0aW9uYWwpIHsKLQotICAgICAgICAvLyBWZXJpZnkgdGhlIG5ldyBuYW1lc3BhY2UgcHJlZml4IGRvZXNuJ3QgY29sbGlkZSB3aXRoIGFub3RoZXIKLSAgICAgICAgLy8gZGVjbGFyZWQgbmFtZXNwYWNlLCBhbiBhdHRyaWJ1dGUgcHJlZml4LCBvciB0aGlzIGVsZW1lbnQncyBwcmVmaXgKLSAgICAgICAgU3RyaW5nIHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrTmFtZXNwYWNlQ29sbGlzaW9uKGFkZGl0aW9uYWwsIHRoaXMpOwotICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWRkRXhjZXB0aW9uKHRoaXMsIGFkZGl0aW9uYWwsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWRkaXRpb25hbE5hbWVzcGFjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkaXRpb25hbE5hbWVzcGFjZXMgPSBuZXcgQXJyYXlMaXN0KElOSVRJQUxfQVJSQVlfU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRpdGlvbmFsTmFtZXNwYWNlcy5hZGQoYWRkaXRpb25hbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBhZGRpdGlvbmFsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGVsZW1lbnQuIFRoaXMKLSAgICAgKiBzaG91bGQgPGk+bm90PC9pPiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgZGVjbGFyYXRpb24gZm9yIHRoaXMgZWxlbWVudAotICAgICAqIGl0c2VsZjsgdGhhdCBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBlbGVtZW50LgotICAgICAqIEluc3RlYWQsIHRoaXMgaXMgZm9yIHJlbW92aW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgb24gdGhlIGVsZW1lbnQgbm90Ci0gICAgICogcmVsYXRpbmcgZGlyZWN0bHkgdG8gaXRzZWxmLiBJZiB0aGUgZGVjbGFyYXRpb24gaXMgbm90IHByZXNlbnQsIHRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkZGl0aW9uYWxOYW1lc3BhY2UgbmFtZXNwYWNlIHRvIHJlbW92ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKE5hbWVzcGFjZSBhZGRpdGlvbmFsTmFtZXNwYWNlKSB7Ci0gICAgICAgIGlmIChhZGRpdGlvbmFsTmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYWRkaXRpb25hbE5hbWVzcGFjZXMucmVtb3ZlKGFkZGl0aW9uYWxOYW1lc3BhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBhZGRpdGlvbmFsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgb24gdGhpcyBlbGVtZW50LgotICAgICAqIFRoaXMgaW5jbHVkZXMgb25seSBhZGRpdGlvbmFsIG5hbWVzcGFjZSwgbm90IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnQKLSAgICAgKiBpdHNlbGYsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB0aHJvdWdoIHtAbGluayAjZ2V0TmFtZXNwYWNlKCl9LiBJZiB0aGVyZQotICAgICAqIGFyZSBubyBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucywgdGhpcyByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIE5vdGUsIHRoZQotICAgICAqIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIGEgTGlzdCBvZiB0aGUgYWRkaXRpb25hbCBuYW1lc3BhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIC8vIE5vdCBoYXZpbmcgdGhlIHJldHVybmVkIGxpc3QgYmUgbGl2ZSBhbGxvd3MgdXMgdG8gYXZvaWQgY3JlYXRpbmcgYQotICAgICAgICAvLyBuZXcgbGlzdCBvYmplY3Qgd2hlbiBYTUxPdXRwdXR0ZXIgY2FsbHMgdGhpcyBtZXRob2Qgb24gYW4gZWxlbWVudAotICAgICAgICAvLyB3aXRoIGFuIGVtcHR5IGxpc3QuCi0gICAgICAgIGlmIChhZGRpdGlvbmFsTmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhZGRpdGlvbmFsTmFtZXNwYWNlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgWFBhdGggMS4wIHN0cmluZyB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIHdoaWNoIGlzIHRoZQotICAgICAqIGNvbXBsZXRlLCBvcmRlcmVkIGNvbnRlbnQgb2YgYWxsIHRleHQgbm9kZSBkZXNjZW5kYW50cyBvZiB0aGlzIGVsZW1lbnQKLSAgICAgKiAoaSYjNDY7ZSYjNDY7IHRoZSB0ZXh0IHRoYXQncyBsZWZ0IGFmdGVyIGFsbCByZWZlcmVuY2VzIGFyZSByZXNvbHZlZAotICAgICAqIGFuZCBhbGwgb3RoZXIgbWFya3VwIGlzIHN0cmlwcGVkIG91dC4pCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29uY2F0ZW50YXRpb24gb2YgYWxsIHRleHQgbm9kZSBkZXNjZW5kYW50cwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRyID0gZ2V0Q29udGVudCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDb250ZW50IGNoaWxkID0gKENvbnRlbnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY2hpbGQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgYSByb290IGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgaW4KLSAgICAgKiB0YW5kZW0gd2l0aCB7QGxpbmsgI2dldFBhcmVudH0gdG8gZGV0ZXJtaW5lIGlmIGFuIGVsZW1lbnQgaGFzIGFueQotICAgICAqICJhdHRhY2htZW50cyIgdG8gYSBwYXJlbnQgZWxlbWVudCBvciBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoaXMgaXMgYSByb290IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgRG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50LmluZGV4T2YoY2hpbGQpOwotICAgIH0KLQotLy8gICAgcHJpdmF0ZSBpbnQgaW5kZXhPZihpbnQgc3RhcnQsIEZpbHRlciBmaWx0ZXIpIHsKLS8vICAgICAgICBpbnQgc2l6ZSA9IGdldENvbnRlbnRTaXplKCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc2l6ZTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhnZXRDb250ZW50KGkpKSkgewotLy8gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIC0xOwotLy8gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIGNvbnRlbnQgZGlyZWN0bHkgaGVsZCB1bmRlciB0aGlzIGVsZW1lbnQgYXMgYSBzdHJpbmcuCi0gICAgICogVGhpcyBpbmNsdWRlcyBhbGwgdGV4dCB3aXRoaW4gdGhpcyBzaW5nbGUgZWxlbWVudCwgaW5jbHVkaW5nIHdoaXRlc3BhY2UKLSAgICAgKiBhbmQgQ0RBVEEgc2VjdGlvbnMgaWYgdGhleSBleGlzdC4gSXQncyBlc3NlbnRpYWxseSB0aGUgY29uY2F0ZW5hdGlvbiBvZgotICAgICAqIGFsbCB7QGxpbmsgVGV4dH0gYW5kIHtAbGluayBDREFUQX0gbm9kZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDb250ZW50fS4KLSAgICAgKiBUaGUgY2FsbCBkb2VzIG5vdCByZWN1cnNlIGludG8gY2hpbGQgZWxlbWVudHMuIElmIG5vIHRleHR1YWwgdmFsdWUgZXhpc3RzCi0gICAgICogZm9yIHRoZSBlbGVtZW50LCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgdGV4dCBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQsIG9yIGVtcHR5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoY29udGVudC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgaG9sZCBvbmx5IGEgVGV4dCBvciBDREFUQSwgcmV0dXJuIGl0IGRpcmVjdGx5Ci0gICAgICAgIGlmIChjb250ZW50LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gY29udGVudC5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFRleHQpIG9iaikuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbHNlIGJ1aWxkIFN0cmluZyB1cAotICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dENvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzVGV4dCA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnRlbnQuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICB0ZXh0Q29udGVudC5hcHBlbmQoKChUZXh0KSBvYmopLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgaGFzVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhhc1RleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoaXMgZWxlbWVudCB3aXRoIGFsbCBzdXJyb3VuZGluZwotICAgICAqIHdoaXRlc3BhY2UgcmVtb3ZlZC4gSWYgbm8gdGV4dHVhbCB2YWx1ZSBleGlzdHMgZm9yIHRoZSBlbGVtZW50LCBvciBpZgotICAgICAqIG9ubHkgd2hpdGVzcGFjZSBleGlzdHMsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgdHJpbW1lZCB0ZXh0IGNvbnRlbnQgZm9yIHRoaXMgZWxlbWVudCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRUcmltKCkgewotICAgICAgICByZXR1cm4gZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50IHdpdGggYWxsIHN1cnJvdW5kaW5nCi0gICAgICogd2hpdGVzcGFjZSByZW1vdmVkIGFuZCBpbnRlcm5hbCB3aGl0ZXNwYWNlIG5vcm1hbGl6ZWQgdG8gYSBzaW5nbGUgc3BhY2UuCi0gICAgICogSWYgbm8gdGV4dHVhbCB2YWx1ZSBleGlzdHMgZm9yIHRoZSBlbGVtZW50LCBvciBpZiBvbmx5IHdoaXRlc3BhY2UgZXhpc3RzLAotICAgICAqIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZCB0ZXh0IGNvbnRlbnQgZm9yIHRoaXMgZWxlbWVudCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHROb3JtYWxpemUoKSB7Ci0gICAgICAgIHJldHVybiBUZXh0Lm5vcm1hbGl6ZVN0cmluZyhnZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgbmFtZWQgY2hpbGQgZWxlbWVudCwgb3IgbnVsbCBpZgotICAgICAqIHRoZXJlJ3Mgbm8gc3VjaCBjaGlsZC4gVGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBiZWNhdXNlIGNhbGxpbmcKLSAgICAgKiA8Y29kZT5nZXRDaGlsZCgpLmdldFRleHQoKTwvY29kZT4gY2FuIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoaWxkCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIHRleHQgY29udGVudCBmb3IgdGhlIG5hbWVkIGNoaWxkLCBvciBudWxsIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHN1Y2ggY2hpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dChTdHJpbmcgbmFtZSkgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gZ2V0Q2hpbGQobmFtZSk7Ci0gICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyaW1tZWQgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBuYW1lZCBjaGlsZCBlbGVtZW50LCBvciBudWxsCi0gICAgICogaWYgdGhlcmUncyBubyBzdWNoIGNoaWxkLiBTZWUgPGNvZGU+e0BsaW5rICNnZXRUZXh0VHJpbSgpfTwvY29kZT4gZm9yCi0gICAgICogZGV0YWlscyBvZiB0ZXh0IHRyaW1taW5nLgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGlsZAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0cmltbWVkIHRleHQgY29udGVudCBmb3IgdGhlIG5hbWVkIGNoaWxkLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIGlmIG5vIHN1Y2ggY2hpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dFRyaW0oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IGdldENoaWxkKG5hbWUpOwotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkLmdldFRleHRUcmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIG5hbWVkIGNoaWxkIGVsZW1lbnQsIG9yCi0gICAgICogbnVsbCBpZiB0aGVyZSdzIG5vIHN1Y2ggY2hpbGQuIFNlZSA8Y29kZT57QGxpbmsKLSAgICAgKiAjZ2V0VGV4dE5vcm1hbGl6ZSgpfTwvY29kZT4gZm9yIGRldGFpbHMgb2YgdGV4dCBub3JtYWxpemluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgbmFtZSAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hpbGQKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZCB0ZXh0IGNvbnRlbnQgZm9yIHRoZSBuYW1lZCBjaGlsZCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbnVsbCBpZiBubyBzdWNoIGNoaWxkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGlsZFRleHROb3JtYWxpemUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IGdldENoaWxkKG5hbWUpOwotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkLmdldFRleHROb3JtYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIG5hbWVkIGNoaWxkIGVsZW1lbnQsIG9yIG51bGwgaWYKLSAgICAgKiB0aGVyZSdzIG5vIHN1Y2ggY2hpbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoaWxkCi0gICAgICogQHBhcmFtICBucyAgICAgICAgICAgICAgICAgIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNoaWxkCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIHRleHQgY29udGVudCBmb3IgdGhlIG5hbWVkIGNoaWxkLCBvciBudWxsIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHN1Y2ggY2hpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dChTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSBnZXRDaGlsZChuYW1lLCBucyk7Ci0gICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRyaW1tZWQgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBuYW1lZCBjaGlsZCBlbGVtZW50LCBvciBudWxsCi0gICAgICogaWYgdGhlcmUncyBubyBzdWNoIGNoaWxkLgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjaGlsZAotICAgICAqIEBwYXJhbSAgbnMgICAgICAgICAgICAgICAgICB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjaGlsZAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0cmltbWVkIHRleHQgY29udGVudCBmb3IgdGhlIG5hbWVkIGNoaWxkLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIGlmIG5vIHN1Y2ggY2hpbGQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dFRyaW0oU3RyaW5nIG5hbWUsIE5hbWVzcGFjZSBucykgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gZ2V0Q2hpbGQobmFtZSwgbnMpOwotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkLmdldFRleHRUcmltKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIG5hbWVkIGNoaWxkIGVsZW1lbnQsIG9yCi0gICAgICogbnVsbCBpZiB0aGVyZSdzIG5vIHN1Y2ggY2hpbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoaWxkCi0gICAgICogQHBhcmFtICBucyAgICAgICAgICAgICAgICAgIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNoaWxkCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgdGV4dCBjb250ZW50IGZvciB0aGUgbmFtZWQgY2hpbGQsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG51bGwgaWYgbm8gc3VjaCBjaGlsZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0Tm9ybWFsaXplKFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbnMpIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IGdldENoaWxkKG5hbWUsIG5zKTsKLSAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZC5nZXRUZXh0Tm9ybWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB0byBiZSB0aGUgdGV4dCBnaXZlbi4gQWxsIGV4aXN0aW5nIHRleHQKLSAgICAgKiBjb250ZW50IGFuZCBub24tdGV4dCBjb250ZXh0IGlzIHJlbW92ZWQuIElmIHRoaXMgZWxlbWVudCBzaG91bGQgaGF2ZSBib3RoCi0gICAgICogdGV4dHVhbCBjb250ZW50IGFuZCBuZXN0ZWQgZWxlbWVudHMsIHVzZSA8Y29kZT57QGxpbmsgI3NldENvbnRlbnR9PC9jb2RlPgotICAgICAqIGluc3RlYWQuIFNldHRpbmcgYSBudWxsIHRleHQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGFuIGVtcHR5Ci0gICAgICogc3RyaW5nIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtICB0ZXh0ICAgICAgICAgICAgICAgICBuZXcgdGV4dCBjb250ZW50IGZvciB0aGUgZWxlbWVudAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgdGhlIHRhcmdldCBlbGVtZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiB0aGUgYXNzaWduZWQgdGV4dCBjb250YWlucyBhbiBpbGxlZ2FsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc3VjaCBhcyBhIHZlcnRpY2FsIHRhYiAoYXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkge0BsaW5rCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgY29udGVudC5jbGVhcigpOwotCi0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZENvbnRlbnQobmV3IFRleHQodGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgYXMgYSBMaXN0IHdoaWNoCi0gICAgICogbWF5IGNvbnRhaW4gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPlRleHQ8L2NvZGU+LCA8Y29kZT5FbGVtZW50PC9jb2RlPiwKLSAgICAgKiA8Y29kZT5Db21tZW50PC9jb2RlPiwgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiwKLSAgICAgKiA8Y29kZT5DREFUQTwvY29kZT4sIGFuZCA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+LgotICAgICAqIFRoZSBMaXN0IHJldHVybmVkIGlzICJsaXZlIiBpbiBkb2N1bWVudCBvcmRlciBhbmQgbW9kaWZpY2F0aW9ucwotICAgICAqIHRvIGl0IGFmZmVjdCB0aGUgZWxlbWVudCdzIGFjdHVhbCBjb250ZW50cy4gIFdoaXRlc3BhY2UgY29udGVudCBpcwotICAgICAqIHJldHVybmVkIGluIGl0cyBlbnRpcmV0eS4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFNlcXVlbnRpYWwgdHJhdmVyc2FsIHRocm91Z2ggdGhlIExpc3QgaXMgYmVzdCBkb25lIHdpdGggYW4gSXRlcmF0b3IKLSAgICAgKiBzaW5jZSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnQgb2YgTGlzdC5zaXplKCkgbWF5IHJlcXVpcmUgd2Fsa2luZyB0aGUKLSAgICAgKiBlbnRpcmUgbGlzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gY29udGFpbmluZyB0aGUgbWl4ZWQgY29udGVudCBvZiB0aGUKLSAgICAgKiAgICAgICAgIGVsZW1lbnQ6IG1heSBjb250YWluIDxjb2RlPlRleHQ8L2NvZGU+LAotICAgICAqICAgICAgICAgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPiwgPGNvZGU+e0BsaW5rIENvbW1lbnR9PC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPntAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259PC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPntAbGluayBDREFUQX08L2NvZGU+LCBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPntAbGluayBFbnRpdHlSZWZ9PC9jb2RlPiBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldENvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGZpbHRlciB2aWV3IG9mIHRoaXMgPGNvZGU+RWxlbWVudDwvY29kZT4ncyBjb250ZW50LgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogU2VxdWVudGlhbCB0cmF2ZXJzYWwgdGhyb3VnaCB0aGUgTGlzdCBpcyBiZXN0IGRvbmUgd2l0aCBhIEl0ZXJhdG9yCi0gICAgICogc2luY2UgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50IG9mIExpc3Quc2l6ZSgpIG1heSByZXF1aXJlIHdhbGtpbmcgdGhlCi0gICAgICogZW50aXJlIGxpc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlciA8Y29kZT5GaWx0ZXI8L2NvZGU+IHRvIGFwcGx5Ci0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiAtIGZpbHRlcmVkIEVsZW1lbnQgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldENvbnRlbnQoRmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXR1cm4gY29udGVudC5nZXRWaWV3KGZpbHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgY2hpbGQgY29udGVudCBmcm9tIHRoaXMgcGFyZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBvbGQgY2hpbGRyZW4gZGV0YWNoZWQgZnJvbSB0aGlzIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHJlbW92ZUNvbnRlbnQoKSB7Ci0gICAgICAgIExpc3Qgb2xkID0gbmV3IEFycmF5TGlzdChjb250ZW50KTsKLSAgICAgICAgY29udGVudC5jbGVhcigpOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgY2hpbGQgY29udGVudCBmcm9tIHRoaXMgcGFyZW50IG1hdGNoaW5nIHRoZSBzdXBwbGllZCBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVyIGZpbHRlciB0byBzZWxlY3Qgd2hpY2ggY29udGVudCB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIG9sZCBjaGlsZHJlbiBkZXRhY2hlZCBmcm9tIHRoaXMgcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgcmVtb3ZlQ29udGVudChGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIExpc3Qgb2xkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBjb250ZW50LmdldFZpZXcoZmlsdGVyKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ29udGVudCBjaGlsZCA9IChDb250ZW50KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgb2xkLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICBpdHIucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9sZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQuICBUaGUgc3VwcGxpZWQgTGlzdCBzaG91bGQKLSAgICAgKiBjb250YWluIG9ubHkgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwKLSAgICAgKiA8Y29kZT5DREFUQTwvY29kZT4sIDxjb2RlPkNvbW1lbnQ8L2NvZGU+LAotICAgICAqIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4sIGFuZCA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+LgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBhbGwgb2JqZWN0cyBpbiB0aGUgc3VwcGxpZWQgTGlzdCBhcmUgbGVnYWwgYW5kIGJlZm9yZSB0aGUgbmV3Ci0gICAgICogY29udGVudCBpcyBhZGRlZCwgYWxsIG9iamVjdHMgaW4gdGhlIG9sZCBjb250ZW50IHdpbGwgaGF2ZSB0aGVpcgotICAgICAqIHBhcmVudGFnZSBzZXQgdG8gbnVsbCAobm8gcGFyZW50KSBhbmQgdGhlIG9sZCBjb250ZW50IGxpc3Qgd2lsbCBiZQotICAgICAqIGNsZWFyZWQuIFRoaXMgaGFzIHRoZSBlZmZlY3QgdGhhdCBhbnkgYWN0aXZlIGxpc3QgKHByZXZpb3VzbHkgb2J0YWluZWQKLSAgICAgKiB3aXRoIGEgY2FsbCB0byB7QGxpbmsgI2dldENvbnRlbnR9IG9yIHtAbGluayAjZ2V0Q2hpbGRyZW59KSB3aWxsIGFsc28KLSAgICAgKiBjaGFuZ2UgdG8gcmVmbGVjdCB0aGUgbmV3IGNvbnRlbnQuICBJbiBhZGRpdGlvbiwgYWxsIG9iamVjdHMgaW4gdGhlCi0gICAgICogc3VwcGxpZWQgTGlzdCB3aWxsIGhhdmUgdGhlaXIgcGFyZW50YWdlIHNldCB0byB0aGlzIGVsZW1lbnQsIGJ1dCB0aGUKLSAgICAgKiBMaXN0IGl0c2VsZiB3aWxsIG5vdCBiZSAibGl2ZSIgYW5kIGZ1cnRoZXIgcmVtb3ZhbHMgYW5kIGFkZGl0aW9ucyB3aWxsCi0gICAgICogaGF2ZSBubyBlZmZlY3Qgb24gdGhpcyBlbGVtZW50cyBjb250ZW50LiBJZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZQotICAgICAqIHdvcmtpbmcgd2l0aCBhICJsaXZlIiBsaXN0LCB0aGVuIGEgY2FsbCB0byBzZXRDb250ZW50IHNob3VsZCBiZQotICAgICAqIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byB7QGxpbmsgI2dldENvbnRlbnR9IG9yIHtAbGluayAjZ2V0Q2hpbGRyZW59IHRvCi0gICAgICogb2J0YWluIGEgImxpdmUiIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogUGFzc2luZyBhIG51bGwgb3IgZW1wdHkgTGlzdCBjbGVhcnMgdGhlIGV4aXN0aW5nIGNvbnRlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogSW4gZXZlbnQgb2YgYW4gZXhjZXB0aW9uIHRoZSBvcmlnaW5hbCBjb250ZW50IHdpbGwgYmUgdW5jaGFuZ2VkIGFuZAotICAgICAqIHRoZSBvYmplY3RzIGluIHRoZSBzdXBwbGllZCBjb250ZW50IHdpbGwgYmUgdW5hbHRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdDb250ZW50IDxjb2RlPkxpc3Q8L2NvZGU+IG9mIGNvbnRlbnQgdG8gc2V0Ci0gICAgICogQHJldHVybiB0aGlzIGVsZW1lbnQgbW9kaWZpZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIExpc3QgY29udGFpbnMgb2JqZWN0cyBvZgotICAgICAqICAgICAgICAgaWxsZWdhbCB0eXBlcyBvciB3aXRoIGV4aXN0aW5nIHBhcmVudGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXRDb250ZW50KENvbGxlY3Rpb24gbmV3Q29udGVudCkgewotICAgICAgICBjb250ZW50LmNsZWFyQW5kU2V0KG5ld0NvbnRlbnQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIHRoZSBjdXJyZW50IGNoaWxkIHRoZSBnaXZlbiBpbmRleCB3aXRoIHRoZSBzdXBwbGllZCBjaGlsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2lsbCBiZSB1bmNoYW5nZWQgYW5kCi0gICAgICogdGhlIHN1cHBsaWVkIGNoaWxkIHdpbGwgYmUgdW5hbHRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCAtIGluZGV4IG9mIGNoaWxkIHRvIHJlcGxhY2UuCi0gICAgICogQHBhcmFtIGNoaWxkIC0gY2hpbGQgdG8gYWRkLgotICAgICAqIEByZXR1cm4gZWxlbWVudCBvbiB3aGljaCB0aGlzIG1ldGhvZCB3YXMgaW52b2tlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgY2hpbGQgaXMgYWxyZWFkeSBhdHRhY2hlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgbGVnYWwgY29udGVudCBmb3IgdGhpcyBwYXJlbnQuCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIKLSAgICAgKiAgICAgICAgIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IHNldENvbnRlbnQoaW50IGluZGV4LCBDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIGNvbnRlbnQuc2V0KGluZGV4LCBjaGlsZCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2UgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBpbmRleCB3aGl0aCB0aGUgc3VwcGxpZWQKLSAgICAgKiBjb2xsZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluIGV2ZW50IG9mIGFuIGV4Y2VwdGlvbiB0aGUgb3JpZ2luYWwgY29udGVudCB3aWxsIGJlIHVuY2hhbmdlZCBhbmQKLSAgICAgKiB0aGUgY29udGVudCBpbiB0aGUgc3VwcGxpZWQgY29sbGVjdGlvbiB3aWxsIGJlIHVuYWx0ZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggLSBpbmRleCBvZiBjaGlsZCB0byByZXBsYWNlLgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIC0gY29sbGVjdGlvbiBvZiBjb250ZW50IHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIG9iamVjdCBvbiB3aGljaCB0aGlzIG1ldGhvZCB3YXMgaW52b2tlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBvYmplY3RzIG9mCi0gICAgICogICAgICAgICBpbGxlZ2FsIHR5cGVzLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBuZWdhdGl2ZSBvciBncmVhdGVyCi0gICAgICogICAgICAgICB0aGFuIHRoZSBjdXJyZW50IG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyZW50IHNldENvbnRlbnQoaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLSAgICAgICAgY29udGVudC5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjb250ZW50LmFkZEFsbChpbmRleCwgY29sbGVjdGlvbik7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgYWRkcyB0ZXh0IGNvbnRlbnQgdG8gdGhpcyBlbGVtZW50LiAgSXQgZG9lcyBub3QgcmVwbGFjZSB0aGUKLSAgICAgKiBleGlzdGluZyBjb250ZW50IGFzIGRvZXMgPGNvZGU+c2V0VGV4dCgpPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhZGQKLSAgICAgKiBAcmV0dXJuIHRoaXMgZWxlbWVudCBtb2RpZmllZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBjb250YWlucyBhbgotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgc3VjaCBhcyBhIHZlcnRpY2FsIHRhYiAoYXMgZGV0ZXJtaW5lZAotICAgICAqICAgICAgICAgYnkge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgYWRkQ29udGVudChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHJldHVybiBhZGRDb250ZW50KG5ldyBUZXh0KHN0cikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgdGhlIGNoaWxkIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50IGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hpbGQgICBjaGlsZCB0byBhcHBlbmQgdG8gZW5kIG9mIGNvbnRlbnQgbGlzdAotICAgICAqIEByZXR1cm4gICAgICAgIHRoZSBlbGVtZW50IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGNhbGxlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFkZEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gY2hpbGQgYWxyZWFkeSBoYXMgYSBwYXJlbnQuICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGFkZENvbnRlbnQoQ29udGVudCBjaGlsZCkgewotICAgICAgICBjb250ZW50LmFkZChjaGlsZCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYWxsIGNoaWxkcmVuIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBlbmQgb2YKLSAgICAgKiB0aGUgY29udGVudCBsaXN0LiAgSW4gZXZlbnQgb2YgYW4gZXhjZXB0aW9uIGR1cmluZyBhZGQgdGhlCi0gICAgICogb3JpZ2luYWwgY29udGVudCB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgdGhlIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkCi0gICAgICogY29sbGVjdGlvbiB3aWxsIGJlIHVuYWx0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIGNvbGxlY3Rpb24gdG8gYXBwZW5kCi0gICAgICogQHJldHVybiAgICAgICAgICAgdGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIGFueSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICBhbHJlYWR5IGhhcyBhIHBhcmVudCBvciBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgYWRkQ29udGVudChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLSAgICAgICAgY29udGVudC5hZGRBbGwoY29sbGVjdGlvbik7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIGNoaWxkIGludG8gdGhlIGNvbnRlbnQgbGlzdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggbG9jYXRpb24gZm9yIGFkZGluZyB0aGUgY29sbGVjdGlvbgotICAgICAqIEBwYXJhbSBjaGlsZCAgICAgIGNoaWxkIHRvIGluc2VydAotICAgICAqIEByZXR1cm4gICAgICAgICAgIHRoZSBwYXJlbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGJleW9uZAotICAgICAqICAgICAgICAgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBhZGRDb250ZW50KGludCBpbmRleCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBjb250ZW50LmFkZChpbmRleCwgY2hpbGQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBjb250ZW50IGluIGEgY29sbGVjdGlvbiBpbnRvIHRoZSBjb250ZW50IGxpc3QKLSAgICAgKiBhdCB0aGUgZ2l2ZW4gaW5kZXguICBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQKLSAgICAgKiB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgdGhlIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkIGNvbGxlY3Rpb24gd2lsbCBiZQotICAgICAqIHVuYWx0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBsb2NhdGlvbiBmb3IgYWRkaW5nIHRoZSBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGMgIGNvbGxlY3Rpb24gdG8gaW5zZXJ0Ci0gICAgICogQHJldHVybiAgICAgICAgICAgIHRoZSBwYXJlbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGJleW9uZAotICAgICAqICAgICAgICAgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIGFueSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICogICAgICAgICBhbHJlYWR5IGhhcyBhIHBhcmVudCBvciBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgYWRkQ29udGVudChpbnQgaW5kZXgsIENvbGxlY3Rpb24gYykgewotICAgICAgICBjb250ZW50LmFkZEFsbChpbmRleCwgYyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGNsb25lQ29udGVudCgpIHsKLSAgICAgICAgaW50IHNpemUgPSBnZXRDb250ZW50U2l6ZSgpOwotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudCBjaGlsZCA9IGdldENvbnRlbnQoaSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjaGlsZC5jbG9uZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudCBnZXRDb250ZW50KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKENvbnRlbnQpIGNvbnRlbnQuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyBDb250ZW50IGdldENoaWxkKEZpbHRlciBmaWx0ZXIpIHsKLS8vICAgICAgICBpbnQgaSA9IGluZGV4T2YoMCwgZmlsdGVyKTsKLS8vICAgICAgICByZXR1cm4gKGkgPCAwKSA/IG51bGwgOiBnZXRDb250ZW50KGkpOwotLy8gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29udGVudChDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50LnJlbW92ZShjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnQgcmVtb3ZlQ29udGVudChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChDb250ZW50KSBjb250ZW50LnJlbW92ZShpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgdG8gYmUgdGhlIHN1cHBsaWVkIGNoaWxkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBzdXBwbGllZCBjaGlsZCBpcyBsZWdhbCBjb250ZW50IGZvciB0aGlzIHBhcmVudCBhbmQgYmVmb3JlCi0gICAgICogaXQgaXMgYWRkZWQsIGFsbCBjb250ZW50IGluIHRoZSBjdXJyZW50IGNvbnRlbnQgbGlzdCB3aWxsCi0gICAgICogYmUgY2xlYXJlZCBhbmQgYWxsIGN1cnJlbnQgY2hpbGRyZW4gd2lsbCBoYXZlIHRoZWlyIHBhcmVudGFnZSBzZXQgdG8KLSAgICAgKiBudWxsLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3QgdGhhdCBhbnkgYWN0aXZlIGxpc3QgKHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aAotICAgICAqIGEgY2FsbCB0byBvbmUgb2YgdGhlIHtAbGluayAjZ2V0Q29udGVudH0gbWV0aG9kcyB3aWxsIGFsc28gY2hhbmdlCi0gICAgICogdG8gcmVmbGVjdCB0aGUgbmV3IGNvbnRlbnQuICBJbiBhZGRpdGlvbiwgYWxsIGNvbnRlbnQgaW4gdGhlIHN1cHBsaWVkCi0gICAgICogY29sbGVjdGlvbiB3aWxsIGhhdmUgdGhlaXIgcGFyZW50YWdlIHNldCB0byB0aGlzIHBhcmVudC4gIElmIHRoZSB1c2VyCi0gICAgICogd2FudHMgdG8gY29udGludWUgd29ya2luZyB3aXRoIGEgPGI+ImxpdmUiPC9iPiBsaXN0IG9mIHRoaXMgcGFyZW50J3MKLSAgICAgKiBjaGlsZCwgdGhlbiBhIGNhbGwgdG8gc2V0Q29udGVudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZQotICAgICAqIG9mIHRoZSB7QGxpbmsgI2dldENvbnRlbnR9IG1ldGhvZHMgdG8gb2J0YWluIGEgPGI+ImxpdmUiPC9iPgotICAgICAqIHZlcnNpb24gb2YgdGhlIGNoaWxkcmVuLgotICAgICAqIDxwPgotICAgICAqIFBhc3NpbmcgYSBudWxsIGNoaWxkIGNsZWFycyB0aGUgZXhpc3RpbmcgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBldmVudCBvZiBhbiBleGNlcHRpb24gdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2lsbCBiZSB1bmNoYW5nZWQgYW5kCi0gICAgICogdGhlIHN1cHBsaWVkIGNoaWxkIHdpbGwgYmUgdW5hbHRlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoaWxkIG5ldyBjb250ZW50IHRvIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudAotICAgICAqIEByZXR1cm4gICAgICAgICAgIHRoZSBwYXJlbnQgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCBjaGlsZCBpcyBhbHJlYWR5IGF0dGFjaGVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5vdCBsZWdhbCBjb250ZW50IGZvciBhbiBFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgc2V0Q29udGVudChDb250ZW50IGNoaWxkKSB7Ci0gICAgICAgIGNvbnRlbnQuY2xlYXIoKTsKLSAgICAgICAgY29udGVudC5hZGQoY2hpbGQpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBlbGVtZW50IGlzIHRoZSBhbmNlc3RvciBvZiBhbm90aGVyIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byBjaGVjayBhZ2FpbnN0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgdGhlIGFuY2VzdG9yIG9mIHRoZQotICAgICAqICAgICAgICAgc3VwcGxpZWQgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQW5jZXN0b3IoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIE9iamVjdCBwID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKHAgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAocCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwID0gKChFbGVtZW50KSBwKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRoZSBjb21wbGV0ZSBzZXQgb2YgYXR0cmlidXRlcyBmb3IgdGhpcyBlbGVtZW50LCBhcyBhCi0gICAgICogPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiBvYmplY3RzIGluIG5vIHBhcnRpY3VsYXIKLSAgICAgKiBvcmRlciwgb3IgYW4gZW1wdHkgbGlzdCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICAgKiBUaGUgcmV0dXJuZWQgbGlzdCBpcyAibGl2ZSIgYW5kIGNoYW5nZXMgdG8gaXQgYWZmZWN0IHRoZQotICAgICAqIGVsZW1lbnQncyBhY3R1YWwgYXR0cmlidXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZm9yIHRoaXMgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogYW5kIHdpdGhpbiBubyBuYW1lc3BhY2UsIG9yIG51bGwgaWYgbm8gc3VjaCBhdHRyaWJ1dGUgZXhpc3RzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIGF0dHJpYnV0ZSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWUsIE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgYXR0cmlidXRlIGZvciB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGFuZCB3aXRoaW4gdGhlIGdpdmVuIE5hbWVzcGFjZSwgb3IgbnVsbCBpZiBubyBzdWNoIGF0dHJpYnV0ZSBleGlzdHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJldHVybgotICAgICAqIEBwYXJhbSBucyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIHNlYXJjaCB3aXRoaW4KLSAgICAgKiBAcmV0dXJuIGF0dHJpYnV0ZSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIHJldHVybiAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChuYW1lLCBucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGFuZCB3aXRoaW4gbm8gbmFtZXNwYWNlLCBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggYXR0cmlidXRlLCBhbmQgdGhlCi0gICAgICogZW1wdHkgc3RyaW5nIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZW1wdHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiB0aGUgbmFtZWQgYXR0cmlidXRlJ3MgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLCBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogYW5kIHdpdGhpbiBubyBuYW1lc3BhY2UsIG9yIHRoZSBwYXNzZWQtaW4gZGVmYXVsdCBpZiB0aGVyZSBpcyBubwotICAgICAqIHN1Y2ggYXR0cmlidXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSB0byBiZSByZXR1cm5lZAotICAgICAqIEBwYXJhbSBkZWYgYSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0Ci0gICAgICogQHJldHVybiB0aGUgbmFtZWQgYXR0cmlidXRlJ3MgdmFsdWUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vIHN1Y2ggYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZikgewotICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUobmFtZSwgTmFtZXNwYWNlLk5PX05BTUVTUEFDRSwgZGVmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogYW5kIHdpdGhpbiB0aGUgZ2l2ZW4gTmFtZXNwYWNlLCBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggYXR0cmlidXRlLCBhbmQKLSAgICAgKiB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgZW1wdHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVkIGlzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHBhcmFtIG5zIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gdG8gc2VhcmNoIHdpdGhpbgotICAgICAqIEByZXR1cm4gdGhlIG5hbWVkIGF0dHJpYnV0ZSdzIHZhbHVlLCBvciBudWxsIGlmIG5vIHN1Y2ggYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLCBucywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGFuZCB3aXRoaW4gdGhlIGdpdmVuIE5hbWVzcGFjZSwgb3IgdGhlIHBhc3NlZC1pbiBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vCi0gICAgICogc3VjaCBhdHRyaWJ1dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVkIGlzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHBhcmFtIG5zIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gdG8gc2VhcmNoIHdpdGhpbgotICAgICAqIEBwYXJhbSBkZWYgYSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0Ci0gICAgICogQHJldHVybiB0aGUgbmFtZWQgYXR0cmlidXRlJ3MgdmFsdWUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vIHN1Y2ggYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zLCBTdHJpbmcgZGVmKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChuYW1lLCBucyk7Ci0gICAgICAgIHJldHVybiAoYXR0cmlidXRlID09IG51bGwpID8gZGVmIDogYXR0cmlidXRlLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50LiAgVGhlIHN1cHBsaWVkIExpc3Qgc2hvdWxkCi0gICAgICogY29udGFpbiBvbmx5IG9iamVjdHMgb2YgdHlwZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYWxsIG9iamVjdHMgaW4gdGhlIHN1cHBsaWVkIExpc3QgYXJlIGxlZ2FsIGFuZCBiZWZvcmUgdGhlIG5ldwotICAgICAqIGF0dHJpYnV0ZXMgYXJlIGFkZGVkLCBhbGwgb2xkIGF0dHJpYnV0ZXMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICogcGFyZW50YWdlIHNldCB0byBudWxsIChubyBwYXJlbnQpIGFuZCB0aGUgb2xkIGF0dHJpYnV0ZSBsaXN0IHdpbGwgYmUKLSAgICAgKiBjbGVhcmVkLiBUaGlzIGhhcyB0aGUgZWZmZWN0IHRoYXQgYW55IGFjdGl2ZSBhdHRyaWJ1dGUgbGlzdCAocHJldmlvdXNseQotICAgICAqIG9idGFpbmVkIHdpdGggYSBjYWxsIHRvIHtAbGluayAjZ2V0QXR0cmlidXRlc30pIHdpbGwgYWxzbyBjaGFuZ2UgdG8KLSAgICAgKiByZWZsZWN0IHRoZSBuZXcgYXR0cmlidXRlcy4gIEluIGFkZGl0aW9uLCBhbGwgYXR0cmlidXRlcyBpbiB0aGUgc3VwcGxpZWQKLSAgICAgKiBMaXN0IHdpbGwgaGF2ZSB0aGVpciBwYXJlbnRhZ2Ugc2V0IHRvIHRoaXMgZWxlbWVudCwgYnV0IHRoZSBMaXN0IGl0c2VsZgotICAgICAqIHdpbGwgbm90IGJlICJsaXZlIiBhbmQgZnVydGhlciByZW1vdmFscyBhbmQgYWRkaXRpb25zIHdpbGwgaGF2ZSBubwotICAgICAqIGVmZmVjdCBvbiB0aGlzIGVsZW1lbnRzIGF0dHJpYnV0ZXMuIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlCi0gICAgICogd29ya2luZyB3aXRoIGEgImxpdmUiIGF0dHJpYnV0ZSBsaXN0LCB0aGVuIGEgY2FsbCB0byBzZXRBdHRyaWJ1dGVzCi0gICAgICogc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byB7QGxpbmsgI2dldEF0dHJpYnV0ZXN9IHRvIG9idGFpbiBhCi0gICAgICogImxpdmUiIHZlcnNpb24gb2YgdGhlIGF0dHJpYnV0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogUGFzc2luZyBhIG51bGwgb3IgZW1wdHkgTGlzdCBjbGVhcnMgdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPHA+Ci0gICAgICogSW4gY2FzZXMgd2hlcmUgdGhlIExpc3QgY29udGFpbnMgZHVwbGljYXRlIGF0dHJpYnV0ZXMsIG9ubHkgdGhlIGxhc3QKLSAgICAgKiBvbmUgd2lsbCBiZSByZXRhaW5lZC4gIFRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCi0gICAgICoge0BsaW5rICNzZXRBdHRyaWJ1dGUoQXR0cmlidXRlKX0gc2VxdWVudGlhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIEluIGV2ZW50IG9mIGFuIGV4Y2VwdGlvbiB0aGUgb3JpZ2luYWwgYXR0cmlidXRlcyB3aWxsIGJlIHVuY2hhbmdlZCBhbmQKLSAgICAgKiB0aGUgYXR0cmlidXRlcyBpbiB0aGUgc3VwcGxpZWQgYXR0cmlidXRlcyB3aWxsIGJlIHVuYWx0ZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3QXR0cmlidXRlcyA8Y29kZT5MaXN0PC9jb2RlPiBvZiBhdHRyaWJ1dGVzIHRvIHNldAotICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50IG1vZGlmaWVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBMaXN0IGNvbnRhaW5zIG9iamVjdHMKLSAgICAgKiAgICAgICAgIHRoYXQgYXJlIG5vdCBpbnN0YW5jZXMgb2YgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIG9yIGlmIGFueSBvZiB0aGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiBvYmplY3RzIGhhdmUKLSAgICAgKiAgICAgICAgIGNvbmZsaWN0aW5nIG5hbWVzcGFjZSBwcmVmaXhlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXRBdHRyaWJ1dGVzKExpc3QgbmV3QXR0cmlidXRlcykgewotICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyQW5kU2V0KG5ld0F0dHJpYnV0ZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHNldHMgYW4gYXR0cmlidXRlIHZhbHVlIGZvciB0aGlzIGVsZW1lbnQuICBBbnkgZXhpc3RpbmcgYXR0cmlidXRlCi0gICAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJIGlzIHJlbW92ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAotICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50IG1vZGlmaWVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBpbGxlZ2FsIGFzIGFuCi0gICAgICogICAgICAgICBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIGRhdGEgKGFzIGRldGVybWluZWQgYnkKLSAgICAgKiAgICAgICAgIHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gc2V0QXR0cmlidXRlKG5ldyBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHNldHMgYW4gYXR0cmlidXRlIHZhbHVlIGZvciB0aGlzIGVsZW1lbnQuICBBbnkgZXhpc3RpbmcgYXR0cmlidXRlCi0gICAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJIGlzIHJlbW92ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAotICAgICAqIEBwYXJhbSBucyBuYW1lc3BhY2Ugb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQKLSAgICAgKiBAcmV0dXJuIHRoaXMgZWxlbWVudCBtb2RpZmllZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgaWxsZWdhbCBhcyBhbgotICAgICAqICAgICAgICAgYXR0cmlidXRlIG5hbWUsIG9yIGlmIHRoZSBuYW1lc3BhY2UgaXMgYW4gdW5wcmVmaXhlZCBkZWZhdWx0Ci0gICAgICogICAgICAgICBuYW1lc3BhY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMKLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIGRhdGEgKGFzIGRldGVybWluZWQgYnkKLSAgICAgKiAgICAgICAgIHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBZGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICogICAgICAgICBjb2xsaWRlcyB3aXRoIGFub3RoZXIgbmFtZXNwYWNlIHByZWZpeCBvbiB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIHJldHVybiBzZXRBdHRyaWJ1dGUobmV3IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgbnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHNldHMgYW4gYXR0cmlidXRlIHZhbHVlIGZvciB0aGlzIGVsZW1lbnQuICBBbnkgZXhpc3RpbmcgYXR0cmlidXRlCi0gICAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJIGlzIHJlbW92ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IHRvIHNldAotICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50IG1vZGlmaWVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWRkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGUgYmVpbmcgYWRkZWQgYWxyZWFkeSBoYXMgYQotICAgICAqICAgcGFyZW50IG9yIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZXNwYWNlIHByZWZpeCBjb2xsaWRlcyB3aXRoIGFub3RoZXIKLSAgICAgKiAgIG5hbWVzcGFjZSBwcmVmaXggb24gdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgd2l0aGluIG5vCi0gICAgICogbmFtZXNwYWNlLiBJZiBubyBzdWNoIGF0dHJpYnV0ZSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGF0dHJpYnV0ZSB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcmVtb3ZlQXR0cmlidXRlKG5hbWUsIE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHdpdGhpbiB0aGUKLSAgICAgKiBnaXZlbiBOYW1lc3BhY2UuICBJZiBubyBzdWNoIGF0dHJpYnV0ZSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMKLSAgICAgKiBub3RoaW5nLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgYXR0cmlidXRlIHRvIHJlbW92ZQotICAgICAqIEBwYXJhbSBucyBuYW1lc3BhY2UgVVJJIG9mIGF0dHJpYnV0ZSB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlbW92ZShuYW1lLCBucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZW1vdmVzIHRoZSBzdXBwbGllZCBBdHRyaWJ1dGUgc2hvdWxkIGl0IGV4aXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgUmVmZXJlbmNlIHRvIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlbW92ZShhdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqICBUaGlzIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAqICAgIDxjb2RlPkVsZW1lbnQ8L2NvZGU+LCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiBJZiB0aGUgWE1MCi0gICAgICogICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGlzIGRlc2lyZWQsCi0gICAgICogICAge0BsaW5rIG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXIjb3V0cHV0U3RyaW5nKEVsZW1lbnQpfQotICAgICAqICAgIHNob3VsZCBiZSB1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAqICAgICAgICAgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nRm9ybSA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpCi0gICAgICAgICAgICAuYXBwZW5kKCJbRWxlbWVudDogPCIpCi0gICAgICAgICAgICAuYXBwZW5kKGdldFF1YWxpZmllZE5hbWUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5zdXJpID0gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmICghbnN1cmkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgc3RyaW5nRm9ybQotICAgICAgICAgICAgLmFwcGVuZCgiIFtOYW1lc3BhY2U6ICIpCi0gICAgICAgICAgICAuYXBwZW5kKG5zdXJpKQotICAgICAgICAgICAgLmFwcGVuZCgiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZ0Zvcm0uYXBwZW5kKCIvPl0iKTsKLQotICAgICAgICByZXR1cm4gc3RyaW5nRm9ybS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqICBUaGlzIHJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKiAgVGhlIG5ldyBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gaXRzIHBhcmVudCwgYW5kIGdldFBhcmVudCgpCi0gICAgICogIG9uIHRoZSBjbG9uZSB3aWxsIHJldHVybiBudWxsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNsb25lIG9mIHRoaXMgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0KLSAgICAgICAgLy8gS2VuIFJ1bmUgSGVsbGFuZCA8a2VuaEBjc2Mubm8+IGlzIG91ciBsb2NhbCBjbG9uZSgpIGd1cnUKLQotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgc3VwZXIuY2xvbmUoKTsKLQotICAgICAgICAvLyBuYW1lIGFuZCBuYW1lc3BhY2UgYXJlIHJlZmVyZW5jZXMgdG8gaW1tdXRhYmxlIG9iamVjdHMKLSAgICAgICAgLy8gc28gc3VwZXIuY2xvbmUoKSBoYW5kbGVzIHRoZW0gb2sKLQotICAgICAgICAvLyBSZWZlcmVuY2UgdG8gcGFyZW50IGlzIGNvcGllZCBieSBzdXBlci5jbG9uZSgpCi0gICAgICAgIC8vIChPYmplY3QuY2xvbmUoKSkgc28gd2UgaGF2ZSB0byByZW1vdmUgaXQKLSAgICAgICAgLy8gQWN0dWFsbHksIHN1cGVyIGlzIGEgQ29udGVudCwgd2hpY2ggaGFzIGFscmVhZHkgZGV0YWNoZWQgaW4gdGhlIGNsb25lKCkuCi0gICAgICAgIC8vIGVsZW1lbnQucGFyZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBSZWZlcmVuY2UgdG8gY29udGVudCBsaXN0IGFuZCBhdHRyaWJ1dGUgbGlzdHMgYXJlIGNvcHllZCBieQotICAgICAgICAvLyBzdXBlci5jbG9uZSgpIHNvIHdlIHNldCBpdCBuZXcgbGlzdHMgaWYgdGhlIG9yaWdpbmFsIGhhZCBsaXN0cwotICAgICAgICBlbGVtZW50LmNvbnRlbnQgPSBuZXcgQ29udGVudExpc3QoZWxlbWVudCk7Ci0gICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVMaXN0KGVsZW1lbnQpOwotCi0gICAgICAgIC8vIENsb25pbmcgYXR0cmlidXRlcwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpKChBdHRyaWJ1dGUpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsb25pbmcgYWRkaXRpb25hbCBuYW1lc3BhY2VzCi0gICAgICAgIGlmIChhZGRpdGlvbmFsTmFtZXNwYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgYWRkaXRpb25hbFNpemUgPSBhZGRpdGlvbmFsTmFtZXNwYWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBlbGVtZW50LmFkZGl0aW9uYWxOYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdChhZGRpdGlvbmFsU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgYWRkaXRpb25hbCA9IGFkZGl0aW9uYWxOYW1lc3BhY2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LmFkZGl0aW9uYWxOYW1lc3BhY2VzLmFkZChhZGRpdGlvbmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsb25pbmcgY29udGVudAotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gY29udGVudC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbHQgPSAoRWxlbWVudCkoKEVsZW1lbnQpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRlbnQuYWRkKGVsdCk7Ci0gICAgICAgICAgICAgICAgfSAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ0RBVEEpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0RBVEEgY2RhdGEgPSAoQ0RBVEEpKChDREFUQSlvYmopLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29udGVudC5hZGQoY2RhdGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCkoKFRleHQpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRlbnQuYWRkKHRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCkoKENvbW1lbnQpb2JqKS5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRlbnQuYWRkKGNvbW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilvYmopLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29udGVudC5hZGQocGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5UmVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVudGl0eVJlZiBlbnRpdHkgPSAoRW50aXR5UmVmKSgoRW50aXR5UmVmKW9iaikuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250ZW50LmFkZChlbnRpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBhZGRpdGlvbmFsIG5hbWVzcGFjZXMKLSAgICAgICAgaWYgKGFkZGl0aW9uYWxOYW1lc3BhY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEF2b2lkIGFkZGl0aW9uYWxOYW1lc3BhY2VzLmNsb25lKCkgYmVjYXVzZSBMaXN0IGlzbid0IENsb25lYWJsZQotICAgICAgICAgICAgZWxlbWVudC5hZGRpdGlvbmFsTmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGVsZW1lbnQuYWRkaXRpb25hbE5hbWVzcGFjZXMuYWRkQWxsKGFkZGl0aW9uYWxOYW1lc3BhY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8vIFN1cHBvcnQgYSBjdXN0b20gTmFtZXNwYWNlIHNlcmlhbGl6YXRpb24gc28gbm8gdHdvIG5hbWVzcGFjZQotICAgIC8vIG9iamVjdCBpbnN0YW5jZXMgbWF5IGV4aXN0IGZvciB0aGUgc2FtZSBwcmVmaXgvdXJpIHBhaXIKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gV2UgdXNlIHdyaXRlT2JqZWN0KCkgYW5kIG5vdCB3cml0ZVVURigpIHRvIG1pbmltaXplIHNwYWNlCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciB3cml0aW5nIHBvaW50ZXJzIHRvIGFscmVhZHkgd3JpdHRlbiBzdHJpbmdzCi0gICAgICAgIG91dC53cml0ZU9iamVjdChuYW1lc3BhY2UuZ2V0UHJlZml4KCkpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobmFtZXNwYWNlLmdldFVSSSgpKTsKLQotICAgICAgICBpZiAoYWRkaXRpb25hbE5hbWVzcGFjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlKDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IHNpemUgPSBhZGRpdGlvbmFsTmFtZXNwYWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBhZGRpdGlvbmFsID0gKE5hbWVzcGFjZSkgYWRkaXRpb25hbE5hbWVzcGFjZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChhZGRpdGlvbmFsLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoYWRkaXRpb25hbC5nZXRVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotICAgICAgICBpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0gICAgICAgIG5hbWVzcGFjZSA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoCi0gICAgICAgICAgICAoU3RyaW5nKWluLnJlYWRPYmplY3QoKSwgKFN0cmluZylpbi5yZWFkT2JqZWN0KCkpOwotCi0gICAgICAgIGludCBzaXplID0gaW4ucmVhZCgpOwotCi0gICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgIGFkZGl0aW9uYWxOYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIGFkZGl0aW9uYWwgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKWluLnJlYWRPYmplY3QoKSwgKFN0cmluZylpbi5yZWFkT2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxOYW1lc3BhY2VzLmFkZChhZGRpdGlvbmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIGFsbCBkZXNjZW5kYW50cyBpbiBkb2N1bWVudCBvcmRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gd2FsayBkZXNjZW5kYW50cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXREZXNjZW5kYW50cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZXNjZW5kYW50SXRlcmF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgYWxsIGRlc2NlbmRhbnRzIGluIGRvY3VtZW50IG9yZGVyCi0gICAgICogYXBwbHlpbmcgdGhlIEZpbHRlciB0byByZXR1cm4gb25seSBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgcnVsZS4KLSAgICAgKiBXaXRoIGZpbHRlcnMgeW91IGNhbiBtYXRjaCBvbmx5IEVsZW1lbnRzLCBvbmx5IENvbW1lbnRzLCBFbGVtZW50cyBvcgotICAgICAqIENvbW1lbnRzLCBvbmx5IEVsZW1lbnRzIHdpdGggYSBnaXZlbiBuYW1lIGFuZC9vciBwcmVmaXgsIGFuZCBzbyBvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXIgZmlsdGVyIHRvIHNlbGVjdCB3aGljaCBkZXNjZW5kYW50cyB0byBzZWUKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHdhbGsgZGVzY2VuZGFudHMgd2l0aGluIGEgZmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJJdGVyYXRvcihuZXcgRGVzY2VuZGFudEl0ZXJhdG9yKHRoaXMpLCBmaWx0ZXIpOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzCi0gICAgICogbmVzdGVkIGRpcmVjdGx5IChvbmUgbGV2ZWwgZGVlcCkgd2l0aGluIHRoaXMgZWxlbWVudCwgYXMKLSAgICAgKiA8Y29kZT5FbGVtZW50PC9jb2RlPiBvYmplY3RzLiAgSWYgdGhpcyB0YXJnZXQgZWxlbWVudCBoYXMgbm8gbmVzdGVkCi0gICAgICogZWxlbWVudHMsIGFuIGVtcHR5IExpc3QgaXMgcmV0dXJuZWQuICBUaGUgcmV0dXJuZWQgbGlzdCBpcyAibGl2ZSIKLSAgICAgKiBpbiBkb2N1bWVudCBvcmRlciBhbmQgY2hhbmdlcyB0byBpdCBhZmZlY3QgdGhlIGVsZW1lbnQncyBhY3R1YWwKLSAgICAgKiBjb250ZW50cy4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFNlcXVlbnRpYWwgdHJhdmVyc2FsIHRocm91Z2ggdGhlIExpc3QgaXMgYmVzdCBkb25lIHdpdGggYSBJdGVyYXRvcgotICAgICAqIHNpbmNlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudCBvZiBMaXN0LnNpemUoKSBtYXkgbm90IGJlIHRoZSBtb3N0Ci0gICAgICogZWZmaWNpZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIE5vIHJlY3Vyc2lvbiBpcyBwZXJmb3JtZWQsIHNvIGVsZW1lbnRzIG5lc3RlZCB0d28gbGV2ZWxzIGRlZXAKLSAgICAgKiB3b3VsZCBoYXZlIHRvIGJlIG9idGFpbmVkIHdpdGg6Ci0gICAgICogPHByZT4KLSAgICAgKiA8Y29kZT4KLSAgICAgKiAgIEl0ZXJhdG9yIGl0ciA9IChjdXJyZW50RWxlbWVudC5nZXRDaGlsZHJlbigpKS5pdGVyYXRvcigpOwotICAgICAqICAgd2hpbGUoaXRyLmhhc05leHQoKSkgewotICAgICAqICAgICBFbGVtZW50IG9uZUxldmVsRGVlcCA9IChFbGVtZW50KWl0ci5uZXh0KCk7Ci0gICAgICogICAgIExpc3QgdHdvTGV2ZWxzRGVlcCA9IG9uZUxldmVsRGVlcC5nZXRDaGlsZHJlbigpOwotICAgICAqICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGVzZSBjaGlsZHJlbgotICAgICAqICAgfQotICAgICAqIDwvY29kZT4KLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY2hpbGQgPGNvZGU+RWxlbWVudDwvY29kZT4gb2JqZWN0cyBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50LmdldFZpZXcobmV3IEVsZW1lbnRGaWx0ZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgYWxsIHRoZSBjaGlsZCBlbGVtZW50cwotICAgICAqIG5lc3RlZCBkaXJlY3RseSAob25lIGxldmVsIGRlZXApIHdpdGhpbiB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBsb2NhbCBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gbm8gbmFtZXNwYWNlLCByZXR1cm5lZCBhcwotICAgICAqIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG9iamVjdHMuICBJZiB0aGlzIHRhcmdldCBlbGVtZW50IGhhcyBubyBuZXN0ZWQKLSAgICAgKiBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiBuYW1lIG91dHNpZGUgYSBuYW1lc3BhY2UsIGFuIGVtcHR5IExpc3QKLSAgICAgKiBpcyByZXR1cm5lZC4gIFRoZSByZXR1cm5lZCBsaXN0IGlzICJsaXZlIiBpbiBkb2N1bWVudCBvcmRlcgotICAgICAqIGFuZCBjaGFuZ2VzIHRvIGl0IGFmZmVjdCB0aGUgZWxlbWVudCdzIGFjdHVhbCBjb250ZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBQbGVhc2Ugc2VlIHRoZSBub3RlcyBmb3IgPGNvZGU+e0BsaW5rICNnZXRDaGlsZHJlbn08L2NvZGU+Ci0gICAgICogZm9yIGEgY29kZSBleGFtcGxlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGxvY2FsIG5hbWUgZm9yIHRoZSBjaGlsZHJlbiB0byBtYXRjaAotICAgICAqIEByZXR1cm4gYWxsIG1hdGNoaW5nIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKG5hbWUsIE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMKLSAgICAgKiBuZXN0ZWQgZGlyZWN0bHkgKG9uZSBsZXZlbCBkZWVwKSB3aXRoaW4gdGhpcyBlbGVtZW50IHdpdGggdGhlIGdpdmVuCi0gICAgICogbG9jYWwgbmFtZSBhbmQgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBOYW1lc3BhY2UsIHJldHVybmVkIGFzCi0gICAgICogPGNvZGU+RWxlbWVudDwvY29kZT4gb2JqZWN0cy4gIElmIHRoaXMgdGFyZ2V0IGVsZW1lbnQgaGFzIG5vIG5lc3RlZAotICAgICAqIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIE5hbWVzcGFjZSwgYW4gZW1wdHkgTGlzdAotICAgICAqIGlzIHJldHVybmVkLiAgVGhlIHJldHVybmVkIGxpc3QgaXMgImxpdmUiIGluIGRvY3VtZW50IG9yZGVyCi0gICAgICogYW5kIGNoYW5nZXMgdG8gaXQgYWZmZWN0IHRoZSBlbGVtZW50J3MgYWN0dWFsIGNvbnRlbnRzLgotICAgICAqIDxwPgotICAgICAqIFBsZWFzZSBzZWUgdGhlIG5vdGVzIGZvciA8Y29kZT57QGxpbmsgI2dldENoaWxkcmVufTwvY29kZT4KLSAgICAgKiBmb3IgYSBjb2RlIGV4YW1wbGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbG9jYWwgbmFtZSBmb3IgdGhlIGNoaWxkcmVuIHRvIG1hdGNoCi0gICAgICogQHBhcmFtIG5zIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gdG8gc2VhcmNoIHdpdGhpbgotICAgICAqIEByZXR1cm4gYWxsIG1hdGNoaW5nIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIG5hbWUsIE5hbWVzcGFjZSBucykgewotICAgICAgICByZXR1cm4gY29udGVudC5nZXRWaWV3KG5ldyBFbGVtZW50RmlsdGVyKG5hbWUsIG5zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IHdpdGhpbiB0aGlzIGVsZW1lbnQgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBsb2NhbCBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiBJZiBubyBlbGVtZW50cyBleGlzdCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UsIG51bGwgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGxvY2FsIG5hbWUgb2YgY2hpbGQgZWxlbWVudCB0byBtYXRjaAotICAgICAqIEBwYXJhbSBucyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIHNlYXJjaCB3aXRoaW4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBtYXRjaGluZyBjaGlsZCBlbGVtZW50LCBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGdldENoaWxkKFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbnMpIHsKLSAgICAgICAgTGlzdCBlbGVtZW50cyA9IGNvbnRlbnQuZ2V0VmlldyhuZXcgRWxlbWVudEZpbHRlcihuYW1lLCBucykpOwotICAgICAgICBJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCB3aXRoaW4gdGhpcyBlbGVtZW50IHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbG9jYWwgbmFtZSBhbmQgYmVsb25naW5nIHRvIG5vIG5hbWVzcGFjZS4KLSAgICAgKiBJZiBubyBlbGVtZW50cyBleGlzdCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UsIG51bGwgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGxvY2FsIG5hbWUgb2YgY2hpbGQgZWxlbWVudCB0byBtYXRjaAotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIGNoaWxkIGVsZW1lbnQsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkKG5hbWUsIE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCAob25lIGxldmVsIGRlZXApIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbG9jYWwgbmFtZSBhbmQgYmVsb25naW5nIHRvIG5vIG5hbWVzcGFjZS4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjaGlsZCB3YXMgcmVtb3ZlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBjaGlsZCBlbGVtZW50cyB0byByZW1vdmUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZGVsZXRpb24gb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDaGlsZChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcmVtb3ZlQ2hpbGQobmFtZSwgTmFtZXNwYWNlLk5PX05BTUVTUEFDRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyByZW1vdmVzIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IChvbmUgbGV2ZWwgZGVlcCkgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBsb2NhbCBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjaGlsZCB3YXMgcmVtb3ZlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBjaGlsZCBlbGVtZW50IHRvIHJlbW92ZQotICAgICAqIEBwYXJhbSBucyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIHNlYXJjaCB3aXRoaW4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZGVsZXRpb24gb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDaGlsZChTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIExpc3Qgb2xkID0gY29udGVudC5nZXRWaWV3KG5ldyBFbGVtZW50RmlsdGVyKG5hbWUsIG5zKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBvbGQuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpLm5leHQoKTsKLSAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlbW92ZXMgYWxsIGNoaWxkIGVsZW1lbnRzIChvbmUgbGV2ZWwgZGVlcCkgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBsb2NhbCBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gbm8gbmFtZXNwYWNlLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgd2VyZSByZW1vdmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGNoaWxkIGVsZW1lbnRzIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gd2hldGhlciBkZWxldGlvbiBvY2N1cnJlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUNoaWxkcmVuKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiByZW1vdmVDaGlsZHJlbihuYW1lLCBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlbW92ZXMgYWxsIGNoaWxkIGVsZW1lbnRzIChvbmUgbGV2ZWwgZGVlcCkgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBsb2NhbCBuYW1lIGFuZCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHdlcmUgcmVtb3ZlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBjaGlsZCBlbGVtZW50cyB0byByZW1vdmUKLSAgICAgKiBAcGFyYW0gbnMgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0byBzZWFyY2ggd2l0aGluCi0gICAgICogQHJldHVybiB3aGV0aGVyIGRlbGV0aW9uIG9jY3VycmVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ2hpbGRyZW4oU3RyaW5nIG5hbWUsIE5hbWVzcGFjZSBucykgewotICAgICAgICBib29sZWFuIGRlbGV0ZWRTb21lID0gZmFsc2U7Ci0KLSAgICAgICAgTGlzdCBvbGQgPSBjb250ZW50LmdldFZpZXcobmV3IEVsZW1lbnRGaWx0ZXIobmFtZSwgbnMpKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IG9sZC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGkubmV4dCgpOwotICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgIGRlbGV0ZWRTb21lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWxldGVkU29tZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRW50aXR5UmVmLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0VudGl0eVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzIyNDc0Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRW50aXR5UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyotLQotCi0gJElkOiBFbnRpdHlSZWYuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb207Ci0KLS8qKgotICogQW4gWE1MIGVudGl0eSByZWZlcmVuY2UuIE1ldGhvZHMgYWxsb3cgdGhlIHVzZXIgdG8gbWFuYWdlIGl0cyBuYW1lLCBwdWJsaWMKLSAqIGlkLCBhbmQgc3lzdGVtIGlkLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICogQGF1dGhvciAgUGhpbGlwIE5lbHNvbgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVmIGV4dGVuZHMgQ29udGVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICJAKCMpICRSQ1NmaWxlOiBFbnRpdHlSZWYuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIDxjb2RlPkVudGl0eVJlZjwvY29kZT4gKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKiogVGhlIFB1YmxpY0lEIG9mIHRoZSA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+ICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRDsKLQotICAgIC8qKiBUaGUgU3lzdGVtSUQgb2YgdGhlIDxjb2RlPkVudGl0eVJlZjwvY29kZT4gKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlEOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCwgbm8tYXJncyBjb25zdHJ1Y3RvciBmb3IgaW1wbGVtZW50YXRpb25zIHRvIHVzZSBpZiBuZWVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVudGl0eVJlZigpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkVudGl0eVJlZjwvY29kZT4gd2l0aCB0aGUgc3VwcGxpZWQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgbm90IGEgbGVnYWwKLSAgICAgKiAgICAgICAgIFhNTCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkVudGl0eVJlZjwvY29kZT4KLSAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBzeXN0ZW0gaWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkgcmVmZXJlbmNlIGJlaW5nIGNvbnN0cnVjdGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgYSBsZWdhbAotICAgICAqICAgICAgICAgWE1MIG5hbWUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gc3lzdGVtIElEIGlzIG5vdCBhIGxlZ2FsCi0gICAgICogICAgICAgICBzeXN0ZW0gbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5UmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgc3lzdGVtSUQpIHsKLSAgICAgICAgdGhpcyhuYW1lLCBudWxsLCBzeXN0ZW1JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+Ci0gICAgICogd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSwgcHVibGljIGlkLCBhbmQgc3lzdGVtIGlkLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHB1YmxpY0lEIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5IHJlZmVyZW5jZSBiZWluZyBjb25zdHJ1Y3RlZAotICAgICAqIEBwYXJhbSBzeXN0ZW1JRCBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eSByZWZlcmVuY2UgYmVpbmcgY29uc3RydWN0ZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzeXN0ZW0gSUQgaXMgbm90IGEgbGVnYWwKLSAgICAgKiAgICAgICAgIHN5c3RlbSBsaXRlcmFsIG9yIHRoZSB0aGUgZ2l2ZW4gcHVibGljIElEIGlzIG5vdCBhCi0gICAgICogICAgICAgICBsZWdhbCBwdWJsaWMgSUQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBhIGxlZ2FsCi0gICAgICogICAgICAgICBYTUwgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5UmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRQdWJsaWNJRChwdWJsaWNJRCk7Ci0gICAgICAgIHNldFN5c3RlbUlEKHN5c3RlbUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPkVudGl0eVJlZjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBlbnRpdHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBzaW5jZSBlbnRpdHkgcmVmZXJlbmNlcyBkb24ndCBoYXZlIGFuIFhQYXRoCi0gICAgICogMS4wIHN0cmluZyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gIiI7ICAvLyBlbnRpdHkgcmVmZXJlbmNlcyBkb24ndCBoYXZlIFhQYXRoIHN0cmluZyB2YWx1ZXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBwdWJsaWQgSUQgb2YgdGhpcyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+LgotICAgICAqIElmIHRoZXJlIGlzIG5vIHB1YmxpYyBJRCwgdGhlbiB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHB1YmxpYyBJRCBvZiB0aGlzIDxjb2RlPkVudGl0eVJlZjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotICAgICAgICByZXR1cm4gcHVibGljSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgc3lzdGVtIElEIG9mIHRoaXMgPGNvZGU+RW50aXR5UmVmPC9jb2RlPi4KLSAgICAgKiBJZiB0aGVyZSBpcyBubyBzeXN0ZW0gSUQsIHRoZW4gdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiBzeXN0ZW0gSUQgb2YgdGhpcyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLSAgICAgICAgcmV0dXJuIHN5c3RlbUlEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIG5hbWUgb2YgdGhpcyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmV3IG5hbWUgb2YgdGhlIGVudGl0eQotICAgICAqIEByZXR1cm4gdGhpcyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+IG1vZGlmaWVkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgbm90IGEgbGVnYWwKLSAgICAgKiAgICAgICAgIFhNTCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZWYgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyBUaGlzIGNhbiBjb250YWluIGEgY29sb24gc28gd2UgdXNlIGNoZWNrWE1MTmFtZSgpCi0gICAgICAgIC8vIGluc3RlYWQgb2YgY2hlY2tFbGVtZW50TmFtZSgpCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1hNTE5hbWUobmFtZSk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxOYW1lRXhjZXB0aW9uKG5hbWUsICJFbnRpdHlSZWYiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIHB1YmxpYyBJRCBvZiB0aGlzIDxjb2RlPkVudGl0eVJlZjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHVibGljSUQgbmV3IHB1YmxpYyBpZAotICAgICAqIEByZXR1cm4gdGhpcyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+IG1vZGlmaWVkLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHB1YmxpYyBJRCBpcyBub3QgYSBsZWdhbAotICAgICAqICAgICAgICAgcHVibGljIElELgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZWYgc2V0UHVibGljSUQoU3RyaW5nIHB1YmxpY0lEKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1B1YmxpY0lEKHB1YmxpY0lEKTsKLSAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24ocHVibGljSUQsICJFbnRpdHlSZWYiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHVibGljSUQgPSBwdWJsaWNJRDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgc3lzdGVtIElEIG9mIHRoaXMgPGNvZGU+RW50aXR5UmVmPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeXN0ZW1JRCBuZXcgc3lzdGVtIGlkCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGF0YUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gc3lzdGVtIElEIGlzIG5vdCBhIGxlZ2FsCi0gICAgICogICAgICAgICBzeXN0ZW0gbGl0ZXJhbC4KLSAgICAgKiBAcmV0dXJuIHRoaXMgPGNvZGU+RW50aXR5UmVmPC9jb2RlPiBtb2RpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5UmVmIHNldFN5c3RlbUlEKFN0cmluZyBzeXN0ZW1JRCkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gVmVyaWZpZXIuY2hlY2tTeXN0ZW1MaXRlcmFsKHN5c3RlbUlEKTsKLSAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24oc3lzdGVtSUQsICJFbnRpdHlSZWYiLCByZWFzb24pOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+LCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICAgICogICAgICAgICA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgLmFwcGVuZCgiW0VudGl0eVJlZjogIikKLSAgICAgICAgICAgIC5hcHBlbmQoIiYiKQotICAgICAgICAgICAgLmFwcGVuZChuYW1lKQotICAgICAgICAgICAgLmFwcGVuZCgiOyIpCi0gICAgICAgICAgICAuYXBwZW5kKCJdIikKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRmlsdGVySXRlcmF0b3IuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vRmlsdGVySXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2MTJlYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0ZpbHRlckl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyotLQotCi0gJElkOiBGaWx0ZXJJdGVyYXRvci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTcgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5qZG9tLmZpbHRlci4qOwotCi0vKioKLSAqIFRyYXZlcnNlIGEgcGFyZW50J3MgY2hpbGRyZW4gdGhhdCBtYXRjaCB0aGUgc3VwcGxpZWQgZmlsdGVyLgotICoKLSAqIEBhdXRob3IgQnJhZGxleSBTLiBIdWZmbWFuCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkCi0gKi8KLWNsYXNzIEZpbHRlckl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLSAgICBwcml2YXRlIEZpbHRlciBmaWx0ZXI7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbmV4dE9iamVjdDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgICAgICAgIkAoIykgJFJDU2ZpbGU6IEZpbHRlckl0ZXJhdG9yLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJCAkTmFtZTogICQiOwotCi0gICAgcHVibGljIEZpbHRlckl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIGlmICgoaXRlcmF0b3IgPT0gbnVsbCkgfHwgKGZpbHRlciA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBwYXJhbWV0ZXIiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIGlmIChuZXh0T2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhvYmopKSB7Ci0gICAgICAgICAgICAgICAgbmV4dE9iamVjdCA9IG9iajsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICBpZiAoIWhhc05leHQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvYmogPSBuZXh0T2JqZWN0OwotICAgICAgICBuZXh0T2JqZWN0ID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIC8vIFhYWCBDb3VsZCBjYXVzZSBwcm9icyBmb3Igc3VyZSBpZiBoYXNOZXh0KCkgaXMKLSAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSB0aGUgcmVtb3ZlKCksIGFsdGhvdWdoIHRoYXQncyB1bmxpa2VseS4KLSAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9JbGxlZ2FsQWRkRXhjZXB0aW9uLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0lsbGVnYWxBZGRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliZGYwYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0lsbGVnYWxBZGRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKi0tIAotCi0gJElkOiBJbGxlZ2FsQWRkRXhjZXB0aW9uLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0cnlpbmcgdG8gYWRkIGEgaWxsZWdhbCBvYmplY3QgdG8gYSBKRE9NIGNvbnN0cnVjdC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIElsbGVnYWxBZGRFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IElsbGVnYWxBZGRFeGNlcHRpb24uamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSA8Y29kZT57QGxpbmsgQXR0cmlidXRlfTwvY29kZT4KLSAgICAgKiB0byB0aGUgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPiBpcyBpbGxlZ2FsLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgPGNvZGU+RWxlbWVudDwvY29kZT4gdGhhdCA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+Ci0gICAgICogICAgICAgIGNvdWxkbid0IGJlIGFkZGVkIHRvCi0gICAgICogQHBhcmFtIGFkZGVkIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihFbGVtZW50IGJhc2UsIEF0dHJpYnV0ZSBhZGRlZCwgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiVGhlIGF0dHJpYnV0ZSBcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYWRkZWQuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBjb3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGJhc2UuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIjogIikKLSAgICAgICAgICAgICAgLmFwcGVuZChyZWFzb24pCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+Ci0gICAgICogdG8gcGFyZW50IGlzIGlsbGVnYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB0aGF0IHRoZSBjaGlsZAotICAgICAqICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0aGF0IGNvdWxkIG5vdCBiZSBhZGRlZAotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBJbGxlZ2FsQWRkRXhjZXB0aW9uKEVsZW1lbnQgYmFzZSwgRWxlbWVudCBhZGRlZCwgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiVGhlIGVsZW1lbnQgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGFkZGVkLmdldFF1YWxpZmllZE5hbWUoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCIgY291bGQgbm90IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGJhc2UuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIjogIikKLSAgICAgICAgICAgICAgLmFwcGVuZChyZWFzb24pCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+Ci0gICAgICogdG8gdGhlIDxjb2RlPntAbGluayBEb2N1bWVudH08L2NvZGU+IGlzIGlsbGVnYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRkZWQgPGNvZGU+RWxlbWVudDwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihFbGVtZW50IGFkZGVkLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgZWxlbWVudCBcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYWRkZWQuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBjb3VsZCBub3QgYmUgYWRkZWQgYXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50OiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259PC9jb2RlPgotICAgICAqIHRvIHRoZSA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+IGlzIGlsbGVnYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB0aGF0IHRoZQotICAgICAqICAgICAgICAgICAgICA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IGNvdWxkbid0IGJlIGFkZGVkIHRvCi0gICAgICogQHBhcmFtIGFkZGVkIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihFbGVtZW50IGJhc2UsIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBhZGRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgUEkgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGFkZGVkLmdldFRhcmdldCgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBjb3VsZCBub3QgYmUgYWRkZWQgYXMgY29udGVudCB0byBcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYmFzZS5nZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlwiOiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259PC9jb2RlPgotICAgICAqIHRvIHRoZSA8Y29kZT57QGxpbmsgRG9jdW1lbnR9PC9jb2RlPiBpcyBpbGxlZ2FsLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkZGVkIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gYWRkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiVGhlIFBJIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChhZGRlZC5nZXRUYXJnZXQoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCIgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGRvY3VtZW50OiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBDb21tZW50fTwvY29kZT4KLSAgICAgKiB0byB0aGUgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPiBpcyBpbGxlZ2FsLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgPGNvZGU+RWxlbWVudDwvY29kZT4gdGhhdCB0aGUgPGNvZGU+Q29tbWVudDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5Db21tZW50PC9jb2RlPiB0aGF0IGNvdWxkIG5vdCBiZSBhZGRlZAotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBJbGxlZ2FsQWRkRXhjZXB0aW9uKEVsZW1lbnQgYmFzZSwgQ29tbWVudCBhZGRlZCwgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiVGhlIGNvbW1lbnQgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGFkZGVkLmdldFRleHQoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCIgY291bGQgbm90IGJlIGFkZGVkIGFzIGNvbnRlbnQgdG8gXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGJhc2UuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIjogIikKLSAgICAgICAgICAgICAgLmFwcGVuZChyZWFzb24pCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBDREFUQX08L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB0aGF0IHRoZSA8Y29kZT5DREFUQTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5DREFUQTwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihFbGVtZW50IGJhc2UsIENEQVRBIGFkZGVkLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgQ0RBVEEgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGFkZGVkLmdldFRleHQoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCIgY291bGQgbm90IGJlIGFkZGVkIGFzIGNvbnRlbnQgdG8gXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGJhc2UuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIjogIikKLSAgICAgICAgICAgICAgLmFwcGVuZChyZWFzb24pCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBUZXh0fTwvY29kZT4KLSAgICAgKiB0byB0aGUgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPiBpcyBpbGxlZ2FsLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgPGNvZGU+RWxlbWVudDwvY29kZT4gdGhhdCB0aGUgPGNvZGU+Q29tbWVudDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5UZXh0PC9jb2RlPiB0aGF0IGNvdWxkIG5vdCBiZSBhZGRlZAotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBJbGxlZ2FsQWRkRXhjZXB0aW9uKEVsZW1lbnQgYmFzZSwgVGV4dCBhZGRlZCwgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiVGhlIFRleHQgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGFkZGVkLmdldFRleHQoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCIgY291bGQgbm90IGJlIGFkZGVkIGFzIGNvbnRlbnQgdG8gXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKGJhc2UuZ2V0UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIjogIikKLSAgICAgICAgICAgICAgLmFwcGVuZChyZWFzb24pCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIGFkZGl0aW9uIG9mIHRoZSA8Y29kZT57QGxpbmsgQ29tbWVudH08L2NvZGU+Ci0gICAgICogdG8gdGhlIDxjb2RlPntAbGluayBEb2N1bWVudH08L2NvZGU+IGlzIGlsbGVnYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRkZWQgPGNvZGU+Q29tbWVudDwvY29kZT4gdGhhdCBjb3VsZCBub3QgYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgSWxsZWdhbEFkZEV4Y2VwdGlvbihDb21tZW50IGFkZGVkLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgY29tbWVudCBcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYWRkZWQuZ2V0VGV4dCgpKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBjb3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgZG9jdW1lbnQ6ICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQocmVhc29uKQotICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGluZGljYXRpbmcKLSAgICAgKiB0aGF0IHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+e0BsaW5rIEVudGl0eVJlZn08L2NvZGU+Ci0gICAgICogdG8gdGhlIDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4gaXMgaWxsZWdhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRoYXQgdGhlIDxjb2RlPkVudGl0eVJlZjwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+IHJlZmVyZW5jZSB0aGF0IGNvdWxkIG5vdCBiZSBhZGRlZAotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBJbGxlZ2FsQWRkRXhjZXB0aW9uKEVsZW1lbnQgYmFzZSwgRW50aXR5UmVmIGFkZGVkLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgZW50aXR5IHJlZmVyZW5jZVwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChhZGRlZC5nZXROYW1lKCkpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlwiIGNvdWxkIG5vdCBiZSBhZGRlZCBhcyBjb250ZW50IHRvIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChiYXNlLmdldFF1YWxpZmllZE5hbWUoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiXCI6ICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQocmVhc29uKQotICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGluZGljYXRpbmcKLSAgICAgKiB0aGF0IHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+Ci0gICAgICogdG8gdGhlIDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4gaXMgaWxsZWdhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRoYXQgdGhlIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICBjb3VsZG4ndCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRoYXQgY291bGQgbm90IGJlIGFkZGVkCi0gICAgICogQHBhcmFtIHJlYXNvbiBjYXVzZSBvZiB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIElsbGVnYWxBZGRFeGNlcHRpb24oRWxlbWVudCBiYXNlLCBOYW1lc3BhY2UgYWRkZWQsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBuYW1lc3BhY2UgeG1sbnMiKQotICAgICAgICAgICAgICAuYXBwZW5kKChhZGRlZC5nZXRQcmVmaXgoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLmdldFByZWZpeCgpLmVxdWFscygiIikpID8gIj0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI6IiArIGFkZGVkLmdldFByZWZpeCgpICsgIj0iKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYWRkZWQuZ2V0VVJJKCkpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlwiIGNvdWxkIG5vdCBiZSBhZGRlZCBhcyBhIG5hbWVzcGFjZSB0byBcIiIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYmFzZS5nZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlwiOiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPntAbGluayBEb2NUeXBlfTwvY29kZT4KLSAgICAgKiB0byB0aGUgPGNvZGU+e0BsaW5rIERvY3VtZW50fTwvY29kZT4gaXMgaWxsZWdhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGRlZCA8Y29kZT5Eb2NUeXBlPC9jb2RlPiB0aGF0IGNvdWxkIG5vdCBiZSBhZGRlZAotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBJbGxlZ2FsQWRkRXhjZXB0aW9uKERvY1R5cGUgYWRkZWQsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBET0NUWVBFICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYWRkZWQudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiIGNvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQ6ICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQocmVhc29uKQotICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGVycm9yIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIGNhdXNlIG9mIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIElsbGVnYWxBZGRFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihyZWFzb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSWxsZWdhbERhdGFFeGNlcHRpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSWxsZWdhbERhdGFFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ZTlmZi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0lsbGVnYWxEYXRhRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyotLSAKLQotICRJZDogSWxsZWdhbERhdGFFeGNlcHRpb24uamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIFRocm93biB3aGVuIGlsbGVnYWwgdGV4dCBpcyBzdXBwbGllZCB0byBhIEpET00gY29uc3RydWN0LgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZAotICovCi1wdWJsaWMgY2xhc3MgSWxsZWdhbERhdGFFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IElsbGVnYWxEYXRhRXhjZXB0aW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTggJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGluZGljYXRpbmcKLSAgICAgKiB0aGF0IHRoZSBzcGVjaWZpZWQgZGF0YSBpcyBpbGxlZ2FsIGZvciB0aGUgY29uc3RydWN0Ci0gICAgICogaXQgd2FzIHN1cHBsaWVkIHRvLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBkYXRhIHRoYXQgYnJlYWtzIHJ1bGVzLgotICAgICAqIEBwYXJhbSBjb25zdHJ1Y3QgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb25zdHJ1Y3QgdGhhdCBkYXRhIGlzIGlsbGVnYWwgZm9yLgotICAgICAqIEBwYXJhbSByZWFzb24gPGNvZGU+U3RyaW5nPC9jb2RlPiBtZXNzYWdlIG9yIHJlYXNvbiBkYXRhIGlzIGlsbGVnYWwuCi0gICAgICovCi0gICAgSWxsZWdhbERhdGFFeGNlcHRpb24oU3RyaW5nIGRhdGEsIFN0cmluZyBjb25zdHJ1Y3QsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBkYXRhIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChkYXRhKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBpcyBub3QgbGVnYWwgZm9yIGEgSkRPTSAiKQotICAgICAgICAgICAgICAuYXBwZW5kKGNvbnN0cnVjdCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiOiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIHNwZWNpZmllZCBkYXRhIGlzIGlsbGVnYWwgZm9yIHRoZSBjb25zdHJ1Y3QKLSAgICAgKiBpdCB3YXMgc3VwcGxpZWQgdG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRhdGEgdGhhdCBicmVha3MgcnVsZXMuCi0gICAgICogQHBhcmFtIGNvbnN0cnVjdCA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnN0cnVjdCB0aGF0IGRhdGEgaXMgaWxsZWdhbCBmb3IuCi0gICAgICovCi0gICAgSWxsZWdhbERhdGFFeGNlcHRpb24oU3RyaW5nIGRhdGEsIFN0cmluZyBjb25zdHJ1Y3QpIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBkYXRhIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChkYXRhKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBpcyBub3QgbGVnYWwgZm9yIGEgSkRPTSAiKQotICAgICAgICAgICAgICAuYXBwZW5kKGNvbnN0cnVjdCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIGV4Y2VwdG9pbiB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgSWxsZWdhbERhdGFFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihyZWFzb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSWxsZWdhbE5hbWVFeGNlcHRpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSWxsZWdhbE5hbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkNTYzZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0lsbGVnYWxOYW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyotLSAKLQotICRJZDogSWxsZWdhbE5hbWVFeGNlcHRpb24uamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE3IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi0vKioKLSAqIFRocm93biB3aGVuIGEgbmFtZSBpcyBzdXBwbGllZCBpbiBjb25zdHJ1Y3Rpb24gb2YgYSBKRE9NIGNvbnN0cnVjdCB3aG9zZQotICogd2hlcmUgdGhlIG5hbWUgYnJlYWtzIFhNTCBuYW1pbmcgY29udmVudGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZAotICovCi1wdWJsaWMgY2xhc3MgSWxsZWdhbE5hbWVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IElsbGVnYWxOYW1lRXhjZXB0aW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGluZGljYXRpbmcKLSAgICAgKiB0aGF0IHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBpbGxlZ2FsIGZvciB0aGUgY29uc3RydWN0Ci0gICAgICogaXQgd2FzIHN1cHBsaWVkIHRvLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIHRoYXQgYnJlYWtzIHJ1bGVzLgotICAgICAqIEBwYXJhbSBjb25zdHJ1Y3QgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIEpET00gY29uc3RydWN0Ci0gICAgICogICAgICAgIHRoYXQgPGNvZGU+bmFtZTwvY29kZT4gd2FzIHN1cHBsaWVkIHRvLgotICAgICAqIEBwYXJhbSByZWFzb24gPGNvZGU+U3RyaW5nPC9jb2RlPiBtZXNzYWdlIG9yIHJlYXNvbiBuYW1lIGlzIGlsbGVnYWwuCi0gICAgICovCi0gICAgSWxsZWdhbE5hbWVFeGNlcHRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBjb25zdHJ1Y3QsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBuYW1lIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBpcyBub3QgbGVnYWwgZm9yIEpET00vWE1MICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoY29uc3RydWN0KQotICAgICAgICAgICAgICAuYXBwZW5kKCJzOiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKHJlYXNvbikKLSAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZwotICAgICAqIHRoYXQgdGhlIHNwZWNpZmllZCBuYW1lIGlzIGlsbGVnYWwgZm9yIHRoZSBjb25zdHJ1Y3QKLSAgICAgKiBpdCB3YXMgc3VwcGxpZWQgdG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgdGhhdCBicmVha3MgcnVsZXMuCi0gICAgICogQHBhcmFtIGNvbnN0cnVjdCA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgSkRPTSBjb25zdHJ1Y3QKLSAgICAgKiAgICAgICAgdGhhdCA8Y29kZT5uYW1lPC9jb2RlPiB3YXMgc3VwcGxpZWQgdG8uCi0gICAgICovCi0gICAgSWxsZWdhbE5hbWVFeGNlcHRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBjb25zdHJ1Y3QpIHsKLSAgICAgICAgc3VwZXIobmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlRoZSBuYW1lIFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIiBpcyBub3QgbGVnYWwgZm9yIEpET00vWE1MICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQoY29uc3RydWN0KQotICAgICAgICAgICAgICAuYXBwZW5kKCJzLiIpCi0gICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFzb24gY2F1c2Ugb2YgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgSWxsZWdhbE5hbWVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBzdXBlcihyZWFzb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSWxsZWdhbFRhcmdldEV4Y2VwdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9JbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmY4NTIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9JbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKi0tIAotCi0gJElkOiBJbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBhIHRhcmdldCBpcyBzdXBwbGllZCBpbiBjb25zdHJ1Y3Rpb24gb2YgYSBKRE9NIHtAbGluawotICogUHJvY2Vzc2luZ0luc3RydWN0aW9ufSwgYW5kIHRoYXQgbmFtZSBicmVha3MgWE1MIG5hbWluZyBjb252ZW50aW9ucy4KLSAqIAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTkgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICovCi1wdWJsaWMgY2xhc3MgSWxsZWdhbFRhcmdldEV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0gCi0gICAgICAiQCgjKSAkUkNTZmlsZTogSWxsZWdhbFRhcmdldEV4Y2VwdGlvbi5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0aW5nCi0gICAgICogdGhhdCB0aGUgc3BlY2lmaWVkIHRhcmdldCBpcyBpbGxlZ2FsIGZvciB0aGUKLSAgICAgKiA8Y29kZT57QGxpbmsgUHJvY2Vzc2luZ0luc3RydWN0aW9ufTwvY29kZT4gaXQgd2FzIHN1cHBsaWVkIHRvLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCA8Y29kZT5TdHJpbmc8L2NvZGU+IHRhcmdldCB0aGF0IGJyZWFrcyBydWxlcy4KLSAgICAgKiBAcGFyYW0gcmVhc29uIDxjb2RlPlN0cmluZzwvY29kZT4gbWVzc2FnZSBvciByZWFzb24gdGFyZ2V0IGlzIGlsbGVnYWwuCi0gICAgICovCi0gICAgSWxsZWdhbFRhcmdldEV4Y2VwdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAgICAgICAuYXBwZW5kKCJUaGUgdGFyZ2V0IFwiIikKLSAgICAgICAgICAgICAgLmFwcGVuZCh0YXJnZXQpCi0gICAgICAgICAgICAgIC5hcHBlbmQoIlwiIGlzIG5vdCBsZWdhbCBmb3IgSkRPTS9YTUwgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnM6ICIpCi0gICAgICAgICAgICAgIC5hcHBlbmQocmVhc29uKQotICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiBjYXVzZSBvZiB0aGUgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBJbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3VwZXIocmVhc29uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0pET01FeGNlcHRpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSkRPTUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU5MTAzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSkRPTUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qLS0gCi0KLSAkSWQ6IEpET01FeGNlcHRpb24uamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE3IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5ybWkuKjsKLWltcG9ydCBqYXZhLnNxbC4qOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBUaGUgdG9wIGxldmVsIGV4Y2VwdGlvbiB0aGF0IEpET00gY2xhc3NlcyBjYW4gdGhyb3cuIEl0cyBzdWJjbGFzc2VzIGFkZAotICogc3BlY2lmaWNpdHkgdG8gdGhlIHByb2JsZW1zIHRoYXQgY2FuIG9jY3VyIHVzaW5nIEpET00uIFRoaXMgc2luZ2xlIGV4Y2VwdGlvbgotICogY2FuIGJlIGNhdWdodCB0byBoYW5kbGUgYWxsIEpET00gc3BlY2lmaWMgcHJvYmxlbXMgKHNvbWUgbWV0aG9kcyBtYXkgdGhyb3cKLSAqIHtAbGluayBqYXZhLmlvLklPRXhjZXB0aW9ufSBhbmQgc3VjaCkuCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKRE9NRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBKRE9NRXhjZXB0aW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJCAkTmFtZTogICQiOwotCi0gICAgLyoqIEEgd3JhcHBlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+ICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgY2F1c2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIEpET01FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCJFcnJvciBvY2N1cnJlZCBpbiBKRE9NIGFwcGxpY2F0aW9uLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgPGNvZGU+U3RyaW5nPC9jb2RlPiBtZXNzYWdlIGluZGljYXRpbmcKLSAgICAgKiAgICAgICAgICAgICAgICB0aGUgcHJvYmxlbSB0aGF0IG9jY3VycmVkLgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgSkRPTUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UKLSAgICAgKiBhbmQgd3JhcCBhbm90aGVyIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4uICBUaGlzIGlzIHVzZWZ1bCB3aGVuCi0gICAgICogdGhlIG9yaWdpbmF0aW5nIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gc2hvdWxkIGJlIGhlbGQgb24gdG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG1lc3NhZ2UgaW5kaWNhdGluZwotICAgICAqICAgICAgICAgICAgICAgIHRoZSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQuCi0gICAgICogQHBhcmFtIGNhdXNlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gdGhhdCBjYXVzZWQgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgdG8gYmUgdGhyb3duLgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgSkRPTUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSAgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsgICAgCi0gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKLSAgICB9ICAgIAotCi0gICAgLyoqIAotICAgICAqIEludGlhbGl6ZXMgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F1c2UgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiB0aGF0IGNhdXNlZCB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICB0byBiZSB0aHJvd24uCi0gICAgICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhpcyB0aHJvd2FibGUKLSAgICAgKi8KLSAgICAvLyBDcmVhdGVkIHRvIG1hdGNoIHRoZSBKREsgMS40IFRocm93YWJsZSBtZXRob2QuCi0gICAgcHVibGljIFRocm93YWJsZSBpbml0Q2F1c2UoVGhyb3dhYmxlIGNhdXNlKSAgewotICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIHRoZSA8Y29kZT5FeGNlcHRpb248L2NvZGU+LiBJZgotICAgICAqIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBuZXN0ZWQgZXhjZXB0aW9ucywgdGhlaXIgbWVzc2FnZXMKLSAgICAgKiBhcmUgYXBwZW5kZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBtZXNzYWdlIGZvciA8Y29kZT5FeGNlcHRpb248L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgLy8gR2V0IHRoaXMgZXhjZXB0aW9uJ3MgbWVzc2FnZS4KLSAgICAgICAgU3RyaW5nIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICBUaHJvd2FibGUgcGFyZW50ID0gdGhpczsKLSAgICAgICAgVGhyb3dhYmxlIGNoaWxkOwotICAgICAgICAKLSAgICAgICAgLy8gTG9vayBmb3IgbmVzdGVkIGV4Y2VwdGlvbnMuCi0gICAgICAgIHdoaWxlKChjaGlsZCA9IGdldE5lc3RlZEV4Y2VwdGlvbihwYXJlbnQpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGNoaWxkJ3MgbWVzc2FnZS4KLSAgICAgICAgICAgIFN0cmluZyBtc2cyID0gY2hpbGQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IElmIGEgU0FYRXhjZXB0aW9uIGhhcyBubyBtZXNzYWdlIG9mIGl0cyBvd24sIGJ1dCBoYXMgYSAKLSAgICAgICAgICAgIC8vIG5lc3RlZCBleGNlcHRpb24sIHRoZW4gaXQgcmV0dXJucyB0aGUgbmVzdGVkIGV4Y2VwdGlvbidzIG1lc3NhZ2UgYXMgaXRzCi0gICAgICAgICAgICAvLyBtZXNzYWdlLiBXZSBkb24ndCB3YW50IHRvIGFkZCB0aGF0IG1lc3NhZ2UgdHdpY2UuCi0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgZ3JhbmRjaGlsZCA9ICgoU0FYRXhjZXB0aW9uKWNoaWxkKS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgU0FYRXhjZXB0aW9uIHRlbGxzIHVzIHRoYXQgaXQncyBtZXNzYWdlIGlzIGlkZW50aWNhbCB0byAKLSAgICAgICAgICAgICAgICAvLyBpdHMgbmVzdGVkIGV4Y2VwdGlvbidzIG1lc3NhZ2UsIHRoZW4gd2Ugc2tpcCBpdCwgc28gd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyBhZGQgaXQgdHdpY2UuCi0gICAgICAgICAgICAgICAgaWYgKGdyYW5kY2hpbGQgIT0gbnVsbCAmJiBtc2cyICE9IG51bGwgJiYgbXNnMi5lcXVhbHMoZ3JhbmRjaGlsZC5nZXRNZXNzYWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZzIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBtZXNzYWdlIGZvciB0aGUgY2hpbGQgZXhjZXB0aW9uLCB3ZSBhcHBlbmQgaXQuCi0gICAgICAgICAgICBpZiAobXNnMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyArPSAiOiAiICsgbXNnMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQW55IG5lc3RlZCBKRE9NRXhjZXB0aW9uIHdpbGwgYXBwZW5kIGl0cyBvd24gY2hpbGRyZW4sCi0gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGJyZWFrIG91dCBvZiBoZXJlLgotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSkRPTUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50ID0gY2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbXBsZXRlZCBtZXNzYWdlLgotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPi4gSWYKLSAgICAgKiB0aGVyZSBpcyBhIHJvb3QgY2F1c2UsIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgcm9vdAotICAgICAqIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaXMgcHJpbnRlZCByaWdodCBhZnRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBzdGFjayB0cmFjZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpOwotCi0gICAgICAgIFRocm93YWJsZSBwYXJlbnQgPSB0aGlzOwotICAgICAgICBUaHJvd2FibGUgY2hpbGQ7Ci0KLSAgICAgICAgLy8gUHJpbnQgdGhlIHN0YWNrIHRyYWNlIGZvciBlYWNoIG5lc3RlZCBleGNlcHRpb24uCi0gICAgICAgIHdoaWxlKChjaGlsZCA9IGdldE5lc3RlZEV4Y2VwdGlvbihwYXJlbnQpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJDYXVzZWQgYnk6ICIpOwotICAgICAgICAgICAgY2hpbGQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAvLyBBbnkgbmVzdGVkIEpET01FeGNlcHRpb24gd2lsbCBwcmludCBpdHMgb3duIGNoaWxkcmVuLAotICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBicmVhayBvdXQgb2YgaGVyZS4KLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEpET01FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudCA9IGNoaWxkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB0byB0aGUgZ2l2ZW4KLSAgICAgKiBQcmludFN0cmVhbS4gSWYgdGhlcmUgaXMgYSByb290IGNhdXNlLCB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHJvb3QKLSAgICAgKiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IGlzIHByaW50ZWQgcmlnaHQgYWZ0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyBQcmludFN0cmVhbSB0byBwcmludCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBzdGFjayB0cmFjZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQotICAgICAgICBUaHJvd2FibGUgcGFyZW50ID0gdGhpczsKLSAgICAgICAgVGhyb3dhYmxlIGNoaWxkOwotCi0gICAgICAgIC8vIFByaW50IHRoZSBzdGFjayB0cmFjZSBmb3IgZWFjaCBuZXN0ZWQgZXhjZXB0aW9uLgotICAgICAgICB3aGlsZSgoY2hpbGQgPSBnZXROZXN0ZWRFeGNlcHRpb24ocGFyZW50KSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5wcmludCgiQ2F1c2VkIGJ5OiAiKTsKLSAgICAgICAgICAgIGNoaWxkLnByaW50U3RhY2tUcmFjZShzKTsKLSAgICAgICAgICAgIC8vIEFueSBuZXN0ZWQgSkRPTUV4Y2VwdGlvbiB3aWxsIHByaW50IGl0cyBvd24gY2hpbGRyZW4sCi0gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGJyZWFrIG91dCBvZiBoZXJlLgotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSkRPTUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50ID0gY2hpbGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSA8Y29kZT5FeGNlcHRpb248L2NvZGU+IHRvIHRoZSBnaXZlbgotICAgICAqIFByaW50V3JpdGVyLiBJZiB0aGVyZSBpcyBhIHJvb3QgY2F1c2UsIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgcm9vdAotICAgICAqIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaXMgcHJpbnRlZCByaWdodCBhZnRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3IFByaW50V3JpdGVyIHRvIHByaW50IHRvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHcpIHsKLSAgICAgICAgLy8gUHJpbnQgdGhlIHN0YWNrIHRyYWNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHcpOwotCi0gICAgICAgIFRocm93YWJsZSBwYXJlbnQgPSB0aGlzOwotICAgICAgICBUaHJvd2FibGUgY2hpbGQ7Ci0KLSAgICAgICAgLy8gUHJpbnQgdGhlIHN0YWNrIHRyYWNlIGZvciBlYWNoIG5lc3RlZCBleGNlcHRpb24uCi0gICAgICAgIHdoaWxlKChjaGlsZCA9IGdldE5lc3RlZEV4Y2VwdGlvbihwYXJlbnQpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3LnByaW50KCJDYXVzZWQgYnk6ICIpOwotICAgICAgICAgICAgY2hpbGQucHJpbnRTdGFja1RyYWNlKHcpOwotICAgICAgICAgICAgLy8gQW55IG5lc3RlZCBKRE9NRXhjZXB0aW9uIHdpbGwgcHJpbnQgaXRzIG93biBjaGlsZHJlbiwKLSAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gYnJlYWsgb3V0IG9mIGhlcmUuCi0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBKRE9NRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnQgPSBjaGlsZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHJvb3QgY2F1c2UgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiwgb3IgbnVsbAotICAgICAqIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlRocm93YWJsZTwvY29kZT4gLSB0aGUgd3JhcHBlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSAgewotICAgICAgICByZXR1cm4gY2F1c2U7ICAgICAgICAgICAgIAotICAgIH0KLQotICAgIC8vIElmIHRoaXMgVGhyb3dhYmxlIGhhcyBhIG5lc3RlZCAoY2hpbGQpIGV4Y2VwdGlvbiwgdGhlbiB3ZSByZXR1cm4gaXQuCi0gICAgLy8gT3RoZXJ3aXNlIHdlIHJldHVybiBudWxsLgotICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBnZXROZXN0ZWRFeGNlcHRpb24oVGhyb3dhYmxlIHBhcmVudCkgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkRPTUV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoSkRPTUV4Y2VwdGlvbilwYXJlbnQpLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNBWEV4Y2VwdGlvbilwYXJlbnQpLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTUUxFeGNlcHRpb24pcGFyZW50KS5nZXROZXh0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKXBhcmVudCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcilwYXJlbnQpLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUmVtb3RlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZW1vdGVFeGNlcHRpb24pcGFyZW50KS5kZXRhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRoZXNlIGNsYXNzZXMgYXJlIG5vdCBwYXJ0IG9mIHN0YW5kYXJkIEpESyAxLjEgb3IgMS4yLCBzbyB3ZSAKLSAgICAgICAgLy8gdXNlIHJlZmxlY3Rpb24gdG8gYWNjZXNzIHRoZW0uCi0KLSAgICAgICAgVGhyb3dhYmxlIG5lc3RlZEV4Y2VwdGlvbiA9IGdldE5lc3RlZEV4Y2VwdGlvbihwYXJlbnQsICJqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uIiwgImdldFJvb3RDYXVzZSIpOwotICAgICAgICBpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXN0ZWRFeGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5lc3RlZEV4Y2VwdGlvbiA9IGdldE5lc3RlZEV4Y2VwdGlvbihwYXJlbnQsICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24iLCAiZ2V0Um9vdENhdXNlIik7Ci0gICAgICAgIGlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIHVzZXMgcmVmbGVjdGlvbiB0byBvYnRhaW4gdGhlIG5lc3QgZXhjZXB0aW9uIG9mIGEgVGhyb3dhYmxlLiBXZSB1c2UgcmVmbGVjdGlvbgotICAgIC8vIGJlY2F1c2UgdGhlIGRlc2lyZWQgY2xhc3MgbWF5IG5vdCBleGlzdCBpbiB0aGUgY3VycmVudGx5LXJ1bm5pbmcgVk0uCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3dhYmxlIGdldE5lc3RlZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTZWUgaWYgdGhpcyBUaHJvd2FibGUgaXMgb2YgdGhlIGRlc2lyZWQgdHlwZSwgYnkgdXNpbmcgaXNBc3NpZ25hYmxlRnJvbSgpLgotICAgICAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgQ2xhc3Mgb2JqZWN0Q2xhc3MgPSBwYXJlbnQuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIGlmICh0ZXN0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmplY3RDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgcmVmbGVjdGlvbiB0byBjYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotICAgICAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1swXTsKLSAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gdGVzdENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRocm93YWJsZSltZXRob2QuaW52b2tlKHBhcmVudCwgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBNb3N0IGxpa2VseSwgdGhlIGRlc2lyZWQgY2xhc3MgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIFZNLiBUaGF0J3MgZmluZS4KLSAgICAgICAgICAgIC8vIEV2ZW4gaWYgaXQncyBjYXVzZWQgYnkgc29tZXRoaW5nIGVsc2UsIHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBhbiBlcnJvcgotICAgICAgICAgICAgLy8gaGVyZSwgc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiB0cnlpbmcgdG8gZGlzcGxheSB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIC8vIGVycm9yIC0gYW5vdGhlciBlcnJvciBoZXJlIHdpbGwganVzdCBjb25mdXNlIHRoaW5ncy4KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSkRPTUZhY3RvcnkuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vSkRPTUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5ZDMzNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL0pET01GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyotLQotCi0gJElkOiBKRE9NRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTggbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0byBiZSB1c2VkIGJ5IGJ1aWxkZXJzIHdoZW4gY29uc3RydWN0aW5nIEpET00gb2JqZWN0cy4gVGhlCi0gKiA8Y29kZT5EZWZhdWx0SkRPTUZhY3Rvcnk8L2NvZGU+IGNyZWF0ZXMgdGhlIHN0YW5kYXJkIHRvcC1sZXZlbCBKRE9NIGNsYXNzZXMKLSAqIChFbGVtZW50LCBEb2N1bWVudCwgQ29tbWVudCwgZXRjKS4gQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZhY3RvcnkKLSAqIGNvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbSBjbGFzc2VzLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQKLSAqIEBhdXRob3IgIEtlbiBSdW5lIEhvbGxhbmQKLSAqIEBhdXRob3IgIFBoaWwgTmVsc29uCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqLwotcHVibGljIGludGVyZmFjZSBKRE9NRmFjdG9yeSB7Ci0KLSAgICAvLyAqKioqIGNvbnN0cnVjdGluZyBBdHRyaWJ1dGVzICoqKioKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqICAgc3BlY2lmaWVkIChsb2NhbCkgbmFtZSBhbmQgdmFsdWUsIGFuZCBpbiB0aGUgcHJvdmlkZWQKLSAgICAgKiAgIDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2V9PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgPGNvZGU+QXR0cmlidXRlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBOYW1lc3BhY2UgbmFtZXNwYWNlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCAobG9jYWwpIG5hbWUsIHZhbHVlLCBhbmQgdHlwZSwgYW5kIGluIHRoZSBwcm92aWRlZAotICAgICAqIDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2V9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB0eXBlIDxjb2RlPmludDwvY29kZT4gdHlwZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gbmFtZXNwYWNlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyaWJ1dGUgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBOYW1lc3BhY2UgbmFtZXNwYWNlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCAobG9jYWwpIG5hbWUgYW5kIHZhbHVlLCBhbmQgZG9lcyBub3QgcGxhY2UKLSAgICAgKiB0aGUgYXR0cmlidXRlIGluIGEgPGNvZGU+e0BsaW5rIG9yZy5qZG9tLk5hbWVzcGFjZX08L2NvZGU+LgotICAgICAqIDxwPgotICAgICAqIDxiPk5vdGU8L2I+OiBUaGlzIGFjdHVhbGx5IGV4cGxpY2l0bHkgcHV0cyB0aGUKLSAgICAgKiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGluIHRoZSAiZW1wdHkiIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4KLSAgICAgKiAoPGNvZGU+e0BsaW5rIG9yZy5qZG9tLk5hbWVzcGFjZSNOT19OQU1FU1BBQ0V9PC9jb2RlPikuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4uCi0gICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgZm9yIG5ldyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIEF0dHJpYnV0ZSBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgKGxvY2FsKSBuYW1lLCB2YWx1ZSBhbmQgdHlwZSwgYW5kIGRvZXMgbm90IHBsYWNlCi0gICAgICogdGhlIGF0dHJpYnV0ZSBpbiBhIDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2V9PC9jb2RlPi4KLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5Ob3RlPC9iPjogVGhpcyBhY3R1YWxseSBleHBsaWNpdGx5IHB1dHMgdGhlCi0gICAgICogPGNvZGU+QXR0cmlidXRlPC9jb2RlPiBpbiB0aGUgImVtcHR5IiA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+Ci0gICAgICogKDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2UjTk9fTkFNRVNQQUNFfTwvY29kZT4pLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+LgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB0eXBlIDxjb2RlPmludDwvY29kZT4gdHlwZSBmb3IgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBpbnQgdHlwZSk7Ci0KLSAgICAvLyAqKioqIGNvbnN0cnVjdGluZyBDREFUQSAqKioqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIENEQVRBIHdpdGggdGhlIHN1cHBsaWVkIHRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGVudCBvZiBDREFUQS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ0RBVEEgY2RhdGEoU3RyaW5nIHN0cik7Ci0KLSAgICAvLyAqKioqIGNvbnN0cnVjdGluZyBUZXh0ICoqKioKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyB0aGUgVGV4dCB3aXRoIHRoZSBzdXBwbGllZCB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRlbnQgb2YgVGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dCB0ZXh0KFN0cmluZyBzdHIpOwotCi0gICAgLy8gKioqKiBjb25zdHJ1Y3RpbmcgQ29tbWVudCAqKioqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQgdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IDxjb2RlPlN0cmluZzwvY29kZT4gY29udGVudCBvZiBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDb21tZW50IGNvbW1lbnQoU3RyaW5nIHRleHQpOwotCi0gICAgLy8gKioqKiBjb25zdHJ1Y3RpbmcgRG9jVHlwZQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lIGFuZCBhIHJlZmVyZW5jZSB0byBhbgotICAgICAqIGV4dGVybmFsIERURC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YKLSAgICAgKiAgICAgICAgZWxlbWVudCBiZWluZyBjb25zdHJhaW5lZC4KLSAgICAgKiBAcGFyYW0gcHVibGljSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBwdWJsaWMgSUQgb2YKLSAgICAgKiAgICAgICAgcmVmZXJlbmNlZCBEVEQKLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBzeXN0ZW0gSUQgb2YKLSAgICAgKiAgICAgICAgcmVmZXJlbmNlZCBEVEQKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jVHlwZSBkb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgdGhlIDxjb2RlPkRvY1R5cGU8L2NvZGU+IHdpdGgKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZSBhbmQgcmVmZXJlbmNlIHRvIGFuCi0gICAgICogZXh0ZXJuYWwgRFRELgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZgotICAgICAqICAgICAgICBlbGVtZW50IGJlaW5nIGNvbnN0cmFpbmVkLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JRCA8Y29kZT5TdHJpbmc8L2NvZGU+IHN5c3RlbSBJRCBvZgotICAgICAqICAgICAgICByZWZlcmVuY2VkIERURAotICAgICAqLwotICAgIHB1YmxpYyBEb2NUeXBlIGRvY1R5cGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgc3lzdGVtSUQpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mCi0gICAgICogICAgICAgIGVsZW1lbnQgYmVpbmcgY29uc3RyYWluZWQuCi0gICAgICovCi0gICAgcHVibGljIERvY1R5cGUgZG9jVHlwZShTdHJpbmcgZWxlbWVudE5hbWUpOwotCi0gICAgLy8gKioqKiBjb25zdHJ1Y3RpbmcgRG9jdW1lbnQKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+LAotICAgICAqIHdpdGggdGhlIHN1cHBsaWVkIDxjb2RlPntAbGluayBvcmcuamRvbS5FbGVtZW50fTwvY29kZT4KLSAgICAgKiBhcyB0aGUgcm9vdCBlbGVtZW50IGFuZCB0aGUgc3VwcGxpZWQKLSAgICAgKiA8Y29kZT57QGxpbmsgb3JnLmpkb20uRG9jVHlwZX08L2NvZGU+IGRlY2xhcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGZvciBkb2N1bWVudCByb290LgotICAgICAqIEBwYXJhbSBkb2NUeXBlICAgICA8Y29kZT5Eb2NUeXBlPC9jb2RlPiBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCwgRG9jVHlwZSBkb2NUeXBlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+LAotICAgICAqIHdpdGggdGhlIHN1cHBsaWVkIDxjb2RlPntAbGluayBvcmcuamRvbS5FbGVtZW50fTwvY29kZT4KLSAgICAgKiBhcyB0aGUgcm9vdCBlbGVtZW50IGFuZCB0aGUgc3VwcGxpZWQKLSAgICAgKiA8Y29kZT57QGxpbmsgb3JnLmpkb20uRG9jVHlwZX08L2NvZGU+IGRlY2xhcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGZvciBkb2N1bWVudCByb290LgotICAgICAqIEBwYXJhbSBkb2NUeXBlIDxjb2RlPkRvY1R5cGU8L2NvZGU+IGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBiYXNlVVJJIHRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIGRvdWNtZW50IHdhcyBsb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGRvY3VtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQsIERvY1R5cGUgZG9jVHlwZSwgU3RyaW5nIGJhc2VVUkkpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5Eb2N1bWVudDwvY29kZT4sCi0gICAgICogd2l0aCB0aGUgc3VwcGxpZWQgPGNvZGU+e0BsaW5rIG9yZy5qZG9tLkVsZW1lbnR9PC9jb2RlPgotICAgICAqIGFzIHRoZSByb290IGVsZW1lbnQsIGFuZCBubyA8Y29kZT57QGxpbmsgb3JnLmpkb20uRG9jVHlwZX08L2NvZGU+Ci0gICAgICogZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gZm9yIGRvY3VtZW50IHJvb3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCk7Ci0KLSAgICAvLyAqKioqIGNvbnN0cnVjdGluZyBFbGVtZW50cyAqKioqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICAgICogd2l0aCB0aGUgc3VwcGxpZWQgKGxvY2FsKSBuYW1lLCBhbmQgZGVmaW5lCi0gICAgICogdGhlIDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2V9PC9jb2RlPiB0byBiZSB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIHB1dCBlbGVtZW50IGluLgotICAgICAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBlbGVtZW50KFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbmFtZXNwYWNlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+RWxlbWVudDwvY29kZT4gaW4gbm8KLSAgICAgKiA8Y29kZT57QGxpbmsgb3JnLmpkb20uTmFtZXNwYWNlfTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBlbGVtZW50KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+RWxlbWVudDwvY29kZT4gd2l0aAotICAgICAqIHRoZSBzdXBwbGllZCAobG9jYWwpIG5hbWUsIGFuZCBzcGVjaWZpZXMgdGhlIFVSSQotICAgICAqIG9mIHRoZSA8Y29kZT57QGxpbmsgb3JnLmpkb20uTmFtZXNwYWNlfTwvY29kZT4gdGhlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICAgICogc2hvdWxkIGJlIGluLCByZXN1bHRpbmcgaXQgYmVpbmcgdW5wcmVmaXhlZCAoaW4gdGhlIGRlZmF1bHQKLSAgICAgKiBuYW1lc3BhY2UpLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHVyaSA8Y29kZT5TdHJpbmc8L2NvZGU+IFVSSSBmb3IgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiBlbGVtZW50Ci0gICAgICogICAgICAgIHNob3VsZCBiZSBpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBlbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+RWxlbWVudDwvY29kZT4gd2l0aAotICAgICAqIHRoZSBzdXBwbGllZCAobG9jYWwpIG5hbWUsIGFuZCBzcGVjaWZpZXMgdGhlIHByZWZpeCBhbmQgVVJJCi0gICAgICogb2YgdGhlIDxjb2RlPntAbGluayBvcmcuamRvbS5OYW1lc3BhY2V9PC9jb2RlPiB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgICAgKiBzaG91bGQgYmUgaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gdXJpIDxjb2RlPlN0cmluZzwvY29kZT4gVVJJIGZvciA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IGVsZW1lbnQKLSAgICAgKiAgICAgICAgc2hvdWxkIGJlIGluLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpOwotCi0gICAgLy8gKioqKiBjb25zdHJ1Y3RpbmcgUHJvY2Vzc2luZ0luc3RydWN0aW9uICoqKioKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPgotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IDxjb2RlPlN0cmluZzwvY29kZT4gdGFyZ2V0IG9mIFBJLgotICAgICAqIEBwYXJhbSBkYXRhIDxjb2RlPk1hcDwvY29kZT4gZGF0YSBmb3IgUEksIGluCi0gICAgICogICAgICAgICAgICAgbmFtZS92YWx1ZSBwYWlycwotICAgICAqLwotICAgIHB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGRhdGEpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+Ci0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBhbmQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0YXJnZXQgb2YgUEkuCi0gICAgICogQHBhcmFtIGRhdGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBkYXRhIGZvciBQSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhKTsKLQotICAgIC8vICoqKiogY29uc3RydWN0aW5nIEVudGl0eVJlZiAqKioqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPkVudGl0eVJlZjwvY29kZT4KLSAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5FbnRpdHlSZWY8L2NvZGU+Ci0gICAgICogd2l0aCB0aGUgc3VwcGxpZWQgbmFtZSwgcHVibGljIElELCBhbmQgc3lzdGVtIElELgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHB1YmxpY0lEIDxjb2RlPlN0cmluZzwvY29kZT4gcHVibGljIElEIG9mIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIHN5c3RlbUlEIDxjb2RlPlN0cmluZzwvY29kZT4gc3lzdGVtIElEIG9mIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+RW50aXR5UmVmPC9jb2RlPgotICAgICAqIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIHN5c3RlbSBJRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiBlbGVtZW50LgotICAgICAqIEBwYXJhbSBzeXN0ZW1JRCA8Y29kZT5TdHJpbmc8L2NvZGU+IHN5c3RlbSBJRCBvZiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZWYgZW50aXR5UmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgc3lzdGVtSUQpOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gTGlzdCBtYW5pcHVsYXRpb24KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnQoUGFyZW50IHBhcmVudCwgQ29udGVudCBjb250ZW50KTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIEF0dHJpYnV0ZSBhKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCwgTmFtZXNwYWNlIGFkZGl0aW9uYWwpOwotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9OYW1lc3BhY2UuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzM4NjEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKi0tIAotCi0gJElkOiBOYW1lc3BhY2UuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQW4gWE1MIG5hbWVzcGFjZSByZXByZXNlbnRhdGlvbiwgYXMgd2VsbCBhcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIFhNTAotICogbmFtZXNwYWNlIG9iamVjdHMuIE5hbWVzcGFjZXMgYXJlIG5vdCBTZXJpYWxpemFibGUsIGhvd2V2ZXIgb2JqZWN0cyB0aGF0IHVzZQotICogbmFtZXNwYWNlcyBoYXZlIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHNlcmlhbGl6YXRpb24gbWFudWFsbHkuIFRoZXNlIGNsYXNzZXMKLSAqIGNhbGwgdGhlIGdldE5hbWVzcGFjZSgpIG1ldGhvZCBvbiBkZXNlcmlhbGl6YXRpb24gdG8gZW5zdXJlIHRoZXJlIGlzIG9uZQotICogdW5pcXVlIE5hbWVzcGFjZSBvYmplY3QgZm9yIGFueSB1bmlxdWUgcHJlZml4L3VyaSBwYWlyLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZAotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKiBAYXV0aG9yICBXZXNsZXkgQmlnZ3MKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVzcGFjZSB7Ci0KLSAgICAvLyBYWFggTWF5IHdhbnQgdG8gdXNlIHdlYWsgcmVmZXJlbmNlcyB0byBrZWVwIHRoZSBtYXBzIGZyb20gZ3Jvd2luZyAKLSAgICAvLyBsYXJnZSB3aXRoIGV4dGVuZGVkIHVzZQotCi0gICAgLy8gWFhYIFdlIG1heSBuZWVkIHRvIG1ha2UgdGhlIG5hbWVzcGFjZXMgSGFzaE1hcCBzeW5jaHJvbml6ZWQgd2l0aAotICAgIC8vIHJlYWRlci93cml0ZXIgbG9ja3Mgb3IgcGVyaGFwcyBtYWtlIE5hbWVzcGFjZSBubyBsb25nZXIgYSBmbHl3ZWlnaHQuCi0gICAgLy8gQXMgd3JpdHRlbiwgbXVsdGlwbGUgcHV0KCkgY2FsbHMgbWF5IGhhcHBlbiBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIAotICAgIC8vIGNvbmN1cnJlbnRseSBhbmQgY2F1c2UgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLiBTZWUKLSAgICAvLyBodHRwOi8vbGlzdHMuZGVudmVyb25saW5lLm5ldC9saXN0cy9qZG9tLWludGVyZXN0LzIwMDAtU2VwdGVtYmVyLzAwMzAwOS5odG1sLgotICAgIC8vIE5vIG9uZSBoYXMgZXZlciByZXBvcnRlZCB0aGlzIG92ZXIgdGhlIG1hbnkgeWVhcnMsIHNvIGRvbid0IHdvcnJ5IHlldC4KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IE5hbWVzcGFjZS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKiAKLSAgICAgKiBGYWN0b3J5IGxpc3Qgb2YgbmFtZXNwYWNlcy4gCi0gICAgICogS2V5cyBhcmUgPGk+cHJlZml4PC9pPiZhbXA7PGk+VVJJPC9pPi4gCi0gICAgICogVmFsdWVzIGFyZSBOYW1lc3BhY2Ugb2JqZWN0cyAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG5hbWVzcGFjZXM7Ci0KLSAgICAvKiogRGVmaW5lIGEgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiBmb3Igd2hlbiA8aT5ub3Q8L2k+IGluIGEgbmFtZXNwYWNlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lc3BhY2UgTk9fTkFNRVNQQUNFID0gbmV3IE5hbWVzcGFjZSgiIiwgIiIpOwotCi0gICAgLyoqIERlZmluZSBhIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gZm9yIHRoZSBzdGFuZGFyZCB4bWwgcHJlZml4LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZXNwYWNlIFhNTF9OQU1FU1BBQ0UgPQotICAgICAgICBuZXcgTmFtZXNwYWNlKCJ4bWwiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIik7Ci0KLSAgICAvKiogVGhlIHByZWZpeCBtYXBwZWQgdG8gdGhpcyBuYW1lc3BhY2UgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0KLSAgICAvKiogVGhlIFVSSSBmb3IgdGhpcyBuYW1lc3BhY2UgKi8KLSAgICBwcml2YXRlIFN0cmluZyB1cmk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHN0YXRpYyBpbml0aWFsaXplciBhY3RzIGFzIGEgZmFjdG9yeSBjb250cnVjdG9yLgotICAgICAqIEl0IHNldHMgdXAgc3RvcmFnZSBhbmQgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZXMuCi0gICAgICovCi0gICAgc3RhdGljIHsKLSAgICAgICAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSAiZW1wdHkiIG5hbWVzcGFjZQotICAgICAgICBuYW1lc3BhY2VzLnB1dCgiJiIsIE5PX05BTUVTUEFDRSk7Ci0gICAgICAgIG5hbWVzcGFjZXMucHV0KCJ4bWwmaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgWE1MX05BTUVTUEFDRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHJpZXZlIChpZiBpbiBleGlzdGVuY2UpIG9yIGNyZWF0ZSAoaWYgbm90KSBhIAotICAgICAqIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gZm9yIHRoZSBzdXBwbGllZCBwcmVmaXggYW5kIFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggPGNvZGU+U3RyaW5nPC9jb2RlPiBwcmVmaXggdG8gbWFwIHRvIAotICAgICAqICAgICAgICAgICAgICAgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdXJpIDxjb2RlPlN0cmluZzwvY29kZT4gVVJJIG9mIG5ldyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+LgotICAgICAqIEByZXR1cm4gPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiAtIHJlYWR5IHRvIHVzZSBuYW1lc3BhY2UuCi0gICAgICogQHRocm93cyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcHJlZml4IGFuZCB1cmkgbWFrZSB1cAotICAgICAqICAgICAgICAgYW4gaWxsZWdhbCBuYW1lc3BhY2UgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5hbWVzcGFjZSBnZXROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICAvLyBTYW5pdHkgY2hlY2tpbmcKLSAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmICgodXJpID09IG51bGwpIHx8ICh1cmkudHJpbSgpLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiBleGlzdGluZyBuYW1lc3BhY2UgaWYgZm91bmQuIFRoZSBwcmVleGlzdGluZyBuYW1lc3BhY2VzCi0gICAgICAgIC8vIHNob3VsZCBhbGwgYmUgbGVnYWwuIEluIG90aGVyIHdvcmRzLCBhbiBpbGxlZ2FsIG5hbWVzcGFjZSB3b24ndAotICAgICAgICAvLyBoYXZlIGJlZW4gcGxhY2VkIGluIHRoaXMuICBUaHVzIHdlIGNhbiBkbyB0aGlzIHRlc3QgYmVmb3JlCi0gICAgICAgIC8vIHZlcmlmeWluZyB0aGUgVVJJIGFuZCBwcmVmaXguCi0gICAgICAgIFN0cmluZyBsb29rdXAgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KQotICAgICAgICAgICAgLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgnJicpLmFwcGVuZCh1cmkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIE5hbWVzcGFjZSBwcmVleGlzdGluZyA9IChOYW1lc3BhY2UpIG5hbWVzcGFjZXMuZ2V0KGxvb2t1cCk7Ci0gICAgICAgIGlmIChwcmVleGlzdGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZXhpc3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIG5hbWluZwotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrTmFtZXNwYWNlUHJlZml4KHByZWZpeCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbihwcmVmaXgsICJOYW1lc3BhY2UgcHJlZml4IiwgcmVhc29uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrTmFtZXNwYWNlVVJJKHVyaSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbih1cmksICJOYW1lc3BhY2UgVVJJIiwgcmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVubGVzcyB0aGUgImVtcHR5IiBOYW1lc3BhY2UgKG5vIHByZWZpeCBhbmQgbm8gVVJJKSwgcmVxdWlyZSBhIFVSSQotICAgICAgICBpZiAoKCFwcmVmaXguZXF1YWxzKCIiKSkgJiYgKHVyaS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxOYW1lRXhjZXB0aW9uKCIiLCAibmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIFVSSXMgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5IFN0cmluZ3MiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBYTUwgbmFtZXNwYWNlIG1pc2xhYmVscy4gSWYgdGhlIHVzZXIgcmVxdWVzdGVkIHRoZSBjb3JyZWN0Ci0gICAgICAgIC8vIG5hbWVzcGFjZSBhbmQgcHJlZml4IC0tIHhtbCwgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlCi0gICAgICAgIC8vIC0tIHRoZW4gaXQgd2FzIGFscmVhZHkgcmV0dXJuZWQgZnJvbSB0aGUgcHJlZXhpc3RpbmcgbmFtZXNwYWNlcy4KLSAgICAgICAgLy8gVGh1cyBhbnkgdXNlIG9mIHRoZSB4bWwgcHJlZml4IG9yIHRoZQotICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UgVVJJIGF0IHRoaXMgcG9pbnQgbXVzdCBiZQotICAgICAgICAvLyBpbmNvcnJlY3QuIAotICAgICAgICBpZiAocHJlZml4LmVxdWFscygieG1sIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsTmFtZUV4Y2VwdGlvbihwcmVmaXgsICJOYW1lc3BhY2UgcHJlZml4IiwKLSAgICAgICAgICAgICAiVGhlIHhtbCBwcmVmaXggY2FuIG9ubHkgYmUgYm91bmQgdG8gIiArCi0gICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIGVycmF0dW0gdG8gTmFtZXNwYWNlcyBpbiBYTUwgMS4wIHRoYXQgc3VnZ2VzdHMgdGhpcyAKLSAgICAgICAgLy8gbmV4dCBjaGVjayBpcyBjb250cm92ZXJzaWFsLiBOb3QgZXZlcnlvbmUgYWNjZXB0cyBpdC4gCi0gICAgICAgIGlmICh1cmkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxOYW1lRXhjZXB0aW9uKHVyaSwgIk5hbWVzcGFjZSBVUkkiLAotICAgICAgICAgICAgICJUaGUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIG11c3QgYmUgYm91bmQgdG8gIiArCi0gICAgICAgICAgICAgInRoZSB4bWwgcHJlZml4LiIpOyAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5hbGx5LCBzdG9yZSBhbmQgcmV0dXJuCi0gICAgICAgIE5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotICAgICAgICBuYW1lc3BhY2VzLnB1dChsb29rdXAsIG5zKTsKLSAgICAgICAgcmV0dXJuIG5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSAoaWYgaW4gZXhpc3RlbmNlKSBvciBjcmVhdGUgKGlmIG5vdCkgYSAKLSAgICAgKiA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IGZvciB0aGUgc3VwcGxpZWQgVVJJLCBhbmQgbWFrZSBpdCB1c2FibGUgCi0gICAgICogYXMgYSBkZWZhdWx0IG5hbWVzcGFjZSwgYXMgbm8gcHJlZml4IGlzIHN1cHBsaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSA8Y29kZT5TdHJpbmc8L2NvZGU+IFVSSSBvZiBuZXcgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4gLSByZWFkeSB0byB1c2UgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTmFtZXNwYWNlIGdldE5hbWVzcGFjZShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2UoIiIsIHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBoYW5kbGVzIGNyZWF0aW9uIG9mIGEgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiBvYmplY3QKLSAgICAgKiB3aXRoIGEgcHJlZml4IGFuZCBVUkk7IGl0IGlzIGludGVudGlvbmFsbHkgbGVmdCA8Y29kZT5wcml2YXRlPC9jb2RlPgotICAgICAqIHNvIHRoYXQgaXQgY2Fubm90IGJlIGludm9rZWQgYnkgZXh0ZXJuYWwgcHJvZ3JhbXMvY29kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggPGNvZGU+U3RyaW5nPC9jb2RlPiBwcmVmaXggdG8gbWFwIHRvIHRoaXMgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSB1cmkgPGNvZGU+U3RyaW5nPC9jb2RlPiBVUkkgZm9yIG5hbWVzcGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIHByZWZpeCBtYXBwZWQgdG8gdGhpcyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gcHJlZml4IGZvciB0aGlzIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGlzIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBVUkkgZm9yIHRoaXMgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3RzIGZvciBlcXVhbGl0eSAtIFR3byA8Y29kZT5OYW1lc3BhY2VzPC9jb2RlPgotICAgICAqIGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGVpciBVUklzIGFyZSBieXRlLWZvci1ieXRlIGVxdWFscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGNvbXBhcmUgdG8gdGhpcyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+LgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gLSB3aGV0aGVyIHRoZSBzdXBwbGllZCBvYmplY3QgaXMgZXF1YWwgdG8KLSAgICAgKiAgICAgICAgIHRoaXMgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2IgaW5zdGFuY2VvZiBOYW1lc3BhY2UpIHsgIC8vIGluc3RhbmNlb2YgcmV0dXJucyBmYWxzZSBpZiBudWxsCi0gICAgICAgICAgICByZXR1cm4gdXJpLmVxdWFscygoKE5hbWVzcGFjZSlvYikudXJpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4sIHN1aXRhYmxlIGZvciB1c2UgaW4gZGVidWdnaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIltOYW1lc3BhY2U6IHByZWZpeCBcIiIgKyBwcmVmaXggKyAiXCIgaXMgbWFwcGVkIHRvIFVSSSBcIiIgKyAKLSAgICAgICAgICAgICAgIHVyaSArICJcIl0iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyBhIHByb2JhYmx5IHVuaXF1ZSBoYXNoIGNvZGUgZm9yIHRoZSA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+LgotICAgICAqIElmIHR3byBuYW1lc3BhY2VzIGhhdmUgdGhlIHNhbWUgVVJJLCB0aGV5IGFyZSBlcXVhbCBhbmQgaGF2ZSB0aGUgc2FtZQotICAgICAqIGhhc2ggY29kZSwgZXZlbiBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IHByZWZpeGVzLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5pbnQ8L2NvZGU+IC0gaGFzaCBjb2RlIGZvciB0aGlzIDxjb2RlPk5hbWVzcGFjZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHVyaS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vUGFyZW50LmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL1BhcmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1YTc1Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vUGFyZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyotLQotCi0gJElkOiBQYXJlbnQuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE4IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb207Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuamRvbS5maWx0ZXIuRmlsdGVyOwotCi0vKioKLSAqIFN1cGVyY2xhc3MgZm9yIEpET00gb2JqZWN0cyB3aGljaCBhcmUgYWxsb3dlZCB0byBjb250YWluCi0gKiB7QGxpbmsgQ29udGVudH0gY29udGVudC4KLSAqCi0gKiBAc2VlIG9yZy5qZG9tLkNvbnRlbnQKLSAqIEBzZWUgb3JnLmpkb20uRG9jdW1lbnQKLSAqIEBzZWUgb3JnLmpkb20uRWxlbWVudAotICoKLSAqIEBhdXRob3IgQnJhZGxleSBTLiBIdWZmbWFuCi0gKiBAYXV0aG9yIEphc29uIEh1bnRlcgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTggJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmVudCBleHRlbmRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHBhcmVudCdzIGNvbnRlbnQgbGlzdC4KLSAgICAgKiBDaGlsZHJlbiBtYXkgYmUgYW55IHtAbGluayBDb250ZW50fSB0eXBlLgotICAgICAqCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBpbnQgZ2V0Q29udGVudFNpemUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdXBwbGllZCBjaGlsZCBpbiB0aGUgY29udGVudCBsaXN0LAotICAgICAqIG9yIC0xIGlmIG5vdCBhIGNoaWxkIG9mIHRoaXMgcGFyZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGNoaWxkICBjaGlsZCB0byBzZWFyY2ggZm9yCi0gICAgICogQHJldHVybiAgICAgICBpbmRleCBvZiBjaGlsZCwgb3IgLTEgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgaW50IGluZGV4T2YoQ29udGVudCBjaGlsZCk7Ci0KLS8vICAgIC8qKgotLy8gICAgICogU3RhcnRpbmcgYXQgdGhlIGdpdmVuIGluZGV4IChpbmNsdXNpdmUpLCByZXR1cm5zIHRoZSBpbmRleCBvZgotLy8gICAgICogdGhlIGZpcnN0IGNoaWxkIG1hdGNoaW5nIHRoZSBzdXBwbGllZCBmaWx0ZXIsIG9yIC0xCi0vLyAgICAgKiBpZiBub25lIGlzIGZvdW5kLgotLy8gICAgICoKLS8vICAgICAqIEByZXR1cm4gaW5kZXggb2YgY2hpbGQsIG9yIC0xIGlmIG5vbmUgZm91bmQKLS8vICAgICAqLwotLy8gICAgaW50IGluZGV4T2YoaW50IGluZGV4LCBGaWx0ZXIgZmlsdGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgZGV0YWNoZWQgY2xvbmVzIG9mIHRoaXMgcGFyZW50J3MgY29udGVudCBsaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIGNsb25lZCBjaGlsZCBjb250ZW50Ci0gICAgICovCi0gICAgTGlzdCBjbG9uZUNvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBsb2NhdGlvbiBvZiBkZXNpcmVkIGNoaWxkCi0gICAgICogQHJldHVybiBjaGlsZCBhdCB0aGUgZ2l2ZW4gaW5kZXgKLSAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaW5kZXggaXMgbmVnYXRpdmUgb3IgYmV5b25kCi0gICAgICogICAgICAgICB0aGUgY3VycmVudCBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBwYXJlbnQgaXMgYSBEb2N1bWVudAotICAgICAqICAgICAgICAgYW5kIHRoZSByb290IGVsZW1lbnQgaXMgbm90IHNldAotICAgICAqLwotICAgIENvbnRlbnQgZ2V0Q29udGVudChpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbCBjb250ZW50IG9mIHRoaXMgcGFyZW50IGFzIGEge0BsaW5rIGphdmEudXRpbC5MaXN0fQotICAgICAqIHdoaWNoIGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZSB7QGxpbmsgQ29udGVudH0uIFRoZSByZXR1cm5lZCBsaXN0IGlzCi0gICAgICogPGI+ImxpdmUiPC9iPiBhbmQgaW4gZG9jdW1lbnQgb3JkZXIuIEFueSBtb2RpZmljYXRpb25zCi0gICAgICogdG8gaXQgYWZmZWN0IHRoZSBlbGVtZW50J3MgYWN0dWFsIGNvbnRlbnRzLiBNb2RpZmljYXRpb25zIGFyZSBjaGVja2VkCi0gICAgICogZm9yIGNvbmZvcm1hbmNlIHRvIFhNTCAxLjAgcnVsZXMuCi0gICAgICogPHA+Ci0gICAgICogU2VxdWVudGlhbCB0cmF2ZXJzYWwgdGhyb3VnaCB0aGUgTGlzdCBpcyBiZXN0IGRvbmUgd2l0aCBhbiBJdGVyYXRvcgotICAgICAqIHNpbmNlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudCBvZiB7QGxpbmsgamF2YS51dGlsLkxpc3Qjc2l6ZX0gbWF5Ci0gICAgICogcmVxdWlyZSB3YWxraW5nIHRoZSBlbnRpcmUgbGlzdCBhbmQgaW5kZXhlZCBsb29rdXBzIG1heSByZXF1aXJlCi0gICAgICogc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBlYWNoIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcGFyZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgcGFyZW50IGlzIGEgRG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGFuZCB0aGUgcm9vdCBlbGVtZW50IGlzIG5vdCBzZXQKLSAgICAgKi8KLSAgICBMaXN0IGdldENvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYXMgYSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IHRoZSBjb250ZW50IG9mCi0gICAgICogdGhpcyBwYXJlbnQgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBmaWx0ZXIuIFRoZSByZXR1cm5lZCBsaXN0IGlzCi0gICAgICogPGI+ImxpdmUiPC9iPiBhbmQgaW4gZG9jdW1lbnQgb3JkZXIuIEFueSBtb2RpZmljYXRpb25zIHRvIGl0IGFmZmVjdAotICAgICAqIHRoZSBlbGVtZW50J3MgYWN0dWFsIGNvbnRlbnRzLiBNb2RpZmljYXRpb25zIGFyZSBjaGVja2VkIGZvcgotICAgICAqIGNvbmZvcm1hbmNlIHRvIFhNTCAxLjAgcnVsZXMuCi0gICAgICogPHA+Ci0gICAgICogU2VxdWVudGlhbCB0cmF2ZXJzYWwgdGhyb3VnaCB0aGUgTGlzdCBpcyBiZXN0IGRvbmUgd2l0aCBhbiBJdGVyYXRvcgotICAgICAqIHNpbmNlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudCBvZiB7QGxpbmsgamF2YS51dGlsLkxpc3Qjc2l6ZX0gbWF5Ci0gICAgICogcmVxdWlyZSB3YWxraW5nIHRoZSBlbnRpcmUgbGlzdCBhbmQgaW5kZXhlZCBsb29rdXBzIG1heSByZXF1aXJlCi0gICAgICogc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBlYWNoIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIGZpbHRlciBmaWx0ZXIgdG8gYXBwbHkKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcGFyZW50IG1hdGNoaW5nIHRoZSBmaWx0ZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBwYXJlbnQgaXMgYSBEb2N1bWVudAotICAgICAqICAgICAgICAgYW5kIHRoZSByb290IGVsZW1lbnQgaXMgbm90IHNldAotICAgICAqLwotICAgIExpc3QgZ2V0Q29udGVudChGaWx0ZXIgZmlsdGVyKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGNvbnRlbnQgZnJvbSB0aGlzIHBhcmVudCBhbmQgcmV0dXJucyB0aGUgZGV0YWNoZWQKLSAgICAgKiBjaGlsZHJlbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgb2xkIGNvbnRlbnQgZGV0YWNoZWQgZnJvbSB0aGlzIHBhcmVudAotICAgICAqLwotICAgIExpc3QgcmVtb3ZlQ29udGVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBmcm9tIHRoaXMgcGFyZW50IGFsbCBjaGlsZCBjb250ZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXIKLSAgICAgKiBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGRldGFjaGVkIGNoaWxkcmVuLgotICAgICAqCi0gICAgICogQHBhcmFtICBmaWx0ZXIgZmlsdGVyIHRvIGFwcGx5Ci0gICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBkZXRhY2hlZCBjaGlsZHJlbiBtYXRjaGluZyB0aGUgZmlsdGVyCi0gICAgICovCi0gICAgTGlzdCByZW1vdmVDb250ZW50KEZpbHRlciBmaWx0ZXIpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHNpbmdsZSBjaGlsZCBub2RlIGZyb20gdGhlIGNvbnRlbnQgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgY2hpbGQgIGNoaWxkIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcmVtb3ZhbCBvY2N1cnJlZAotICAgICAqLwotICAgIGJvb2xlYW4gcmVtb3ZlQ29udGVudChDb250ZW50IGNoaWxkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbgotICAgICAqIGluZGV4LCBvciByZXR1cm5zIG51bGwgaWYgdGhlcmUncyBubyBzdWNoIGNoaWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIGNoaWxkIHRvIHJlbW92ZQotICAgICAqIEByZXR1cm4gZGV0YWNoZWQgY2hpbGQgYXQgZ2l2ZW4gaW5kZXggb3IgbnVsbCBpZiBubwotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpbmRleCBpcyBuZWdhdGl2ZSBvciBiZXlvbmQKLSAgICAgKiAgICAgICAgICAgICB0aGUgY3VycmVudCBudW1iZXIgb2YgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBDb250ZW50IHJlbW92ZUNvbnRlbnQoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIE9idGFpbiBhIGRlZXAsIHVuYXR0YWNoZWQgY29weSBvZiB0aGlzIHBhcmVudCBhbmQgaXQncyBjaGlsZHJlbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhpcyBwYXJlbnQgYW5kIGl0J3MgY2hpbGRyZW4uCi0gICAgICovCi0gICAgT2JqZWN0IGNsb25lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBqYXZhLnV0aWwuSXRlcmF0b3J9IHRoYXQgd2Fsa3Mgb3ZlciBhbGwgZGVzY2VuZGFudHMKLSAgICAgKiBpbiBkb2N1bWVudCBvcmRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gd2FsayBkZXNjZW5kYW50cwotICAgICAqLwotICAgIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBqYXZhLnV0aWwuSXRlcmF0b3J9IHRoYXQgd2Fsa3Mgb3ZlciBhbGwgZGVzY2VuZGFudHMKLSAgICAgKiBpbiBkb2N1bWVudCBvcmRlciBhcHBseWluZyB0aGUgRmlsdGVyIHRvIHJldHVybiBvbmx5IGVsZW1lbnRzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgZmlsdGVyIHJ1bGUuICBXaXRoIGZpbHRlcnMgeW91IGNhbiBtYXRjaCBvbmx5IEVsZW1lbnRzLAotICAgICAqIG9ubHkgQ29tbWVudHMsIEVsZW1lbnRzIG9yIENvbW1lbnRzLCBvbmx5IEVsZW1lbnRzIHdpdGggYSBnaXZlbiBuYW1lCi0gICAgICogYW5kL29yIHByZWZpeCwgYW5kIHNvIG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbHRlciBmaWx0ZXIgdG8gc2VsZWN0IHdoaWNoIGRlc2NlbmRhbnRzIHRvIHNlZQotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gd2FsayBkZXNjZW5kYW50cyB0aGF0IG1hdGNoIGEgZmlsdGVyCi0gICAgICovCi0gICAgSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoRmlsdGVyIGZpbHRlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBwYXJlbnQncyBwYXJlbnQsIG9yIG51bGwgaWYgdGhpcyBwYXJlbnQgaXMgY3VycmVudGx5Ci0gICAgICogbm90IGF0dGFjaGVkIHRvIGFub3RoZXIgcGFyZW50LiBUaGlzIGlzIHRoZSBzYW1lIG1ldGhvZCBhcyBpbiBDb250ZW50IGJ1dAotICAgICAqIGFsc28gYWRkZWQgdG8gUGFyZW50IHRvIGFsbG93IG1vcmUgZWFzeSB1cC10aGUtdHJlZSB3YWxraW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzIHBhcmVudCdzIHBhcmVudCBvciBudWxsIGlmIG5vbmUKLSAgICAgKi8KLSAgICBQYXJlbnQgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhpcyBwYXJlbnQncyBvd25pbmcgZG9jdW1lbnQgb3IgbnVsbCBpZiB0aGUgYnJhbmNoIGNvbnRhaW5pbmcKLSAgICAgKiB0aGlzIHBhcmVudCBpcyBjdXJyZW50bHkgbm90IGF0dGFjaGVkIHRvIGEgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMgY2hpbGQncyBvd25pbmcgZG9jdW1lbnQgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDlkMDkuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTggbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEFuIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBNZXRob2RzIGFsbG93IHRoZSB1c2VyIHRvIG9idGFpbiB0aGUgdGFyZ2V0IG9mCi0gKiB0aGUgUEkgYXMgd2VsbCBhcyBpdHMgZGF0YS4gVGhlIGRhdGEgY2FuIGFsd2F5cyBiZSBhY2Nlc3NlZCBhcyBhIFN0cmluZyBvciwKLSAqIGlmIHRoZSBkYXRhIGFwcGVhcnMgYWtpbiB0byBhbiBhdHRyaWJ1dGUgbGlzdCwgY2FuIGJlIHJldHJpZXZlZCBhcyBuYW1lL3ZhbHVlCi0gKiBwYWlycy4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIFN0ZXZlbiBHb3VsZAotICovCi0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gZXh0ZW5kcyBDb250ZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKiBUaGUgdGFyZ2V0IG9mIHRoZSBQSSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0OwotCi0gICAgLyoqIFRoZSBkYXRhIGZvciB0aGUgUEkgYXMgYSBTdHJpbmcgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJhd0RhdGE7Ci0KLSAgICAvKiogVGhlIGRhdGEgZm9yIHRoZSBQSSBpbiBuYW1lL3ZhbHVlIHBhaXJzICovCi0gICAgcHJvdGVjdGVkIE1hcCBtYXBEYXRhOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCwgbm8tYXJncyBjb25zdHJ1Y3RvciBmb3IgaW1wbGVtZW50YXRpb25zCi0gICAgICogdG8gdXNlIGlmIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uKCkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4KLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGFuZCBkYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCA8Y29kZT5TdHJpbmc8L2NvZGU+IHRhcmdldCBvZiBQSS4KLSAgICAgKiBAcGFyYW0gZGF0YSA8Y29kZT5NYXA8L2NvZGU+IGRhdGEgZm9yIFBJLCBpbgotICAgICAqICAgICAgICAgICAgIG5hbWUvdmFsdWUgcGFpcnMKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxUYXJnZXRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHRhcmdldCBpcyBpbGxlZ2FsCi0gICAgICogICAgICAgICBhcyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIE1hcCBkYXRhKSB7Ci0gICAgICAgIHNldFRhcmdldCh0YXJnZXQpOwotICAgICAgICBzZXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPgotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IDxjb2RlPlN0cmluZzwvY29kZT4gdGFyZ2V0IG9mIFBJLgotICAgICAqIEBwYXJhbSBkYXRhIDxjb2RlPlN0cmluZzwvY29kZT4gZGF0YSBmb3IgUEkuCi0gICAgICogQHRocm93cyBJbGxlZ2FsVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB0YXJnZXQgaXMgaWxsZWdhbAotICAgICAqICAgICAgICAgYXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotICAgICAgICBzZXRUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgc2V0RGF0YShkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSB0YXJnZXQgZm9yIHRoZSBQSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdUYXJnZXQgPGNvZGU+U3RyaW5nPC9jb2RlPiBuZXcgdGFyZ2V0IG9mIFBJLgotICAgICAqIEByZXR1cm4gPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiAtIHRoaXMgUEkgbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBzZXRUYXJnZXQoU3RyaW5nIG5ld1RhcmdldCkgewotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrUHJvY2Vzc2luZ0luc3RydWN0aW9uVGFyZ2V0KG5ld1RhcmdldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFRhcmdldEV4Y2VwdGlvbihuZXdUYXJnZXQsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0YXJnZXQgPSBuZXdUYXJnZXQ7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFhQYXRoIDEuMCBzdHJpbmcgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCB3aGljaCBpcyB0aGUKLSAgICAgKiBkYXRhIG9mIHRoaXMgUEkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIG9mIHRoaXMgUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gcmF3RGF0YTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSB0aGUgdGFyZ2V0IG9mIHRoZSBQSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIHRhcmdldCBvZiBQSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSByYXcgZGF0YSBmcm9tIGFsbCBpbnN0cnVjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBkYXRhIG9mIFBJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHJhd0RhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZQotICAgICAqICJhdHRyaWJ1dGUiIHN0eWxlIHBpZWNlcyBvZiBuYW1lL3ZhbHVlIHBhaXJzIGluIHRoaXMgUEkncyBkYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiAtIHRoZSA8Y29kZT5MaXN0PC9jb2RlPiBjb250YWluaW5nIHRoZQotICAgICAqICAgICAgICAgImF0dHJpYnV0ZSIgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0UHNldWRvQXR0cmlidXRlTmFtZXMoKSB7Ci0gICAgICBTZXQgbWFwRGF0YVNldCA9IG1hcERhdGEuZW50cnlTZXQoKTsKLSAgICAgIExpc3QgbmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXBEYXRhU2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgU3RyaW5nIHdob2xlU2V0ID0gKGkubmV4dCgpKS50b1N0cmluZygpOwotICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gd2hvbGVTZXQuc3Vic3RyaW5nKDAsKHdob2xlU2V0LmluZGV4T2YoIj0iKSkpOwotICAgICAgICAgbmFtZUxpc3QuYWRkKGF0dHJOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSByYXcgZGF0YSBmb3IgdGhlIFBJLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBkYXRhIG9mIFBJLgotICAgICAqIEByZXR1cm4gPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiAtIHRoaXMgUEkgbW9kaWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBzZXREYXRhKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkRhdGEoZGF0YSk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEYXRhRXhjZXB0aW9uKGRhdGEsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJhd0RhdGEgPSBkYXRhOwotICAgICAgICB0aGlzLm1hcERhdGEgPSBwYXJzZURhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIG5hbWUvdmFsdWUgcGFpcnMgd2l0aGluIHRoZSBwYXNzZWQKLSAgICAgKiA8Y29kZT5NYXA8L2NvZGU+IGFzIHRoZSBwYWlycyBmb3IgdGhlIGRhdGEgb2YKLSAgICAgKiB0aGlzIFBJLiAgVGhlIGtleXMgc2hvdWxkIGJlIHRoZSBwYWlyIG5hbWUKLSAgICAgKiBhbmQgdGhlIHZhbHVlcyBzaG91bGQgYmUgdGhlIHBhaXIgdmFsdWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgbmV3IG1hcCBkYXRhIHRvIHVzZQotICAgICAqIEByZXR1cm4gPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiAtIG1vZGlmaWVkIFBJLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gc2V0RGF0YShNYXAgZGF0YSkgewotICAgICAgICBTdHJpbmcgdGVtcCA9IHRvU3RyaW5nKGRhdGEpOwotCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBWZXJpZmllci5jaGVja1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkRhdGEodGVtcCk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEYXRhRXhjZXB0aW9uKHRlbXAsIHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJhd0RhdGEgPSB0ZW1wOwotICAgICAgICB0aGlzLm1hcERhdGEgPSBkYXRhOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHZhbHVlIGZvciBhIHNwZWNpZmljCi0gICAgICogbmFtZS92YWx1ZSBwYWlyIG9uIHRoZSBQSS4gIElmIG5vIHN1Y2ggcGFpciBpcwotICAgICAqIGZvdW5kIGZvciB0aGlzIFBJLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIG5hbWUvdmFsdWUgcGFpcgotICAgICAqICAgICAgICAgICAgIHRvIGxvb2t1cCB2YWx1ZSBmb3IuCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IC0gdmFsdWUgb2YgbmFtZS92YWx1ZSBwYWlyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHNldWRvQXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpbWFwRGF0YS5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCBhIHBzZXVkbyBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICogSWYgdGhlIFBJIGRhdGEgaXMgbm90IGFscmVhZHkgaW4gYSBwc2V1ZG8tYXR0cmlidXRlIGZvcm1hdCwgdGhpcyB3aWxsCi0gICAgICogcmVwbGFjZSB0aGUgZXhpc3RpbmcgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiBwYWlyLgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvciBwYWlyLgotICAgICAqIEByZXR1cm4gPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiB0aGlzIFBJIG1vZGlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gc2V0UHNldWRvQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrUHJvY2Vzc2luZ0luc3RydWN0aW9uRGF0YShuYW1lKTsKLSAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24obmFtZSwgcmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrUHJvY2Vzc2luZ0luc3RydWN0aW9uRGF0YSh2YWx1ZSk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEYXRhRXhjZXB0aW9uKHZhbHVlLCByZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5tYXBEYXRhLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHRoaXMucmF3RGF0YSA9IHRvU3RyaW5nKG1hcERhdGEpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZW1vdmUgdGhlIHBzZXVkbyBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHBzZXVkbyBhdHRyaWJ1dGUgdG8gcmVtb3ZlCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiAtIHdoZXRoZXIgdGhlIHJlcXVlc3RlZAotICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUHNldWRvQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmICgobWFwRGF0YS5yZW1vdmUobmFtZSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJhd0RhdGEgPSB0b1N0cmluZyhtYXBEYXRhKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjb252ZXJ0IHRoZSBNYXAgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwRGF0YSA8Y29kZT5NYXA8L2NvZGU+IFBJIGRhdGEgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE1hcCBhcyBhcHByb3ByaWF0ZSBmb3IgYSBQSQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKE1hcCBtYXBEYXRhKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByYXdEYXRhID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBtYXBEYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyltYXBEYXRhLmdldChuYW1lKTsKLSAgICAgICAgICAgIHJhd0RhdGEuYXBwZW5kKG5hbWUpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiPVwiIikKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlKQotICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiICIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSBsYXN0IHNwYWNlLCBpZiB3ZSBkaWQgYW55IGFwcGVuZGluZwotICAgICAgICBpZiAocmF3RGF0YS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJhd0RhdGEuc2V0TGVuZ3RoKHJhd0RhdGEubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYXdEYXRhLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHBhcnNlIGFuZCBsb2FkIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBQSS4KLSAgICAgKiBUaGlzIGlzIHNlcGFyYXRlZCB0byBhbGxvdyBpdCB0byBvY2N1ciBvbmNlIGFuZCB0aGVuIGJlIHJldXNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBwYXJzZURhdGEoU3RyaW5nIHJhd0RhdGEpIHsKLSAgICAgICAgLy8gVGhlIHBhcnNpbmcgaGVyZSBpcyBkb25lIGxhcmdlbHkgImJ5IGhhbmQiIHdoaWNoIG1lYW5zIHRoZSBjb2RlCi0gICAgICAgIC8vIGdldHMgYSBsaXR0bGUgdHJpY2t5L21lc3N5LiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHNob3VsZAotICAgICAgICAvLyBub3cgYmUgaGFuZGxlZCBjb3JyZWN0bHk6Ci0gICAgICAgIC8vICAgPD9waSBocmVmPSJodHRwOi8vaGkvYT1iIj8+ICAgICAgICBSZWFkcyBPSwotICAgICAgICAvLyAgIDw/cGkgaHJlZiA9ICdodHRwOi8vaGkvYT1iJyA/PiAgICAgUmVhZHMgT0sKLSAgICAgICAgLy8gICA8P3BpIGhyZWZcdCA9IFx0J2h0dHA6Ly9oaS9hPWInPz4gIFJlYWRzIE9LCi0gICAgICAgIC8vICAgPD9waSBocmVmICA9ICAiaHR0cDovL2hpL2E9YiI/PiAgICBSZWFkcyBPSwotICAgICAgICAvLyAgIDw/cGk/PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHkgTWFwCi0gICAgICAgIC8vICAgPD9waSBpZD0yMj8+ICAgICAgICAgICAgICAgICAgICAgICBFbXB0eSBNYXAKLSAgICAgICAgLy8gICA8P3BpIGlkPScyMj8+ICAgICAgICAgICAgICAgICAgICAgIEVtcHR5IE1hcAotCi0gICAgICAgIE1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJhd0RhdGE6ICIgKyByYXdEYXRhKTsKLQotICAgICAgICAvLyBUaGUgaW5wdXREYXRhIHZhcmlhYmxlIGhvbGRzIHRoZSBwYXJ0IG9mIHJhd0RhdGEgbGVmdCB0byBwYXJzZQotICAgICAgICBTdHJpbmcgaW5wdXREYXRhID0gcmF3RGF0YS50cmltKCk7Ci0KLSAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSByZW1haW5pbmcgaW5wdXREYXRhIHN0cmluZwotICAgICAgICB3aGlsZSAoIWlucHV0RGF0YS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlRGF0YSgpIGxvb2tpbmcgYXQ6ICIgKyBpbnB1dERhdGEpOwotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yICJuYW1lID0iLCAibmFtZT0iIG9yICJuYW1lMSBuYW1lMi4uLiIKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIGludCBzdGFydE5hbWUgPSAwOwotICAgICAgICAgICAgY2hhciBwcmV2aW91c0NoYXIgPSBpbnB1dERhdGEuY2hhckF0KHN0YXJ0TmFtZSk7Ci0gICAgICAgICAgICBpbnQgcG9zID0gMTsKLSAgICAgICAgICAgIGZvciAoOyBwb3M8aW5wdXREYXRhLmxlbmd0aCgpOyBwb3MrKykgewotICAgICAgICAgICAgICAgIGNoYXIgY3VycmVudENoYXIgPSBpbnB1dERhdGEuY2hhckF0KHBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5wdXREYXRhLnN1YnN0cmluZyhzdGFydE5hbWUsIHBvcykudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb24gdGhlIHF1b3RlZCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGJvdW5kYXJpZXMgc28gd2Uga25vdyB3aGVyZSB0byBzdGFydCBuZXh0Ci0gICAgICAgICAgICAgICAgICAgIGludFtdIGJvdW5kcyA9IGV4dHJhY3RRdW90ZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLnN1YnN0cmluZyhwb3MrMSkpOwotICAgICAgICAgICAgICAgICAgICAvLyBBIG51bGwgdmFsdWUgbWVhbnMgYSBwYXJzZSBlcnJvciBhbmQgd2UgcmV0dXJuIGVtcHR5IQotICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaW5wdXREYXRhLnN1YnN0cmluZyhib3VuZHNbMF0rcG9zKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMV0rcG9zKzEpOwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gYm91bmRzWzFdICsgMTsgIC8vIHNraXAgcGFzdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShwcmV2aW91c0NoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydE5hbWUgPSBwb3M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJldmlvdXNDaGFyID0gY3VycmVudENoYXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgcG9zIGNoYXJhY3RlcnM7IHRoZXkgaGF2ZSBiZWVuIHByb2Nlc3NlZAotICAgICAgICAgICAgaW5wdXREYXRhID0gaW5wdXREYXRhLnN1YnN0cmluZyhwb3MpOwotCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4dHJhY3RlZCAobmFtZSwgdmFsdWUpIHBhaXI6ICgiCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiwgJyIgKyB2YWx1ZSsiJykiKTsKLQotICAgICAgICAgICAgLy8gSWYgYm90aCBhIG5hbWUgYW5kIGEgdmFsdWUgaGF2ZSBiZWVuIGZvdW5kLCB0aGVuIGFkZAotICAgICAgICAgICAgLy8gdGhlbSB0byB0aGUgZGF0YSBNYXAKLSAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9pZiAoZGF0YS5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBIHJlcGVhdCwgdGhhdCdzIGEgcGFyc2UgZXJyb3IsIHNvIHJldHVybiBhIG51bGwgbWFwCi0gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgLy9lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIGhlbHBlciByb3V0aW5lLCBvbmx5IHVzZWQgYnkgcGFyc2VEYXRhLCB0byBleHRyYWN0IGEKLSAgICAgKiBxdW90ZWQgU3RyaW5nIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlciwgcmF3RGF0YS4gQSBxdW90ZWQgc3RyaW5nCi0gICAgICogY2FuIHVzZSBlaXRoZXIgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGJ1dCB0aGV5IG11c3QgbWF0Y2ggdXAuCi0gICAgICogQSBzaW5nbHkgcXVvdGVkIHN0cmluZyBjYW4gY29udGFpbiBhbiB1bmJhbGFuY2VkIGFtb3VudCBvZiBkb3VibGUKLSAgICAgKiBxdW90ZXMsIG9yIHZpY2UgdmVyc2EuIEZvciBleGFtcGxlLCB0aGUgU3RyaW5nICJKRE9NJ3MgdGhlIGJlc3QiCi0gICAgICogaXMgbGVnYWwgYXMgaXMgJ0pET00icyB0aGUgYmVzdCcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmF3RGF0YSB0aGUgaW5wdXQgc3RyaW5nIGZyb20gd2hpY2ggYSBxdW90ZWQgc3RyaW5nIGlzIHRvCi0gICAgICogICAgICAgICAgICAgICAgYmUgZXh0cmFjdGVkLgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHF1b3RlZCBzdHJpbmcgZW5jb3VudGVyZWQgaW4gdGhlIGlucHV0IGRhdGEuIElmCi0gICAgICogICAgICAgICBubyBxdW90ZWQgc3RyaW5nIGlzIGZvdW5kLCB0aGVuIHRoZSBlbXB0eSBzdHJpbmcsICIiLCBpcwotICAgICAqICAgICAgICAgcmV0dXJuZWQuCi0gICAgICogQHNlZSAjcGFyc2VEYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gZXh0cmFjdFF1b3RlZFN0cmluZyhTdHJpbmcgcmF3RGF0YSkgewotICAgICAgICAvLyBSZW1lbWJlcnMgd2hldGhlciB3ZSdyZSBhY3R1YWxseSBpbiBhIHF1b3RlZCBzdHJpbmcgeWV0Ci0gICAgICAgIGJvb2xlYW4gaW5RdW90ZXMgPSBmYWxzZTsKLQotICAgICAgICAvLyBSZW1lbWJlcnMgd2hpY2ggdHlwZSBvZiBxdW90ZWQgc3RyaW5nIHdlJ3JlIGluCi0gICAgICAgIGNoYXIgcXVvdGVDaGFyID0gJyInOwotCi0gICAgICAgIC8vIFN0b3JlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbnNpZGUKLSAgICAgICAgLy8gIHRoZSBxdW90ZWQgc3RyaW5nIChpLmUuIHRoZSBzdGFydCBvZiB0aGUgcmV0dXJuIHN0cmluZykKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLQotICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGlucHV0IHN0cmluZyBsb29raW5nIGZvciB0aGUgc3RhcnQKLSAgICAgICAgLy8gYW5kIGVuZCBvZiB0aGUgcXVvdGVkIHN0cmluZwotICAgICAgICBmb3IgKGludCBwb3M9MDsgcG9zIDwgcmF3RGF0YS5sZW5ndGgoKTsgcG9zKyspIHsKLSAgICAgICAgICAgIGNoYXIgY3VycmVudENoYXIgPSByYXdEYXRhLmNoYXJBdChwb3MpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyPT0nIicgfHwgY3VycmVudENoYXI9PSdcJycpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluUXVvdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVudGVyaW5nIGEgcXVvdGVkIHN0cmluZwotICAgICAgICAgICAgICAgICAgICBxdW90ZUNoYXIgPSBjdXJyZW50Q2hhcjsKLSAgICAgICAgICAgICAgICAgICAgaW5RdW90ZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBvcysxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChxdW90ZUNoYXIgPT0gY3VycmVudENoYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbGVhdmluZyBhIHF1b3RlZCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgaW5RdW90ZXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IHN0YXJ0LCBwb3MgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlJ3ZlIGVuY291bnRlcmVkIGEgcXVvdGUKLSAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYSBxdW90ZSwgc28ganVzdCBjb250aW51ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+LCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiBJZiB0aGUgWE1MCi0gICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gaXMgZGVzaXJlZCwKLSAgICAgKiB7QGxpbmsgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlciNvdXRwdXRTdHJpbmcoUHJvY2Vzc2luZ0luc3RydWN0aW9uKX0KLSAgICAgKiBzaG91bGQgYmUgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAqICAgICAgICAgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLSAgICAgICAgICAgIC5hcHBlbmQoIltQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246ICIpCi0gICAgICAgICAgICAuYXBwZW5kKG5ldyBvcmcuamRvbS5vdXRwdXQuWE1MT3V0cHV0dGVyKCkub3V0cHV0U3RyaW5nKHRoaXMpKQotICAgICAgICAgICAgLmFwcGVuZCgiXSIpCi0gICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5PYmplY3Q8L2NvZGU+IC0gY2xvbmUgb2YgdGhpcwotICAgICAqIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgc3VwZXIuY2xvbmUoKTsKLQotICAgICAgICAvLyB0YXJnZXQgYW5kIHJhd2RhdGEgYXJlIGltbXV0YWJsZSBhbmQgcmVmZXJlbmNlcyBjb3BpZWQgYnkKLSAgICAgICAgLy8gT2JqZWN0LmNsb25lKCkKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWFwIG9iamVjdCBmb3IgdGhlIGNsb25lIChzaW5jZSBNYXAgaXNuJ3QgQ2xvbmVhYmxlKQotICAgICAgICBpZiAobWFwRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwaS5tYXBEYXRhID0gcGFyc2VEYXRhKHJhd0RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL1RleHQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTgyNDEyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0KLQotICRJZDogVGV4dC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTggbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbTsKLQotLyoqCi0gKiBDaGFyYWN0ZXItYmFzZWQgWE1MIGNvbnRlbnQuIFByb3ZpZGVzIGEgbW9kdWxhciwgcGFyZW50YWJsZSBtZXRob2Qgb2YKLSAqIHJlcHJlc2VudGluZyB0ZXh0LiBUZXh0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgdGhlIHVuZGVybHlpbmcgdGV4dHVhbAotICogcmVwcmVzZW50YXRpb24gb2YgY2hhcmFjdGVyIGRhdGEsIGJ1dCBkb2VzIGV4cG9zZSB0aGF0IGRhdGEgYXMgYSBKYXZhIFN0cmluZy4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1wdWJsaWMgY2xhc3MgVGV4dCBleHRlbmRzIENvbnRlbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAiQCgjKSAkUkNTZmlsZTogVGV4dC5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE4ICQgJE5hbWU6ICAkIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0KLSAgICAvKiogVGhlIGFjdHVhbCBjaGFyYWN0ZXIgY29udGVudCAqLwotICAgIC8vIFhYWCBTZWUgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20vYXJjaGl2ZS9zZXJ2bGV0L1JlYWRNc2c/bXNnSWQ9ODYxMgotICAgIC8vIGZyb20gZWxoYXJvIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSBKYXZhIGNoYXJhY3RlcnMgbWF5IG5vdCBzdWZmaWNlCi0gICAgLy8gbG9uZyB0ZXJtCi0gICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIHByb3RlY3RlZCwgbm8tYXJncyBjb25zdHJ1Y3RvciBzdGFuZGFyZCBpbiBhbGwgSkRPTQotICAgICAqIGNsYXNzZXMuIEl0IGFsbG93cyBzdWJjbGFzc2VycyB0byBnZXQgYSByYXcgaW5zdGFuY2Ugd2l0aCBubwotICAgICAqIGluaXRpYWxpemF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUZXh0KCkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSwgd2l0aCB0aGUKLSAgICAgKiBzdXBwbGllZCBzdHJpbmcgdmFsdWUgYXMgaXQncyBjaGFyYWN0ZXIgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgdGhlIG5vZGUncyBjaGFyYWN0ZXIgY29udGVudC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEYXRhRXhjZXB0aW9uIGlmIDxjb2RlPnN0cjwvY29kZT4gY29udGFpbnMgYW4KLSAgICAgKiAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyIHN1Y2ggYXMgYSB2ZXJ0aWNhbCB0YWIgKGFzIGRldGVybWluZWQKLSAgICAgKiAgICAgICAgIGJ5IHtAbGluayBvcmcuamRvbS5WZXJpZmllciNjaGVja0NoYXJhY3RlckRhdGF9KQotICAgICAqLwotICAgIHB1YmxpYyBUZXh0KFN0cmluZyBzdHIpIHsKLSAgICAgICAgc2V0VGV4dChzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGFzIGEgSmF2YQotICAgICAqIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gLSBjaGFyYWN0ZXIgY29udGVudCBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSB0ZXh0dWFsIGNvbnRlbnQgd2l0aCBhbGwgc3Vycm91bmRpbmcgd2hpdGVzcGFjZQotICAgICAqIHJlbW92ZWQuICBJZiBvbmx5IHdoaXRlc3BhY2UgZXhpc3RzLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0cmltbWVkIHRleHQgY29udGVudCBvciBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRUcmltKCkgewotICAgICAgICByZXR1cm4gZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgdGhlIHRleHR1YWwgY29udGVudCB3aXRoIGFsbCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlCi0gICAgICogcmVtb3ZlZCBhbmQgaW50ZXJuYWwgd2hpdGVzcGFjZSBub3JtYWxpemVkIHRvIGEgc2luZ2xlIHNwYWNlLiAgSWYKLSAgICAgKiBvbmx5IHdoaXRlc3BhY2UgZXhpc3RzLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBub3JtYWxpemVkIHRleHQgY29udGVudCBvciBlbXB0eSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHROb3JtYWxpemUoKSB7Ci0gICAgICAgIHJldHVybiBub3JtYWxpemVTdHJpbmcoZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYSBuZXcgc3RyaW5nIHdpdGggYWxsIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UKLSAgICAgKiByZW1vdmVkIGFuZCBpbnRlcm5hbCB3aGl0ZXNwYWNlIG5vcm1hbGl6ZWQgdG8gYSBzaW5nbGUgc3BhY2UuICBJZgotICAgICAqIG9ubHkgd2hpdGVzcGFjZSBleGlzdHMsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogUGVyIFhNTCAxLjAgUHJvZHVjdGlvbiAzIHdoaXRlc3BhY2UgaW5jbHVkZXM6ICN4MjAsICN4OSwgI3hELCAjeEEKLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBiZSBub3JtYWxpemVkLgotICAgICAqIEByZXR1cm4gbm9ybWFsaXplZCBzdHJpbmcgb3IgZW1wdHkgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplU3RyaW5nKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklORzsKLQotICAgICAgICBjaGFyW10gYyA9IHN0ci50b0NoYXJBcnJheSgpOwotICAgICAgICBjaGFyW10gbiA9IG5ldyBjaGFyW2MubGVuZ3RoXTsKLSAgICAgICAgYm9vbGVhbiB3aGl0ZSA9IHRydWU7Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgiIFx0XG5cciIuaW5kZXhPZihjW2ldKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGlmICghd2hpdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbltwb3MrK10gPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgIHdoaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuW3BvcysrXSA9IGNbaV07Ci0gICAgICAgICAgICAgICAgd2hpdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAod2hpdGUgJiYgcG9zID4gMCkgewotICAgICAgICAgICAgcG9zLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobiwgMCwgcG9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGlzIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIHZhbHVlIGZvciBub2RlJ3MgY29udGVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgaW52b2tlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBjb250YWlucyBhbgotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgc3VjaCBhcyBhIHZlcnRpY2FsIHRhYiAoYXMgZGV0ZXJtaW5lZAotICAgICAqICAgICAgICAgYnkge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pCi0gICAgICovCi0gICAgcHVibGljIFRleHQgc2V0VGV4dChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb247Ci0KLSAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZWFzb24gPSBWZXJpZmllci5jaGVja0NoYXJhY3RlckRhdGEoc3RyKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEYXRhRXhjZXB0aW9uKHN0ciwgImNoYXJhY3RlciBjb250ZW50IiwgcmVhc29uKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9IHN0cjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGFwcGVuZCBjaGFyYWN0ZXIgY29udGVudCB0byB3aGF0ZXZlciBjb250ZW50IGFscmVhZHkKLSAgICAgKiBleGlzdHMgd2l0aGluIHRoaXMgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgY2hhcmFjdGVyIGNvbnRlbnQgdG8gYXBwZW5kLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERhdGFFeGNlcHRpb24gaWYgPGNvZGU+c3RyPC9jb2RlPiBjb250YWlucyBhbgotICAgICAqICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIgc3VjaCBhcyBhIHZlcnRpY2FsIHRhYiAoYXMgZGV0ZXJtaW5lZAotICAgICAqICAgICAgICAgYnkge0BsaW5rIG9yZy5qZG9tLlZlcmlmaWVyI2NoZWNrQ2hhcmFjdGVyRGF0YX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHIpIHsKLSAgICAgICAgU3RyaW5nIHJlYXNvbjsKLQotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlYXNvbiA9IFZlcmlmaWVyLmNoZWNrQ2hhcmFjdGVyRGF0YShzdHIpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERhdGFFeGNlcHRpb24oc3RyLCAiY2hhcmFjdGVyIGNvbnRlbnQiLCByZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0ciA9PSBFTVBUWV9TVFJJTkcpCi0gICAgICAgICAgICAgdmFsdWUgPSBzdHI7Ci0gICAgICAgIGVsc2UgdmFsdWUgKz0gc3RyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBhcHBlbmQgdGhlIGNvbnRlbnQgb2YgYW5vdGhlciA8Y29kZT5UZXh0PC9jb2RlPiBub2RlCi0gICAgICogdG8gdGhpcyBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgVGV4dCBub2RlIHRvIGFwcGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmQoVGV4dCB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSArPSB0ZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBYUGF0aCAxLjAgc3RyaW5nIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgd2hpY2ggaXMgdGhlCi0gICAgICogdGV4dCBpdHNlbGYuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAgICogPGNvZGU+VGV4dDwvY29kZT4gbm9kZSwgc3VpdGFibGUgZm9yIGRlYnVnZ2luZy4gSWYgdGhlIFhNTAotICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGlzIGRlc2lyZWQsCi0gICAgICogZWl0aGVyIDxjb2RlPntAbGluayAjZ2V0VGV4dH08L2NvZGU+IG9yCi0gICAgICoge0BsaW5rIG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXIjb3V0cHV0U3RyaW5nKFRleHQpfTwvY29kZT4KLSAgICAgKiBzaG91bGQgYmUgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcig2NCkKLSAgICAgICAgICAgIC5hcHBlbmQoIltUZXh0OiAiKQotICAgICAgICAgICAgLmFwcGVuZChnZXRUZXh0KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCJdIikKLSAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gYSBjbG9uZSBvZiB0aGlzIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUsIHdpdGggdGhlCi0gICAgICogc2FtZSBjaGFyYWN0ZXIgY29udGVudCwgYnV0IG5vIHBhcmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+VGV4dDwvY29kZT4gLSBjbG9uZWQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dClzdXBlci5jbG9uZSgpOwotICAgICAgICB0ZXh0LnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9VbmNoZWNrZWRKRE9NRmFjdG9yeS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9VbmNoZWNrZWRKRE9NRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhjYmFmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vVW5jaGVja2VkSkRPTUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogU3BlY2lhbCBmYWN0b3J5IGZvciBidWlsZGluZyBkb2N1bWVudHMgd2l0aG91dCBhbnkgY29udGVudCBvciBzdHJ1Y3R1cmUKLSAqIGNoZWNraW5nLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGFyZSAxMDAlIHBvc2l0aXZlIHRoYXQgdGhlCi0gKiBpbnB1dCBpcyBhYnNvbHV0ZWx5IGNvcnJlY3QuICBUaGlzIGZhY3RvcnkgY2FuIHNwZWVkIGJ1aWxkcywgYnV0IGFueQotICogcHJvYmxlbXMgaW4gdGhlIGlucHV0IHdpbGwgYmUgdW5jYXVnaHQgdW50aWwgbGF0ZXIgd2hlbiB0aGV5IGNvdWxkIGNhdXNlCi0gKiBpbmZpbml0ZSBsb29wcywgbWFsZm9ybWVkIFhNTCwgb3Igd29yc2UuICBVc2Ugd2l0aCBleHRyZW1lIGNhdXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNoZWNrZWRKRE9NRmFjdG9yeSBpbXBsZW1lbnRzIEpET01GYWN0b3J5IHsKLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEVsZW1lbnQgRmFjdG9yeQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIEVsZW1lbnQgZWxlbWVudChTdHJpbmcgbmFtZSwgTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgICBFbGVtZW50IGUgPSBuZXcgRWxlbWVudCgpOwotICAgICAgICBlLm5hbWUgPSBuYW1lOwotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgZS5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRWxlbWVudCBlID0gbmV3IEVsZW1lbnQoKTsKLSAgICAgICAgZS5uYW1lID0gbmFtZTsKLSAgICAgICAgZS5uYW1lc3BhY2UgPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBlbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50KG5hbWUsIE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoIiIsIHVyaSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQobmFtZSwgTmFtZXNwYWNlLmdldE5hbWVzcGFjZShwcmVmaXgsIHVyaSkpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEF0dHJpYnV0ZSBGYWN0b3J5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSBhID0gbmV3IEF0dHJpYnV0ZSgpOwotICAgICAgICBhLm5hbWUgPSBuYW1lOwotICAgICAgICBhLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZXNwYWNlID0gTmFtZXNwYWNlLk5PX05BTUVTUEFDRTsKLSAgICAgICAgfQotICAgICAgICBhLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZSBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgaW50IHR5cGUsIE5hbWVzcGFjZSBuYW1lc3BhY2UpIHsKLSAgICAgICAgQXR0cmlidXRlIGEgPSBuZXcgQXR0cmlidXRlKCk7Ci0gICAgICAgIGEubmFtZSA9IG5hbWU7Ci0gICAgICAgIGEudHlwZSA9IHR5cGU7Ci0gICAgICAgIGEudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFOwotICAgICAgICB9Ci0gICAgICAgIGEubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSBhID0gbmV3IEF0dHJpYnV0ZSgpOwotICAgICAgICBhLm5hbWUgPSBuYW1lOwotICAgICAgICBhLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGEubmFtZXNwYWNlID0gTmFtZXNwYWNlLk5PX05BTUVTUEFDRTsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZSBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgaW50IHR5cGUpIHsKLSAgICAgICAgQXR0cmlidXRlIGEgPSBuZXcgQXR0cmlidXRlKCk7Ci0gICAgICAgIGEubmFtZSA9IG5hbWU7Ci0gICAgICAgIGEudHlwZSA9IHR5cGU7Ci0gICAgICAgIGEudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgYS5uYW1lc3BhY2UgPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFOwotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBUZXh0IEZhY3RvcnkKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyBUZXh0IHRleHQoU3RyaW5nIHN0cikgewotICAgICAgICBUZXh0IHQgPSBuZXcgVGV4dCgpOwotICAgICAgICB0LnZhbHVlID0gc3RyOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBDREFUQSBGYWN0b3J5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgQ0RBVEEgY2RhdGEoU3RyaW5nIHN0cikgewotICAgICAgICBDREFUQSBjID0gbmV3IENEQVRBKCk7Ci0gICAgICAgIGMudmFsdWUgPSBzdHI7Ci0gICAgICAgIHJldHVybiBjOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIENvbW1lbnQgRmFjdG9yeQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIENvbW1lbnQgY29tbWVudChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIENvbW1lbnQgYyA9IG5ldyBDb21tZW50KCk7Ci0gICAgICAgIGMudGV4dCA9IHN0cjsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBGYWN0b3J5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBNYXAgZGF0YSkgewotICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcCA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKTsKLSAgICAgICAgcC50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIHAuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHsKLSAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHAgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7Ci0gICAgICAgIHAudGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICBwLnNldERhdGEoZGF0YSk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEVudGl0eSBSZWYgRmFjdG9yeQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRW50aXR5UmVmIGUgPSBuZXcgb3JnLmpkb20uRW50aXR5UmVmKCk7Ci0gICAgICAgIGUubmFtZSA9IG5hbWU7Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnRpdHlSZWYgZW50aXR5UmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgc3lzdGVtSUQpIHsKLSAgICAgICAgRW50aXR5UmVmIGUgPSBuZXcgRW50aXR5UmVmKCk7Ci0gICAgICAgIGUubmFtZSA9IG5hbWU7Ci0gICAgICAgIGUuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eVJlZiBlbnRpdHlSZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0gICAgICAgIEVudGl0eVJlZiBlID0gbmV3IEVudGl0eVJlZigpOwotICAgICAgICBlLm5hbWUgPSBuYW1lOwotICAgICAgICBlLnB1YmxpY0lEID0gcHVibGljSUQ7Ci0gICAgICAgIGUuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gRG9jVHlwZSBGYWN0b3J5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgRG9jVHlwZSBkb2NUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLSAgICAgICAgRG9jVHlwZSBkID0gbmV3IERvY1R5cGUoKTsKLSAgICAgICAgZC5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgICAgICBkLnB1YmxpY0lEID0gcHVibGljSUQ7Ci0gICAgICAgIGQuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotCi0gICAgcHVibGljIERvY1R5cGUgZG9jVHlwZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBzeXN0ZW1JRCkgewotICAgICAgICByZXR1cm4gZG9jVHlwZShlbGVtZW50TmFtZSwgbnVsbCwgc3lzdGVtSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2NUeXBlIGRvY1R5cGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb2NUeXBlKGVsZW1lbnROYW1lLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBEb2N1bWVudCBGYWN0b3J5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZG9jdW1lbnQoRWxlbWVudCByb290RWxlbWVudCwgRG9jVHlwZSBkb2NUeXBlLCBTdHJpbmcgYmFzZVVSSSkgewotICAgICAgICBEb2N1bWVudCBkID0gbmV3IERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2NUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZENvbnRlbnQoZCwgZG9jVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZENvbnRlbnQoZCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIGQuYmFzZVVSSSA9IGJhc2VVUkk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGRvY3VtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQsIERvY1R5cGUgZG9jVHlwZSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQocm9vdEVsZW1lbnQsIGRvY1R5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBkb2N1bWVudChFbGVtZW50IHJvb3RFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudChyb290RWxlbWVudCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gTGlzdCBtYW5pcHVsYXRpb24KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnQoUGFyZW50IHBhcmVudCwgQ29udGVudCBjaGlsZCkgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgRWxlbWVudCBlbHQgPSAoRWxlbWVudCkgcGFyZW50OwotICAgICAgICAgICAgZWx0LmNvbnRlbnQudW5jaGVja2VkQWRkQ29udGVudChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIHBhcmVudDsKLSAgICAgICAgICAgIGRvYy5jb250ZW50LnVuY2hlY2tlZEFkZENvbnRlbnQoY2hpbGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEVsZW1lbnQgcGFyZW50LCBBdHRyaWJ1dGUgYSkgewotICAgICAgICBwYXJlbnQuYXR0cmlidXRlcy51bmNoZWNrZWRBZGRBdHRyaWJ1dGUoYSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oRWxlbWVudCBwYXJlbnQsIE5hbWVzcGFjZSBhZGRpdGlvbmFsKSB7Ci0gICAgICAgIGlmIChwYXJlbnQuYWRkaXRpb25hbE5hbWVzcGFjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50LmFkZGl0aW9uYWxOYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdCg1KTsgLy9FbGVtZW50LklOSVRJQUxfQVJSQVlfU0laRQotICAgICAgICB9Ci0gICAgICAgIHBhcmVudC5hZGRpdGlvbmFsTmFtZXNwYWNlcy5hZGQoYWRkaXRpb25hbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9WZXJpZmllci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9WZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM0ODQxLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjYgKzAsMCBAQAotLyotLSAKLQotICRJZDogVmVyaWZpZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE3IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSB3ZWxsLWZvcm1lZG5lc3MgY2hlY2tzIG9uIG5hbWVzLCBkYXRhLCBhbmQgb3RoZXIKLSAqIHZlcmlmaWNhdGlvbiB0YXNrcyBmb3IgSkRPTS4gVGhlIGNsYXNzIGlzIGZpbmFsIGFuZCBtYXkgbm90IGJlIHN1YmNsYXNzZWQuCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgRWxsaW90dGUgUnVzdHkgSGFyb2xkCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgVmVyaWZpZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IFZlcmlmaWVyLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIGluc3RhbnRhdGlvbiBjYW5ub3Qgb2NjdXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWZXJpZmllcigpIHsgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSBzdXBwbGllZCBuYW1lIHRvIHNlZSBpZiBpdCBpcyBsZWdhbCBmb3IgdXNlIGFzCi0gICAgICogYSBKRE9NIDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4gbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gcmVhc29uIG5hbWUgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgT0suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tFbGVtZW50TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyBDaGVjayBiYXNpYyBYTUwgbmFtZSBydWxlcyBmaXJzdAotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IGNoZWNrWE1MTmFtZShuYW1lKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vIGNvbG9ucyBhbGxvd2VkLCBzaW5jZSBlbGVtZW50cyBoYW5kbGUgdGhpcyBpbnRlcm5hbGx5Ci0gICAgICAgIGlmIChuYW1lLmluZGV4T2YoIjoiKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuICJFbGVtZW50IG5hbWVzIGNhbm5vdCBjb250YWluIGNvbG9ucyI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHN1cHBsaWVkIG5hbWUgdG8gc2VlIGlmIGl0IGlzIGxlZ2FsIGZvciB1c2UgYXMKLSAgICAgKiBhIEpET00gPGNvZGU+e0BsaW5rIEF0dHJpYnV0ZX08L2NvZGU+IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBuYW1lIGlzIGlsbGVnYWwsIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIE9LLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQXR0cmlidXRlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyBDaGVjayBiYXNpYyBYTUwgbmFtZSBydWxlcyBmaXJzdAotICAgICAgICBTdHJpbmcgcmVhc29uOwotICAgICAgICBpZiAoKHJlYXNvbiA9IGNoZWNrWE1MTmFtZShuYW1lKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vIGNvbG9ucyBhcmUgYWxsb3dlZCwgc2luY2UgYXR0cmlidXRlcyBoYW5kbGUgdGhpcyBpbnRlcm5hbGx5Ci0gICAgICAgIGlmIChuYW1lLmluZGV4T2YoIjoiKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuICJBdHRyaWJ1dGUgbmFtZXMgY2Fubm90IGNvbnRhaW4gY29sb25zIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEF0dHJpYnV0ZSBuYW1lcyBtYXkgbm90IGJlIHhtbG5zIHNpbmNlIHdlIGRvIHRoaXMgaW50ZXJuYWxseSB0b28KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJ4bWxucyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkFuIEF0dHJpYnV0ZSBuYW1lIG1heSBub3QgYmUgXCJ4bWxuc1wiOyAiICsKLSAgICAgICAgICAgICAgICAgICAidXNlIHRoZSBOYW1lc3BhY2UgY2xhc3MgdG8gbWFuYWdlIG5hbWVzcGFjZXMiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgT0sKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjaGVjayB0aGUgc3VwcGxpZWQgc3RyaW5nIHRvIHNlZSBpZiBpdCBvbmx5IGNvbnRhaW5zCi0gICAgICogY2hhcmFjdGVycyBhbGxvd2VkIGJ5IHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uIFRoZSBDMCBjb250cm9scwotICAgICAqIChlLmcuIG51bGwsIHZlcnRpY2FsIHRhYiwgZm9ybWZlZWQsIGV0Yy4pIGFyZSBzcGVjaWZpY2FsbHkgZXhjbHVkZWQKLSAgICAgKiBleGNlcHQgZm9yIGNhcnJpYWdlIHJldHVybiwgbGluZWZlZWQsIGFuZCB0aGUgaG9yaXpvbnRhbCB0YWIuCi0gICAgICogU3Vycm9nYXRlcyBhcmUgYWxzbyBleGNsdWRlZC4gCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBjaGVja2luZyBlbGVtZW50IGNvbnRlbnQgYW5kIGF0dHJpYnV0ZQotICAgICAqIHZhbHVlcy4gTm90ZSB0aGF0IGNoYXJhY3RlcnMgCi0gICAgICogbGlrZSAiIGFuZCAmbHQ7IGFyZSBhbGxvd2VkIGluIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGVsZW1lbnQgY29udGVudC4gCi0gICAgICogVGhleSB3aWxsIHNpbXBseSBiZSBlc2NhcGVkIGFzICZxdW90OyBvciAmbHQ7IAotICAgICAqIHdoZW4gdGhlIHZhbHVlIGlzIHNlcmlhbGl6ZWQuIAotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBuYW1lIGlzIGlsbGVnYWwsIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIE9LLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ2hhcmFjdGVyRGF0YShTdHJpbmcgdGV4dCkgewotICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkEgbnVsbCBpcyBub3QgYSBsZWdhbCBYTUwgdmFsdWUiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG8gY2hlY2sKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRleHQubGVuZ3RoKCk7IGk8bGVuOyBpKyspIHsKLQotICAgICAgICAgICAgaW50IGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIGhpZ2ggcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyCi0gICAgICAgICAgICBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDw9IDB4REJGRikgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG5leHQgY2hhciBpcyB0aGUgbG93LXN1cnJvZ2F0ZQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGxvdyA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG93IDwgMHhEQzAwIHx8IGxvdyA+IDB4REZGRikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbGxlZ2FsIFN1cnJvZ2F0ZSBQYWlyIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgZ29vZCBwYWlyLCBjYWxjdWxhdGUgdGhlIHRydWUgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNoYXJhY3RlciB0byB0aGVuIGZhbGwgdGhydSB0byBpc1hNTENoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICBjaCA9IDB4MTAwMDAgKyAoY2ggLSAweEQ4MDApICogMHg0MDAgKyAobG93IC0gMHhEQzAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiU3Vycm9nYXRlIFBhaXIgVHJ1bmNhdGVkIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaXNYTUxDaGFyYWN0ZXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTGlrZWx5IHRoaXMgY2hhcmFjdGVyIGNhbid0IGJlIGVhc2lseSBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGl0J3MgYSBjb250cm9sIHNvIHdlIHVzZSBpdCdkIGhleGFkZWNpbWFsIAotICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGluIHRoZSByZWFzb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuICgiMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgYSBsZWdhbCBYTUwgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHN1cHBsaWVkIGRhdGEgdG8gc2VlIGlmIGl0IGlzIGxlZ2FsIGZvciB1c2UgYXMKLSAgICAgKiBKRE9NIDxjb2RlPntAbGluayBDREFUQX08L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBkYXRhIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiByZWFzb24gZGF0YSBpcyBpbGxlZ2FsLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaXMgbmFtZSBpcyBPSy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0NEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gbnVsbDsKLSAgICAgICAgaWYgKChyZWFzb24gPSBjaGVja0NoYXJhY3RlckRhdGEoZGF0YSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFzb247Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YS5pbmRleE9mKCJdXT4iKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuICJDREFUQSBjYW5ub3QgaW50ZXJuYWxseSBjb250YWluIGEgQ0RBVEEgZW5kaW5nICIgKwotICAgICAgICAgICAgICAgICAgICJkZWxpbWl0ZXIgKF1dPikiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgT0sKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSBzdXBwbGllZCBuYW1lIHRvIHNlZSBpZiBpdCBpcyBsZWdhbCBmb3IgdXNlIGFzCi0gICAgICogYSBKRE9NIDxjb2RlPntAbGluayBOYW1lc3BhY2V9PC9jb2RlPiBwcmVmaXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZml4IDxjb2RlPlN0cmluZzwvY29kZT4gcHJlZml4IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiByZWFzb24gbmFtZSBpcyBpbGxlZ2FsLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBPSy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWVzcGFjZVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIC8vIE1hbnVhbGx5IGRvIHJ1bGVzLCBzaW5jZSBVUklzIGNhbiBiZSBudWxsIG9yIGVtcHR5Ci0gICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXguZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggYSBudW1iZXIKLSAgICAgICAgY2hhciBmaXJzdCA9IHByZWZpeC5jaGFyQXQoMCk7Ci0gICAgICAgIGlmIChpc1hNTERpZ2l0KGZpcnN0KSkgewotICAgICAgICAgICAgcmV0dXJuICJOYW1lc3BhY2UgcHJlZml4ZXMgY2Fubm90IGJlZ2luIHdpdGggYSBudW1iZXIiOwotICAgICAgICB9Ci0gICAgICAgIC8vIENhbm5vdCBzdGFydCB3aXRoIGEgJAotICAgICAgICBpZiAoZmlyc3QgPT0gJyQnKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk5hbWVzcGFjZSBwcmVmaXhlcyBjYW5ub3QgYmVnaW4gd2l0aCBhIGRvbGxhciBzaWduICgkKSI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggYSAtCi0gICAgICAgIGlmIChmaXJzdCA9PSAnLScpIHsKLSAgICAgICAgICAgIHJldHVybiAiTmFtZXNwYWNlIHByZWZpeGVzIGNhbm5vdCBiZWdpbiB3aXRoIGEgaHlwaGVuICgtKSI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggYSAuCi0gICAgICAgIGlmIChmaXJzdCA9PSAnLicpIHsKLSAgICAgICAgICAgIHJldHVybiAiTmFtZXNwYWNlIHByZWZpeGVzIGNhbm5vdCBiZWdpbiB3aXRoIGEgcGVyaW9kICguKSI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggInhtbCIgaW4gYW55IGNoYXJhY3RlciBjYXNlCi0gICAgICAgIGlmIChwcmVmaXgudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ4bWwiKSkgewotICAgICAgICAgICAgcmV0dXJuICJOYW1lc3BhY2UgcHJlZml4ZXMgY2Fubm90IGJlZ2luIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgIlwieG1sXCIgaW4gYW55IGNvbWJpbmF0aW9uIG9mIGNhc2UiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5zdXJlIGxlZ2FsIGNvbnRlbnQKLSAgICAgICAgZm9yIChpbnQgaT0wLCBsZW4gPSBwcmVmaXgubGVuZ3RoKCk7IGk8bGVuOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHByZWZpeC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzWE1MTmFtZUNoYXJhY3RlcihjKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiTmFtZXNwYWNlIHByZWZpeGVzIGNhbm5vdCBjb250YWluIHRoZSBjaGFyYWN0ZXIgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm8gY29sb25zIGFsbG93ZWQKLSAgICAgICAgaWYgKHByZWZpeC5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAiTmFtZXNwYWNlIHByZWZpeGVzIGNhbm5vdCBjb250YWluIGNvbG9ucyI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHN1cHBsaWVkIG5hbWUgdG8gc2VlIGlmIGl0IGlzIGxlZ2FsIGZvciB1c2UgYXMKLSAgICAgKiBhIEpET00gPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+IFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgPGNvZGU+U3RyaW5nPC9jb2RlPiBVUkkgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBuYW1lIGlzIGlsbGVnYWwsIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIE9LLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZXNwYWNlVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy8gTWFudWFsbHkgZG8gcnVsZXMsIHNpbmNlIFVSSXMgY2FuIGJlIG51bGwgb3IgZW1wdHkKLSAgICAgICAgaWYgKCh1cmkgPT0gbnVsbCkgfHwgKHVyaS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW5ub3Qgc3RhcnQgd2l0aCBhIG51bWJlcgotICAgICAgICBjaGFyIGZpcnN0ID0gdXJpLmNoYXJBdCgwKTsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGZpcnN0KSkgewotICAgICAgICAgICAgcmV0dXJuICJOYW1lc3BhY2UgVVJJcyBjYW5ub3QgYmVnaW4gd2l0aCBhIG51bWJlciI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggYSAkCi0gICAgICAgIGlmIChmaXJzdCA9PSAnJCcpIHsKLSAgICAgICAgICAgIHJldHVybiAiTmFtZXNwYWNlIFVSSXMgY2Fubm90IGJlZ2luIHdpdGggYSBkb2xsYXIgc2lnbiAoJCkiOwotICAgICAgICB9Ci0gICAgICAgIC8vIENhbm5vdCBzdGFydCB3aXRoIGEgLQotICAgICAgICBpZiAoZmlyc3QgPT0gJy0nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk5hbWVzcGFjZSBVUklzIGNhbm5vdCBiZWdpbiB3aXRoIGEgaHlwaGVuICgtKSI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0d28gbmFtZXNwYWNlcyBjb2xsaWRlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIGNoZWNrLgotICAgICAqIEBwYXJhbSBvdGhlciA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIGNoZWNrIGFnYWluc3QuCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBmb3IgY29sbGlzaW9uLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29sbGlzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZXNwYWNlQ29sbGlzaW9uKE5hbWVzcGFjZSBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlIG90aGVyKSB7Ci0gICAgICAgIFN0cmluZyBwMSxwMix1MSx1MixyZWFzb247Ci0KLSAgICAgICAgcmVhc29uID0gbnVsbDsKLSAgICAgICAgcDEgPSBuYW1lc3BhY2UuZ2V0UHJlZml4KCk7Ci0gICAgICAgIHUxID0gbmFtZXNwYWNlLmdldFVSSSgpOwotICAgICAgICBwMiA9IG90aGVyLmdldFByZWZpeCgpOwotICAgICAgICB1MiA9IG90aGVyLmdldFVSSSgpOwotICAgICAgICBpZiAocDEuZXF1YWxzKHAyKSAmJiAhdTEuZXF1YWxzKHUyKSkgewotICAgICAgICAgICAgcmVhc29uID0gIlRoZSBuYW1lc3BhY2UgcHJlZml4IFwiIiArIHAxICsgIlwiIGNvbGxpZGVzIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhc29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIDxjb2RlPntAbGluayBBdHRyaWJ1dGV9PC9jb2RlPidzIG5hbWVzcGFjZSBjb2xsaWRlcyB3aXRoIGEgCi0gICAgICogPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPidzIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgPGNvZGU+QXR0cmlidXRlPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byBjaGVjayBhZ2FpbnN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiByZWFzb24gZm9yIGNvbGxpc2lvbiwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbGxpc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWVzcGFjZUNvbGxpc2lvbihBdHRyaWJ1dGUgYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBOYW1lc3BhY2UgbmFtZXNwYWNlID0gYXR0cmlidXRlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZXNwYWNlLmdldFByZWZpeCgpOwotICAgICAgICBpZiAoIiIuZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNoZWNrTmFtZXNwYWNlQ29sbGlzaW9uKG5hbWVzcGFjZSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgYSA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4gY29sbGlkZXMgd2l0aCBhCi0gICAgICogPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPidzIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byBjaGVjayBhZ2FpbnN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiByZWFzb24gZm9yIGNvbGxpc2lvbiwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbGxpc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWVzcGFjZUNvbGxpc2lvbihOYW1lc3BhY2UgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gY2hlY2tOYW1lc3BhY2VDb2xsaXNpb24obmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYXNvbiArICIgd2l0aCB0aGUgZWxlbWVudCBuYW1lc3BhY2UgcHJlZml4IjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYXNvbiA9IGNoZWNrTmFtZXNwYWNlQ29sbGlzaW9uKG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBZGRpdGlvbmFsTmFtZXNwYWNlcygpKTsKLSAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhc29uOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhc29uID0gY2hlY2tOYW1lc3BhY2VDb2xsaXNpb24obmFtZXNwYWNlLCBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIGEgPGNvZGU+e0BsaW5rIE5hbWVzcGFjZX08L2NvZGU+IGNvbGxpZGVzIHdpdGggYQotICAgICAqIDxjb2RlPntAbGluayBBdHRyaWJ1dGV9PC9jb2RlPidzIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gdG8gY2hlY2sgYWdhaW5zdC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gcmVhc29uIGZvciBjb2xsaXNpb24sIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb2xsaXNpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lc3BhY2VDb2xsaXNpb24oTmFtZXNwYWNlIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBjaGVja05hbWVzcGFjZUNvbGxpc2lvbihuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlYXNvbiArPSAiIHdpdGggYW4gYXR0cmlidXRlIG5hbWVzcGFjZSBwcmVmaXggb24gdGhlIGVsZW1lbnQiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFzb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgYSA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4gY29sbGlkZXMgd2l0aCBhbnkgbmFtZXNwYWNlCi0gICAgICogZnJvbSBhIGxpc3Qgb2Ygb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0gbGlzdCA8Y29kZT5MaXN0PC9jb2RlPiB0byBjaGVjayBhZ2FpbnN0LgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiByZWFzb24gZm9yIGNvbGxpc2lvbiwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbGxpc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWVzcGFjZUNvbGxpc2lvbihOYW1lc3BhY2UgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgbGlzdCkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZWFzb24gPSBudWxsOwotICAgICAgICBJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoKHJlYXNvbiA9PSBudWxsKSAmJiBpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGNoZWNrTmFtZXNwYWNlQ29sbGlzaW9uKG5hbWVzcGFjZSwgKEF0dHJpYnV0ZSkgb2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZWFzb24gPSBjaGVja05hbWVzcGFjZUNvbGxpc2lvbihuYW1lc3BhY2UsIChFbGVtZW50KSBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgcmVhc29uID0gY2hlY2tOYW1lc3BhY2VDb2xsaXNpb24obmFtZXNwYWNlLCAoTmFtZXNwYWNlKSBvYmopOwotICAgICAgICAgICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZWFzb24gKz0gIiB3aXRoIGFuIGFkZGl0aW9uYWwgbmFtZXNwYWNlIGRlY2xhcmVkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5IHRoZSBlbGVtZW50IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHN1cHBsaWVkIGRhdGEgdG8gc2VlIGlmIGl0IGlzIGxlZ2FsIGZvciB1c2UgYXMKLSAgICAgKiBhIEpET00gPGNvZGU+e0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn08L2NvZGU+IHRhcmdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0YXJnZXQgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiB0YXJnZXQgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRhcmdldCBpcyBPSy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1Byb2Nlc3NpbmdJbnN0cnVjdGlvblRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0gICAgICAgIC8vIENoZWNrIGJhc2ljIFhNTCBuYW1lIHJ1bGVzIGZpcnN0Ci0gICAgICAgIFN0cmluZyByZWFzb247Ci0gICAgICAgIGlmICgocmVhc29uID0gY2hlY2tYTUxOYW1lKHRhcmdldCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFzb247Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBObyBjb2xvbnMgYWxsb3dlZCwgcGVyIE5hbWVzcGFjZSBTcGVjaWZpY2F0aW9uIFNlY3Rpb24gNgotICAgICAgICBpZiAodGFyZ2V0LmluZGV4T2YoIjoiKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuICJQcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldHMgY2Fubm90IGNvbnRhaW4gY29sb25zIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbm5vdCBiZWdpbiB3aXRoICd4bWwnIGluIGFueSBjYXNlCi0gICAgICAgIGlmICh0YXJnZXQuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikpIHsKLSAgICAgICAgICAgIHJldHVybiAiUHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgY2Fubm90IGhhdmUgYSB0YXJnZXQgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgIlwieG1sXCIgaW4gYW55IGNvbWJpbmF0aW9uIG9mIGNhc2UuIChOb3RlIHRoYXQgdGhlICIgKwotICAgICAgICAgICAgICAgICAgICJcIjw/eG1sIC4uLiA/PlwiIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSAiICsKLSAgICAgICAgICAgICAgICAgICAiZG9jdW1lbnQgaXMgbm90IGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhbmQgc2hvdWxkIG5vdCAiICsgCi0gICAgICAgICAgICAgICAgICAgImJlIGFkZGVkIGFzIG9uZTsgaXQgaXMgd3JpdHRlbiBhdXRvbWF0aWNhbGx5IGR1cmluZyAiICsKLSAgICAgICAgICAgICAgICAgICAib3V0cHV0LCBlLmcuIGJ5IFhNTE91dHB1dHRlci4pIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCBldmVyeXRoaW5nIGlzIE9LCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSBzdXBwbGllZCBkYXRhIHRvIHNlZSBpZiBpdCBpcyBsZWdhbCBmb3IgdXNlIGFzCi0gICAgICogPGNvZGU+e0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn08L2NvZGU+IGRhdGEuIEJlc2lkZXMgY2hlY2tpbmcgdGhhdAotICAgICAqIGFsbCB0aGUgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBpbiBYTUwsIHRoaXMgYWxzbyBjaGVja3MKLSAgICAgKiB0aGF0IHRoZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gdGhlIFBJIGVuZC1zdHJpbmcgIj8mZ3Q7Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIDxjb2RlPlN0cmluZzwvY29kZT4gZGF0YSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gcmVhc29uIGRhdGEgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGRhdGEgaXMgT0suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EYXRhKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIC8vIENoZWNrIGJhc2ljIFhNTCBuYW1lIHJ1bGVzIGZpcnN0Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBjaGVja0NoYXJhY3RlckRhdGEoZGF0YSk7Ci0KLSAgICAgICAgaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YS5pbmRleE9mKCI/PiIpID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBjb250YWluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAidGhlIHN0cmluZyBcIj8+XCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHN1cHBsaWVkIGRhdGEgdG8gc2VlIGlmIGl0IGlzIGxlZ2FsIGZvciB1c2UgYXMKLSAgICAgKiBKRE9NIDxjb2RlPntAbGluayBDb21tZW50fTwvY29kZT4gZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIDxjb2RlPlN0cmluZzwvY29kZT4gZGF0YSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gcmVhc29uIGRhdGEgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGRhdGEgaXMgT0suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb21tZW50RGF0YShTdHJpbmcgZGF0YSkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gbnVsbDsKLSAgICAgICAgaWYgKChyZWFzb24gPSBjaGVja0NoYXJhY3RlckRhdGEoZGF0YSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFzb247Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YS5pbmRleE9mKCItLSIpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbW1lbnRzIGNhbm5vdCBjb250YWluIGRvdWJsZSBoeXBoZW5zICgtLSkiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkYXRhLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgcmV0dXJuICJDb21tZW50IGRhdGEgY2Fubm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF0YS5lbmRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbW1lbnQgZGF0YSBjYW5ub3QgZW5kIHdpdGggYSBoeXBoZW4uIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCBldmVyeXRoaW5nIGlzIE9LCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfAotICAgIC8vIFstJygpKywuLzo9PzsqI0AkXyVdCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MUHVibGljSURDaGFyYWN0ZXIoY2hhciBjKSB7Ci0KLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJz8nICYmIGMgPD0gJ1onKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPj0gJ1wnJyAmJiBjIDw9ICc7JykgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKGMgPT0gJyAnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyEnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJz0nKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyMnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyQnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJ18nKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyUnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJ1xuJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICdccicpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAnXHQnKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGZvciBhIHB1YmxpYyBpZGVudGlmaWVyCi0gICAgICogaXMgbGVnYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHVibGljSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBwdWJsaWMgSUQgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBwdWJsaWMgSUQgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHB1YmxpYyBJRCBpcyBPSy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1B1YmxpY0lEKFN0cmluZyBwdWJsaWNJRCkgewotICAgICAgICBTdHJpbmcgcmVhc29uID0gbnVsbDsKLQotICAgICAgICBpZiAocHVibGljSUQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZXJlIGlzIG5vIHB1YmxpYyBJRAotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljSUQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgIGNoYXIgYyA9IHB1YmxpY0lELmNoYXJBdChpKTsKLSAgICAgICAgICBpZiAoIWlzWE1MUHVibGljSURDaGFyYWN0ZXIoYykpIHsKLSAgICAgICAgICAgIHJlYXNvbiA9IGMgKyAiIGlzIG5vdCBhIGxlZ2FsIGNoYXJhY3RlciBpbiBwdWJsaWMgSURzIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWFzb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGRhdGEgZm9yIGEgc3lzdGVtIGxpdGVyYWwKLSAgICAgKiBpcyBsZWdhbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeXN0ZW1MaXRlcmFsIDxjb2RlPlN0cmluZzwvY29kZT4gc3lzdGVtIGxpdGVyYWwgdG8gY2hlY2suCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiBzeXN0ZW0gbGl0ZXJhbCBpcyBpbGxlZ2FsLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgc3lzdGVtIGxpdGVyYWwgaXMgT0suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeXN0ZW1MaXRlcmFsKFN0cmluZyBzeXN0ZW1MaXRlcmFsKSB7Ci0gICAgICAgIFN0cmluZyByZWFzb24gPSBudWxsOwotCi0gICAgICAgIGlmIChzeXN0ZW1MaXRlcmFsID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGVyZSBpcyBubyBzeXN0ZW0gSUQKLQotICAgICAgICBpZiAoc3lzdGVtTGl0ZXJhbC5pbmRleE9mKCdcJycpICE9IC0xCi0gICAgICAgICAgJiYgc3lzdGVtTGl0ZXJhbC5pbmRleE9mKCciJykgIT0gLTEpIHsKLSAgICAgICAgICAgIHJlYXNvbiA9Ci0gICAgICAgICAgICAgIlN5c3RlbSBsaXRlcmFscyBjYW5ub3Qgc2ltdWx0YW5lb3VzbHkgY29udGFpbiBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHJlYXNvbiA9IGNoZWNrQ2hhcmFjdGVyRGF0YShzeXN0ZW1MaXRlcmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWFzb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHNoYXJpbmcgdGhlIGJhc2UgcHJvY2VzcyBvZiBjaGVja2luZwotICAgICAqIGFueSBYTUwgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gY2hlY2sgZm9yIFhNTCBuYW1lIGNvbXBsaWFuY2UuCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlYXNvbiB0aGUgbmFtZSBpcyBpbGxlZ2FsLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgT0suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIENhbm5vdCBiZSBlbXB0eSBvciBudWxsCi0gICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChuYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgcmV0dXJuICJYTUwgbmFtZXMgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiOwotICAgICAgICB9Ci0KLSAgICAgIAotICAgICAgICAvLyBDYW5ub3Qgc3RhcnQgd2l0aCBhIG51bWJlcgotICAgICAgICBjaGFyIGZpcnN0ID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmICghaXNYTUxOYW1lU3RhcnRDaGFyYWN0ZXIoZmlyc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlhNTCBuYW1lcyBjYW5ub3QgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyIFwiIiArIAotICAgICAgICAgICAgICAgICAgIGZpcnN0ICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICAvLyBFbnN1cmUgbGVnYWwgY29udGVudCBmb3Igbm9uLWZpcnN0IGNoYXJzCi0gICAgICAgIGZvciAoaW50IGk9MSwgbGVuID0gbmFtZS5sZW5ndGgoKTsgaTxsZW47IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzWE1MTmFtZUNoYXJhY3RlcihjKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiWE1MIG5hbWVzIGNhbm5vdCBjb250YWluIHRoZSBjaGFyYWN0ZXIgXCIiICsgYyArICJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBnb3QgaGVyZSwgc28gZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENoZWNrcyBhIHN0cmluZyB0byBzZWUgaWYgaXQgaXMgYSBsZWdhbCBSRkMgMjM5NiBVUkkuCi0gICAgICogQm90aCBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgVVJJcyBhcmUgc3VwcG9ydGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gcmVhc29uIHRoZSBVUkkgaXMgaWxsZWdhbCwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIE9LLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy8gVVJJcyBjYW4gYmUgbnVsbCBvciBlbXB0eQotICAgICAgICBpZiAoKHVyaSA9PSBudWxsKSB8fCAodXJpLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgdGVzdCA9IHVyaS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzVVJJQ2hhcmFjdGVyKHRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZ051bWJlciA9ICIweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRlc3QpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0IDw9IDB4MDkpIG1zZ051bWJlciA9ICIweDAiICsgSW50ZWdlci50b0hleFN0cmluZyh0ZXN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVSSXMgY2Fubm90IGNvbnRhaW4gIiArIG1zZ051bWJlcjsKLSAgICAgICAgICAgIH0gLy8gZW5kIGlmCi0gICAgICAgICAgICBpZiAodGVzdCA9PSAnJScpIHsgLy8gbXVzdCBiZSBmb2xsb3dlZCBieSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzCi0gICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmaXJzdERpZ2l0ID0gdXJpLmNoYXJBdChpKzEpOwotICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNlY29uZERpZ2l0ID0gdXJpLmNoYXJBdChpKzIpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZmlyc3REaWdpdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleERpZ2l0KHNlY29uZERpZ2l0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQZXJjZW50IHNpZ25zIGluIFVSSXMgbXVzdCBiZSBmb2xsb3dlZCBieSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhhY3RseSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzLiI7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGVyY2VudCBzaWducyBpbiBVUklzIG11c3QgYmUgZm9sbG93ZWQgYnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhhY3RseSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzLiI7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIGVuZCBmb3IKLQotICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgZXZlcnl0aGluZyBpcyBPSwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIDxwPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3BlY2lmaWVkCi0gICAgICogVW5pY29kZSBjaGFyYWN0ZXIgaXMgYSBoZXhhZGVjaW1hbCBkaWdpdCBhcyBkZWZpbmVkIGluIFJGQyAyMzk2OwotICAgICAqIHRoYXQgaXMsIG9uZSBvZiB0aGUgQVNDSUkgY2hhcmFjdGVycyAwLTksIGEtZiwgb3IgQS1GCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGMgIHRvIGNoZWNrIGZvciBoZXggZGlnaXQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgYWxsb3dlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hleERpZ2l0KGNoYXIgYykgewotCi0gICAgLy8gSSBzdXNwZWN0IG1vc3QgY2hhcmFjdGVycyBwYXNzZWQgdG8gdGhpcyBtZXRob2Qgd2lsbCBiZQotICAgIC8vIGNvcnJlY3QgaGV4YWRlY2ltYWwgZGlnaXRzLCBzbyBJIHRlc3QgZm9yIHRoZSB0cnVlIGNhc2VzCi0gICAgLy8gZmlyc3QuIElmIHRoaXMgcHJvdmVzIHRvIGJlIGEgcGVyZm9ybWFuY2UgYm90dGxlbmVjawotICAgIC8vIGEgc3dpdGNoIHN0YXRlbWVudCBvciBsb29rdXAgdGFibGUKLSAgICAvLyBtaWdodCBvcHRpbWl6ZSB0aGlzLgotICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlcgotICAgICAqIGEgc3BlY2lmaWVkIFVuaWNvZGUgY2hhcmFjdGVyIGlzIGxlZ2FsIGluIFVSSSByZWZlcmVuY2VzCi0gICAgICogYXMgZGV0ZXJtaW5lZCBieSBSRkMgMjM5Ni4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYyA8Y29kZT5jaGFyPC9jb2RlPiB0byBjaGVjayBmb3IgVVJJIHJlZmVyZW5jZSBjb21wbGlhbmNlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVUklDaGFyYWN0ZXIoY2hhciBjKSB7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcvJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICctJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcuJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICc/JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICc6JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICdAJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcmJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICc9JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcrJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICckJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcsJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICclJykgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKGMgPT0gJ18nKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyEnKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJ34nKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJyonKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJ1wnJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcoJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09ICcpJykgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoZXRoZXIgYSBzcGVjaWZpZWQgCi0gICAgICogY2hhcmFjdGVyIGlzIGEgY2hhcmFjdGVyIGFjY29yZGluZyB0byBwcm9kdWN0aW9uIDIgb2YgdGhlIAotICAgICAqIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIDxjb2RlPmNoYXI8L2NvZGU+IHRvIGNoZWNrIGZvciBYTUwgY29tcGxpYW5jZQotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHJ1ZSBpZiBpdCdzIGEgY2hhcmFjdGVyLCAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MQ2hhcmFjdGVyKGludCBjKSB7Ci0gICAgCi0gICAgICAgIGlmIChjID09ICdcbicpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAnXHInKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gJ1x0JykgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4RDdGRikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHhFMDAwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweEZGRkQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTBGRkZGKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3BlY2lmaWVkIAotICAgICAqIGNoYXJhY3RlciBpcyBhIG5hbWUgY2hhcmFjdGVyIGFjY29yZGluZyB0byBwcm9kdWN0aW9uIDQgb2YgdGhlIAotICAgICAqIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIDxjb2RlPmNoYXI8L2NvZGU+IHRvIGNoZWNrIGZvciBYTUwgbmFtZSBjb21wbGlhbmNlLgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHJ1ZSBpZiBpdCdzIGEgbmFtZSBjaGFyYWN0ZXIsIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MTmFtZUNoYXJhY3RlcihjaGFyIGMpIHsKLSAgICAKLSAgICAgIHJldHVybiAoaXNYTUxMZXR0ZXIoYykgfHwgaXNYTUxEaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnXycgfHwgYyA9PSAnOicgfHwgaXNYTUxDb21iaW5pbmdDaGFyKGMpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc1hNTEV4dGVuZGVyKGMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHNwZWNpZmllZCAKLSAgICAgKiBjaGFyYWN0ZXIgaXMgYSBsZWdhbCBuYW1lIHN0YXJ0IGNoYXJhY3RlciBhY2NvcmRpbmcgdG8gcHJvZHVjdGlvbiA1Ci0gICAgICogb2YgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4gVGhpcyBwcm9kdWN0aW9uIGRvZXMgYWxsb3cgbmFtZXMKLSAgICAgKiB0byBiZWdpbiB3aXRoIGNvbG9ucyB3aGljaCB0aGUgTmFtZXNwYWNlcyBpbiBYTUwgUmVjb21tZW5kYXRpb24KLSAgICAgKiBkaXNhbGxvd3MuIAotICAgICAqCi0gICAgICogQHBhcmFtIGMgPGNvZGU+Y2hhcjwvY29kZT4gdG8gY2hlY2sgZm9yIFhNTCBuYW1lIHN0YXJ0IGNvbXBsaWFuY2UuCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiB0cnVlIGlmIGl0J3MgYSBuYW1lIHN0YXJ0IGNoYXJhY3RlciwgCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxOYW1lU3RhcnRDaGFyYWN0ZXIoY2hhciBjKSB7Ci0gICAgCi0gICAgICByZXR1cm4gKGlzWE1MTGV0dGVyKGMpIHx8IGMgPT0gJ18nIHx8IGMgPT0nOicpOwotICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3BlY2lmaWVkIAotICAgICAqIGNoYXJhY3RlciBpcyBhIGxldHRlciBvciBkaWdpdCBhY2NvcmRpbmcgdG8gcHJvZHVjdGlvbnMgODQgYW5kIDg4Ci0gICAgICogb2YgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIDxjb2RlPmNoYXI8L2NvZGU+IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHJ1ZSBpZiBpdCdzIGxldHRlciBvciBkaWdpdCwgCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxMZXR0ZXJPckRpZ2l0KGNoYXIgYykgewotICAgIAotICAgICAgcmV0dXJuIChpc1hNTExldHRlcihjKSB8fCBpc1hNTERpZ2l0KGMpKTsKLSAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHNwZWNpZmllZCBjaGFyYWN0ZXIKLSAgICAgKiBpcyBhIGxldHRlciBhY2NvcmRpbmcgdG8gcHJvZHVjdGlvbiA4NCBvZiB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgPGNvZGU+Y2hhcjwvY29kZT4gdG8gY2hlY2sgZm9yIFhNTCBuYW1lIGNvbXBsaWFuY2UuCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHRydWUgaWYgaXQncyBhIGxldHRlciwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTExldHRlcihjaGFyIGMpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IG9yZGVyIGlzIHZlcnkgaW1wb3J0YW50IGhlcmUuICBUaGUgc2VhcmNoIHByb2NlZWRzIAotICAgICAgICAvLyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0IHZhbHVlcywgc28gdGhhdCBubyBzZWFyY2hpbmcgb2NjdXJzIAotICAgICAgICAvLyBhYm92ZSB0aGUgY2hhcmFjdGVyJ3MgdmFsdWUuICBCVFcsIHRoZSBmaXJzdCBsaW5lIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICAgIC8vIGlmIChjID49IDB4MDA0MSAmJiBjIDw9IDB4MDA1QSkgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKGMgPCAweDAwNDEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDA1YSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMDYxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAwN0EpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDBDMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMEQ2KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAwRDgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDBGNikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMEY4KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAwRkYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDEwMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMTMxKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAxMzQpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDEzRSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMTQxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAxNDgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDE0QSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMTdFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAxODApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDFDMykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMUNEKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAxRjApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDFGNCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMUY1KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAxRkEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDIxNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMjUwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAyQTgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDJCQikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMkMxKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwMzg2KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAzODgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDM4QSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDM4QykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwMzhFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAzQTEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDNBMykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwM0NFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAzRDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDNENikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDNEQSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDNEQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDNERSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDNFMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwM0UyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDAzRjMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDQwMSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNDBDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA0MEUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDQ0RikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNDUxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA0NUMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDQ1RSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNDgxKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA0OTApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDRDNCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNEM3KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA0QzgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDRDQikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNENDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA0RDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDRFQikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNEVFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA0RjUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDRGOCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNEY5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA1MzEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDU1NikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDU1OSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNTYxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA1ODYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDVEMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNUVBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA1RjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDVGMikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNjIxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2M0EpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDY0MSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNjRBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA2NzEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDZCNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNkJBKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2QkUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDZDMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNkNFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA2RDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDZEMykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDZENSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNkU1KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2RTYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDkwNSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOTM5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwOTNEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5NTgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDk2MSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwOTg1KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA5OEMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDk4RikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOTkwKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5OTMpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDlBOCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwOUFBKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA5QjApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDA5QjIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDlCNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOUI5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5REMpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDlERCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwOURGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA5RTEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDlGMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOUYxKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBMDUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEEwQSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQTBGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBMTApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEExMykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQTI4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBMkEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEEzMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQTMyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBMzMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEEzNSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQTM2KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBMzgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEEzOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQTU5KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBNUMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBBNUUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEE3MikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQTc0KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBODUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEE4QikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEE4RCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQThGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBOTEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEE5MykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQUE4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBQUEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEFCMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQUIyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBQjMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEFCNSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQUI5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwQUJEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwQUUwKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCMDUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEIwQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjBGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCMTApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEIxMykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjI4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCMkEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEIzMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjMyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCMzMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEIzNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjM5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwQjNEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCNUMpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEI1RCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjVGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCNjEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEI4NSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjhBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCOEUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEI5MCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjkyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCOTUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEI5OSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjlBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwQjlDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCOUUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEI5RikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQkEzKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCQTQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEJBOCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQkFBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCQUUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEJCNSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQkI3KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCQjkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEMwNSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQzBDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDMEUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEMxMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQzEyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDMjgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEMyQSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQzMzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDMzUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEMzOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQzYwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDNjEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEM4NSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQzhDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDOEUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEM5MCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQzkyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDQTgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MENBQSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQ0IzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDQjUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MENCOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MENERSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQ0UwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDRTEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEQwNSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRDBDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBEMEUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEQxMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRDEyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBEMjgpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEQyQSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRDM5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBENjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEQ2MSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRTAxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBFMkUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBFMzApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEUzMikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRTMzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBFNDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEU0NSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRTgxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBFODIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBFODQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEU4NykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRTg4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRThBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRThEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBFOTQpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEU5NykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRTk5KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBFOUYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEVBMSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRUEzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRUE1KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRUE3KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBFQUEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEVBQikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRUFEKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBFQUUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBFQjApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEVCMikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRUIzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRUJEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBFQzApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEVDNCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRjQwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBGNDcpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEY0OSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRjY5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDEwQTApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTBDNSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxMEQwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDEwRjYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDExMDApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MTEwMikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxMTAzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDExMDUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTEwNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTEwOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxMTBCKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDExMEMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MTEwRSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxMTEyKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTNDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTNFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTQwKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTRDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTRFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMTUwKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDExNTQpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTE1NSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTE1OSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxMTVGKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDExNjEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDExNjMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDExNjUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDExNjcpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDExNjkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MTE2RCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxMTZFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDExNzIpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTE3MykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTE3NSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTE5RSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTFBOCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTFBQikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxMUFFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDExQUYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MTFCNykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxMUI4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgxMUJBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDExQkMpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MTFDMikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTFFQikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTFGMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MTFGOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRTAwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFFOUIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUVBMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRUY5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDFGMDApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MUYxNSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRjE4KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFGMUQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUYyMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRjQ1KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDFGNDgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MUY0RCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRjUwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFGNTcpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDFGNTkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDFGNUIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDFGNUQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUY1RikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRjdEKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDFGODApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MUZCNCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRkI2KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFGQkMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDFGQkUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUZDMikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRkM0KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDFGQzYpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MUZDQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRkQwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFGRDMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUZENikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRkRCKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDFGRTApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MUZFQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgxRkYyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDFGRjQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MUZGNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgxRkZDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgyMTI2KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDIxMkEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MjEyQikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MjEyRSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgyMTgwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDIxODIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDMwMDcpIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWRlb2dyYXBoaWMKLSAgICAgICAgaWYgKGMgPCAweDMwMjEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MzAyOSkgcmV0dXJuIHRydWU7ICAvLyBpZGVvCi0gICAgICAgIGlmIChjIDwgMHgzMDQxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDMwOTQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MzBBMSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgzMEZBKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDMxMDUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MzEyQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHg0RTAwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDlGQTUpIHJldHVybiB0cnVlOyAgLy8gaWRlbwotICAgICAgICBpZiAoYyA8IDB4QUMwMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHhEN0EzKSByZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3BlY2lmaWVkIGNoYXJhY3RlcgotICAgICAqIGlzIGEgY29tYmluaW5nIGNoYXJhY3RlciBhY2NvcmRpbmcgdG8gcHJvZHVjdGlvbiA4NwotICAgICAqIG9mIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyA8Y29kZT5jaGFyPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRydWUgaWYgaXQncyBhIGNvbWJpbmluZyBjaGFyYWN0ZXIsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MQ29tYmluaW5nQ2hhcihjaGFyIGMpIHsKLSAgICAgICAgLy8gQ29tYmluaW5nQ2hhcgotICAgICAgICBpZiAoYyA8IDB4MDMwMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMzQ1KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDAzNjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDM2MSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNDgzKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA0ODYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDU5MSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNUExKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MDVBMykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNUI5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA1QkIpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDVCRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDVCRikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNUMxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA1QzIpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjID09IDB4MDVDNCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNjRCKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2NTIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDA2NzApIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDZENikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNkRDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MDZERCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwNkRGKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA2RTApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDZFNCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNkU3KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2RTgpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwNkVBKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2RUQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDkwMSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOTAzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwOTNDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5M0UpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDk0QykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPT0gMHgwOTREKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5NTEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDk1NCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwOTYyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA5NjMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDk4MSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOTgzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA9PSAweDA5QkMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDA5QkUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDA5QkYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDlDMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOUM0KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA5QzcpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDlDOCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDA5Q0IpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDlDRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDlENykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwOUUyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA5RTMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBBMDIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBBM0MpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjID09IDB4MEEzRSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEEzRikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQTQwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBNDIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEE0NykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQTQ4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEE0QikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQTREKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBNzApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEE3MSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQTgxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBODMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBBQkMpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwQUJFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBQzUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEFDNykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQUM5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBQ0IpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEFDRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBCMDEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEIwMykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEIzQykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjNFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCNDMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEI0NykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjQ4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEI0QikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQjREKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCNTYpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEI1NykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQjgyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCODMpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwQkJFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCQzIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEJDNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQkM4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBCQ0EpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEJDRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEJENykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBDMDEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEMwMykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQzNFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDNDQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEM0NikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQzQ4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEM0QSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQzREKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDNTUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEM1NikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQzgyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDODMpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwQ0JFKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBDQzQpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MENDNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQ0M4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDQ0EpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MENDRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBDRDUpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MENENikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRDAyKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBEMDMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEQzRSkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRDQzKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEQ0NikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRDQ4KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBENEEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEQ0RCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEQ1NykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEUzMSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBFMzQpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEUzQSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRTQ3KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBFNEUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBFQjEpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEVCNCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRUI5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEVCQikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRUJDKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBFQzgpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEVDRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRjE4KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBGMTkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDBGMzUpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjID09IDB4MEYzNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEYzOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEYzRSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEYzRikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRjcxKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBGODQpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwRjg2KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBGOEIpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEY5MCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRjk1KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPT0gMHgwRjk3KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBGOTkpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEZBRCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBGQjEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEZCNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEZCOSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgyMEQwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDIwREMpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDIwRTEpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgzMDJBKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDMwMkYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDMwOTkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA9PSAweDMwOUEpIHJldHVybiB0cnVlOyAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3BlY2lmaWVkIAotICAgICAqIGNoYXJhY3RlciBpcyBhbiBleHRlbmRlciBhY2NvcmRpbmcgdG8gcHJvZHVjdGlvbiA4OCBvZiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyA8Y29kZT5jaGFyPC9jb2RlPiB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gdHJ1ZSBpZiBpdCdzIGFuIGV4dGVuZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MRXh0ZW5kZXIoY2hhciBjKSB7Ci0KLSAgICAgICAgaWYgKGMgPCAweDAwQjYpIHJldHVybiBmYWxzZTsgIC8vIHF1aWNrIHNob3J0IGNpcmN1aXQKLQotICAgICAgICAvLyBFeHRlbmRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjID09IDB4MDBCNykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDJEMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDJEMSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDM4NykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MDY0MCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEU0NikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MEVDNikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjID09IDB4MzAwNSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDMwMzEpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MzAzNSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgzMDlEKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDMwOUUpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MzBGQykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgzMEZFKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgfQotICAgICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoZXRoZXIgYSBzcGVjaWZpZWQgCi0gICAgICogVW5pY29kZSBjaGFyYWN0ZXIKLSAgICAgKiBpcyBhIGRpZ2l0IGFjY29yZGluZyB0byBwcm9kdWN0aW9uIDg4IG9mIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyA8Y29kZT5jaGFyPC9jb2RlPiB0byBjaGVjayBmb3IgWE1MIGRpZ2l0IGNvbXBsaWFuY2UKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRydWUgaWYgaXQncyBhIGRpZ2l0LCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxEaWdpdChjaGFyIGMpIHsKLSAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MDAzMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwMDM5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDA2NjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MDY2OSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwNkYwKSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDA2RjkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MDk2NikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOTZGKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MDlFNikgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwOUVGKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBBNjYpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEE2RikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwQUU2KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBBRUYpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjIDwgMHgwQjY2KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBCNkYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEJFNykgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwQkVGKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBDNjYpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEM2RikgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGMgPCAweDBDRTYpIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MENFRikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjIDwgMHgwRDY2KSByZXR1cm4gZmFsc2U7ICBpZiAoYyA8PSAweDBENkYpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoYyA8IDB4MEU1MCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRTU5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoYyA8IDB4MEVEMCkgcmV0dXJuIGZhbHNlOyAgaWYgKGMgPD0gMHgwRUQ5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGMgPCAweDBGMjApIHJldHVybiBmYWxzZTsgIGlmIChjIDw9IDB4MEYyOSkgcmV0dXJuIHRydWU7IAotICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9ICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvQWJzdHJhY3RET01BZGFwdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL0Fic3RyYWN0RE9NQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZkZjczLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvQWJzdHJhY3RET01BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyotLSAKLQotICRJZDogQWJzdHJhY3RET01BZGFwdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNyBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEEgRE9NQWRhcHRlciB1dGlsaXR5IGFic3RyYWN0IGJhc2UgY2xhc3MuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RET01BZGFwdGVyIGltcGxlbWVudHMgRE9NQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0gCi0gICAgICAiQCgjKSAkUkNTZmlsZTogQWJzdHJhY3RET01BZGFwdGVyLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIGEgbmV3IDxjb2RlPntAbGluayBEb2N1bWVudH08L2NvZGU+IGZyb20gYW4KLSAgICAgKiBleGlzdGluZyA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gYnkgbGV0dGluZyBhIERPTQotICAgICAqIHBhcnNlciBoYW5kbGUgcGFyc2luZyB1c2luZyB0aGUgc3VwcGxpZWQgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIHZhbGlkYXRlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIGluZGljYXRlIGlmIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gaW5zdGFuY2UgcmVhZHkgZm9yIHVzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gSS9PIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIgaW4gcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRmlsZSBmaWxlbmFtZSwgYm9vbGVhbiB2YWxpZGF0ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKRE9NRXhjZXB0aW9uIHsKLQotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSksIHZhbGlkYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgPGNvZGU+e0BsaW5rIERvY3VtZW50fTwvY29kZT4gZnJvbSBhbgotICAgICAqIGV4aXN0aW5nIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBieSBsZXR0aW5nIGEgRE9NCi0gICAgICogcGFyc2VyIGhhbmRsZSBwYXJzaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ci4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGluc3RhbmNlIHJlYWR5IGZvciB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIGluLCBib29sZWFuIHZhbGlkYXRlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEpET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBjcmVhdGVkIERPTSBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGdpdmVuIERPQ1RZUEUuCi0gICAgICogSWYgdGhlIGRvY3R5cGUgcGFyYW1ldGVyIGlzIG51bGwsIHRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcwotICAgICAqIGNhbGxpbmcgPGNvZGU+Y3JlYXRlRG9jdW1lbnQoKTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdHlwZSBJbml0aWFsIDxjb2RlPkRvY1R5cGU8L2NvZGU+IG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGNyZWF0ZWQgRE9NIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoRG9jVHlwZSBkb2N0eXBlKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkb2N0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudCgpOwotICAgICAgICB9Ci0gIAotICAgICAgICBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsID0gY3JlYXRlRG9jdW1lbnQoKS5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICBEb2N1bWVudFR5cGUgZG9tRG9jVHlwZSA9IGRvbUltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N0eXBlLmdldEVsZW1lbnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3R5cGUuZ2V0UHVibGljSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZS5nZXRTeXN0ZW1JRCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGludGVybmFsIHN1YnNldCBpZiBwb3NzaWJsZQotICAgICAgICBzZXRJbnRlcm5hbFN1YnNldChkb21Eb2NUeXBlLCBkb2N0eXBlLmdldEludGVybmFsU3Vic2V0KCkpOwotCi0gICAgICAgIHJldHVybiBkb21JbXBsLmNyZWF0ZURvY3VtZW50KCJodHRwOi8vdGVtcG9yYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZS5nZXRFbGVtZW50TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Eb2NUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgRG9jdW1lbnRUeXBlIHRvIGhhdmUgdGhlIGdpdmVuIGludGVybmFsIERURCAKLSAgICAgKiBzdWJzZXQgdmFsdWUuICBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIGFiaWxpdHkgaW4gRE9NLCBzbyBpdCdzIG9ubHkKLSAgICAgKiBhdmFpbGFibGUgd2l0aCBzb21lIHBhcnNlcnMuICBTdWJjbGFzc2VzIGNhbiBhbHRlciB0aGUgbWVjaGFuaXNtIGJ5Ci0gICAgICogd2hpY2ggdGhlIGF0dGVtcHQgaXMgbWFkZSB0byBzZXQgdGhlIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGR0IERvY3VtZW50VHlwZSB0byBiZSBhbHRlcmVkCi0gICAgICogQHBhcmFtIHMgU3RyaW5nIHRvIHVzZSBhcyB0aGUgaW50ZXJuYWwgRFREIHN1YnNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsU3Vic2V0KERvY3VtZW50VHlwZSBkdCwgU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKGR0ID09IG51bGwgfHwgcyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byBhdHRlbXB0IGEgc2V0SW50ZXJuYWxTdWJzZXQoKSBjYWxsIHVzaW5nCi0gICAgICAgIC8vIHJlZmxlY3Rpb24uICBUaGlzIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgRE9NIHNwZWMsIGJ1dCBpdCdzCi0gICAgICAgIC8vIGF2YWlsYWJsZSBvbiBYZXJjZXMgMS40LjQrLiAgSXQncyBub3QgY3VycmVudGx5IGluIENyaW1zb24uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBkdGNsYXNzID0gZHQuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGhvZCBzZXRJbnRlcm5hbFN1YnNldCA9IGR0Y2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICJzZXRJbnRlcm5hbFN1YnNldCIsIG5ldyBDbGFzc1tdIHtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzfSk7Ci0gICAgICAgICAgICBzZXRJbnRlcm5hbFN1YnNldC5pbnZva2UoZHQsIG5ldyBPYmplY3RbXSB7c30pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL0NyaW1zb25ET01BZGFwdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL0NyaW1zb25ET01BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYWI2YWIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9Dcmltc29uRE9NQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qLS0gCi0KLSAkSWQ6IENyaW1zb25ET01BZGFwdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNyBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIHRoZSBBcGFjaGUgQ3JpbXNvbiBET00gcGFyc2VyLgotICogCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIENyaW1zb25ET01BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RET01BZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBDcmltc29uRE9NQWRhcHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyA8Y29kZT57QGxpbmsgRG9jdW1lbnR9PC9jb2RlPiBmcm9tIGFuCi0gICAgICogZXhpc3RpbmcgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGJ5IGxldHRpbmcgYSBET00KLSAgICAgKiBwYXJzZXIgaGFuZGxlIHBhcnNpbmcgdXNpbmcgdGhlIHN1cHBsaWVkIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIHZhbGlkYXRlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIGluZGljYXRlIGlmIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gaW5zdGFuY2UgcmVhZHkgZm9yIHVzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gSS9PIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIgaW4gcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gdmFsaWRhdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbiAgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0gbmV3IENsYXNzWzJdOwotICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXNbMF0gPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLklucHV0U3RyZWFtIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlc1sxXSA9IGJvb2xlYW4uY2xhc3M7Ci0KLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICAgICAgYXJnc1swXSA9IGluOwotICAgICAgICAgICAgYXJnc1sxXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGFyc2VyIGNsYXNzIGFuZCBpbnZva2UgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgICAgICAgQ2xhc3MgcGFyc2VyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNyaW1zb24udHJlZS5YbWxEb2N1bWVudCIpOwotICAgICAgICAgICAgTWV0aG9kIGNyZWF0ZVhtbERvY3VtZW50ID0KLSAgICAgICAgICAgICAgICBwYXJzZXJDbGFzcy5nZXRNZXRob2QoImNyZWF0ZVhtbERvY3VtZW50IiwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0KLSAgICAgICAgICAgICAgICAoRG9jdW1lbnQpY3JlYXRlWG1sRG9jdW1lbnQuaW52b2tlKG51bGwsIGFyZ3MpOwotCi0gICAgICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbiA9IChTQVhQYXJzZUV4Y2VwdGlvbil0YXJnZXRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkVycm9yIG9uIGxpbmUgIiArIHBhcnNlRXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgWE1MIGRvY3VtZW50OiAiICsgcGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBwYXJzZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSAoSU9FeGNlcHRpb24pIHRhcmdldEV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB0aHJvdyBpb0V4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24odGFyZ2V0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgdGFyZ2V0RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBjcmVhdGVkIERPTSBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgKERvY3VtZW50KUNsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNyaW1zb24udHJlZS5YbWxEb2N1bWVudCIpCi0gICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbihlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkgKyAiIHdoZW4gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvRE9NQWRhcHRlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9ET01BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNGE1NjIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9ET01BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyotLSAKLQotICRJZDogRE9NQWRhcHRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTcgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cyAKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlIAotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MgCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5IAotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotIAotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIERlZmluZXMgYSBzdGFuZGFyZCBzZXQgb2YgYWRhcHRlciBtZXRob2RzIGZvciBpbnRlcmZhY2luZyB3aXRoIGEgRE9NIHBhcnNlcgotICogYW5kIG9idGFpbmluZyBhIERPTSB7QGxpbmsgb3JnLnczYy5kb20uRG9jdW1lbnQgb3JnLnczYy5kb20uRG9jdW1lbnR9IG9iamVjdC4KLSAqIEltcGxlbWVudGluZyBjbGFzc2VzIG1hcCB0aGVzZSBjYWxscyB0byBET00gcGFyc2VyLXNwZWNpZmljIGNhbGxzLCBhbGxvd2luZwotICogYW55IHRoaXJkLXBhcnR5IHBhcnNlciB0byBiZSB1c2VkIHdpdGggSkRPTS4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBET01BZGFwdGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gZnJvbSBhCi0gICAgICogZ2l2ZW4gZmlsZW5hbWUgYnkgbGV0dGluZyBhIERPTSBwYXJzZXIgaGFuZGxlIHBhcnNpbmcgZnJvbSB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIAotICAgICAqIHNob3VsZCBvY2N1ci4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGluc3RhbmNlIHJlYWR5IGZvciB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KEZpbGUgZmlsZW5hbWUsIGJvb2xlYW4gdmFsaWRhdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gZnJvbSBhbgotICAgICAqIGV4aXN0aW5nIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBieSBsZXR0aW5nIGEgRE9NCi0gICAgICogcGFyc2VyIGhhbmRsZSBwYXJzaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIAotICAgICAqIHNob3VsZCBvY2N1ci4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGluc3RhbmNlIHJlYWR5IGZvciB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIGluLCBib29sZWFuIHZhbGlkYXRlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEpET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBjcmVhdGVkIERPTSBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGdpdmVuIERPQ1RZUEUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdHlwZSBJbml0aWFsIDxjb2RlPkRvY1R5cGU8L2NvZGU+IG9mIHRoZSBkb2N1bWVudC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGNyZWF0ZWQgRE9NIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoRG9jVHlwZSBkb2N0eXBlKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvSkFYUERPTUFkYXB0ZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvSkFYUERPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2YjM4NC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL0pBWFBET01BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyotLSAKLQotICRJZDogSkFYUERPTUFkYXB0ZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE3IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0Lio7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmb3IgYW55IHBhcnNlciBzdXBwb3J0aW5nIHRoZSBTdW4gSkFYUCBBUElzLgotICogCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIEpBWFBET01BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RET01BZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBKQVhQRE9NQWRhcHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyA8Y29kZT57QGxpbmsgRG9jdW1lbnR9PC9jb2RlPiBmcm9tIGFuCi0gICAgICogZXhpc3RpbmcgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGJ5IGxldHRpbmcgYSBKQVhQCi0gICAgICogcGFyc2VyIGhhbmRsZSBwYXJzaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIAotICAgICAqICAgICAgICBzaG91bGQgb2NjdXIuCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBpbnN0YW5jZSByZWFkeSBmb3IgdXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBJL08gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ciBpbiBwYXJzaW5nLgotICAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gdmFsaWRhdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRyeSB1c2luZyBKQVhQLi4uCi0gICAgICAgICAgICAvLyBOb3RlIHdlIG5lZWQgRE9NIExldmVsIDIgYW5kIHRodXMgSkFYUCAxLjEuCi0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIik7Ci0KLSAgICAgICAgICAgIC8vIFRyeSBKQVhQIDEuMSBjYWxscyB0byBidWlsZCB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIENsYXNzIGZhY3RvcnlDbGFzcyA9Ci0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSIpOwotCi0gICAgICAgICAgICAvLyBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgTWV0aG9kIG5ld1BhcnNlckluc3RhbmNlID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MuZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG51bGwpOwotICAgICAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBuZXdQYXJzZXJJbnN0YW5jZS5pbnZva2UobnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0ZSk7Ci0gICAgICAgICAgICBNZXRob2Qgc2V0VmFsaWRhdGluZyA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzLmdldE1ldGhvZCgic2V0VmFsaWRhdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde2Jvb2xlYW4uY2xhc3N9KTsKLSAgICAgICAgICAgIHNldFZhbGlkYXRpbmcuaW52b2tlKGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bmV3IEJvb2xlYW4odmFsaWRhdGUpfSk7Ci0KLSAgICAgICAgICAgIC8vIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBNZXRob2Qgc2V0TmFtZXNwYWNlQXdhcmUgPQotICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcy5nZXRNZXRob2QoInNldE5hbWVzcGFjZUF3YXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde2Jvb2xlYW4uY2xhc3N9KTsKLSAgICAgICAgICAgIHNldE5hbWVzcGFjZUF3YXJlLmludm9rZShmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde0Jvb2xlYW4uVFJVRX0pOwotICAgIAotICAgICAgICAgICAgLy8gamF4cFBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBNZXRob2QgbmV3RG9jQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzLmdldE1ldGhvZCgibmV3RG9jdW1lbnRCdWlsZGVyIiwgbnVsbCk7Ci0gICAgICAgICAgICBPYmplY3QgamF4cFBhcnNlciAgPSBuZXdEb2NCdWlsZGVyLmludm9rZShmYWN0b3J5LCBudWxsKTsKLQotICAgICAgICAgICAgLy8gamF4cFBhcnNlci5zZXRFcnJvckhhbmRsZXIobnVsbCk7Ci0gICAgICAgICAgICBDbGFzcyBwYXJzZXJDbGFzcyA9IGpheHBQYXJzZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGhvZCBzZXRFcnJvckhhbmRsZXIgPQotICAgICAgICAgICAgICAgIHBhcnNlckNsYXNzLmdldE1ldGhvZCgic2V0RXJyb3JIYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde29yZy54bWwuc2F4LkVycm9ySGFuZGxlci5jbGFzc30pOwotICAgICAgICAgICAgc2V0RXJyb3JIYW5kbGVyLmludm9rZShqYXhwUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde25ldyBCdWlsZGVyRXJyb3JIYW5kbGVyKCl9KTsKLQotICAgICAgICAgICAgLy8gZG9tRG9jID0gamF4cFBhcnNlci5wYXJzZShpbik7Ci0gICAgICAgICAgICBNZXRob2QgcGFyc2UgPSBwYXJzZXJDbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgInBhcnNlIiwgbmV3IENsYXNzW117SW5wdXRTdHJlYW0uY2xhc3N9KTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvbURvYyA9IChvcmcudzNjLmRvbS5Eb2N1bWVudCkKLSAgICAgICAgICAgICAgICBwYXJzZS5pbnZva2UoamF4cFBhcnNlciwgbmV3IE9iamVjdFtde2lufSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkb21Eb2M7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIHRhcmdldEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24odGFyZ2V0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgdGFyZ2V0RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJSZWZsZWN0aW9uIGZhaWxlZCB3aGlsZSBwYXJzaW5nIGEgZG9jdW1lbnQgd2l0aCBKQVhQIiwgZSk7IAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsb3cgYWxsIGV4Y2VwdGlvbnMgdG8gcGFzcyB0aHJvdWdoCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QgYmFzZWQKLSAgICAgKiBvbiBhIHNwZWNpZmljIHBhcnNlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gY3JlYXRlZCBET00gRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIAotICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgRE9NIExldmVsIDIgYW5kIHRodXMgSkFYUCAxLjEuCi0gICAgICAgICAgICAvLyBJZiBKQVhQIDEuMCBpcyBhbGwgdGhhdCdzIGF2YWlsYWJsZSB0aGVuIHdlIGVycm9yIG91dC4KLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIiKTsKLQotICAgICAgICAgICAgLy8gVHJ5IEpBWFAgMS4xIGNhbGxzIHRvIGJ1aWxkIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0KLSAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIC8vIGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBNZXRob2QgbmV3UGFyc2VySW5zdGFuY2UgPQotICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcy5nZXRNZXRob2QoIm5ld0luc3RhbmNlIiwgbnVsbCk7Ci0gICAgICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG5ld1BhcnNlckluc3RhbmNlLmludm9rZShudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gamF4cFBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBNZXRob2QgbmV3RG9jQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzLmdldE1ldGhvZCgibmV3RG9jdW1lbnRCdWlsZGVyIiwgbnVsbCk7Ci0gICAgICAgICAgICBPYmplY3QgamF4cFBhcnNlciAgPSBuZXdEb2NCdWlsZGVyLmludm9rZShmYWN0b3J5LCBudWxsKTsKLQotICAgICAgICAgICAgLy8gZG9tRG9jID0gamF4cFBhcnNlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgQ2xhc3MgcGFyc2VyQ2xhc3MgPSBqYXhwUGFyc2VyLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBNZXRob2QgbmV3RG9jID0gcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKCJuZXdEb2N1bWVudCIsIG51bGwpOwotICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9tRG9jID0KLSAgICAgICAgICAgICAgICAob3JnLnczYy5kb20uRG9jdW1lbnQpIG5ld0RvYy5pbnZva2UoamF4cFBhcnNlciwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkb21Eb2M7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiUmVmbGVjdGlvbiBmYWlsZWQgd2hpbGUgY3JlYXRpbmcgbmV3IEpBWFAgZG9jdW1lbnQiLCBlKTsgCi0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjFET01BZGFwdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL09yYWNsZVYxRE9NQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA3MzZiLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjFET01BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyotLSAKLQotICRJZDogT3JhY2xlVjFET01BZGFwdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNiBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIHRoZSBPcmFjbGUgVmVyc2lvbiAxIERPTSBwYXJzZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE2ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlVjFET01BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RET01BZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBPcmFjbGVWMURPTUFkYXB0ZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNiAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgPGNvZGU+e0BsaW5rIERvY3VtZW50fTwvY29kZT4gZnJvbSBhbgotICAgICAqIGV4aXN0aW5nIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBieSBsZXR0aW5nIGEgRE9NCi0gICAgICogcGFyc2VyIGhhbmRsZSBwYXJzaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ci4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGluc3RhbmNlIHJlYWR5IGZvciB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIGluLCBib29sZWFuIHZhbGlkYXRlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEpET01FeGNlcHRpb24gIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGFyc2VyIGNsYXNzCi0gICAgICAgICAgICBDbGFzcyBwYXJzZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yYWNsZS54bWwucGFyc2VyLlhNTFBhcnNlciIpOwotICAgICAgICAgICAgT2JqZWN0IHBhcnNlciA9IHBhcnNlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgTWV0aG9kIHBhcnNlID0KLSAgICAgICAgICAgICAgICBwYXJzZXJDbGFzcy5nZXRNZXRob2QoInBhcnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge29yZy54bWwuc2F4LklucHV0U291cmNlLmNsYXNzfSk7Ci0gICAgICAgICAgICBwYXJzZS5pbnZva2UocGFyc2VyLCBuZXcgT2JqZWN0W10ge25ldyBJbnB1dFNvdXJjZShpbil9KTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBEb2N1bWVudCBvYmplY3QKLSAgICAgICAgICAgIE1ldGhvZCBnZXREb2N1bWVudCA9IHBhcnNlckNsYXNzLmdldE1ldGhvZCgiZ2V0RG9jdW1lbnQiLCBudWxsKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IChEb2N1bWVudClnZXREb2N1bWVudC5pbnZva2UocGFyc2VyLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRvYzsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uID0gKFNBWFBhcnNlRXhjZXB0aW9uKSB0YXJnZXRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkVycm9yIG9uIGxpbmUgIiArIHBhcnNlRXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgWE1MIGRvY3VtZW50OiAiICsgcGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBwYXJzZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSAoSU9FeGNlcHRpb24pIHRhcmdldEV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB0aHJvdyBpb0V4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24odGFyZ2V0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgdGFyZ2V0RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBjcmVhdGVkIERPTSBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgKERvY3VtZW50KUNsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJvcmFjbGUueG1sLnBhcnNlci5YTUxEb2N1bWVudCIpCi0gICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbihlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkgKyAiIHdoZW4gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjJET01BZGFwdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL09yYWNsZVYyRE9NQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmU1NzdjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vYWRhcHRlcnMvT3JhY2xlVjJET01BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyotLSAKLQotICRJZDogT3JhY2xlVjJET01BZGFwdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNyBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIHRoZSBPcmFjbGUgVmVyc2lvbiAyIERPTSBwYXJzZXIuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlVjJET01BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RET01BZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBPcmFjbGVWMkRPTUFkYXB0ZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxNyAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgPGNvZGU+e0BsaW5rIERvY3VtZW50fTwvY29kZT4gZnJvbSBhbgotICAgICAqIGV4aXN0aW5nIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBieSBsZXR0aW5nIGEgRE9NCi0gICAgICogcGFyc2VyIGhhbmRsZSBwYXJzaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBpbmRpY2F0ZSBpZiB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ci4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGluc3RhbmNlIHJlYWR5IGZvciB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIGluLCBib29sZWFuIHZhbGlkYXRlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEpET01FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBMb2FkIHRoZSBwYXJzZXIgY2xhc3MKLSAgICAgICAgICAgIENsYXNzIHBhcnNlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JhY2xlLnhtbC5wYXJzZXIudjIuRE9NUGFyc2VyIik7Ci0gICAgICAgICAgICBPYmplY3QgcGFyc2VyID0gcGFyc2VyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBNZXRob2QgcGFyc2UgPQotICAgICAgICAgICAgICAgIHBhcnNlckNsYXNzLmdldE1ldGhvZCgicGFyc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7b3JnLnhtbC5zYXguSW5wdXRTb3VyY2UuY2xhc3N9KTsKLSAgICAgICAgICAgIHBhcnNlLmludm9rZShwYXJzZXIsIG5ldyBPYmplY3RbXSB7bmV3IElucHV0U291cmNlKGluKX0pOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIERvY3VtZW50IG9iamVjdAotICAgICAgICAgICAgTWV0aG9kIGdldERvY3VtZW50ID0gcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKCJnZXREb2N1bWVudCIsIG51bGwpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KWdldERvY3VtZW50Lmludm9rZShwYXJzZXIsIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gZG9jOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU0FYUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24gPSAoU0FYUGFyc2VFeGNlcHRpb24pdGFyZ2V0RXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJFcnJvciBvbiBsaW5lICIgKyBwYXJzZUV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIFhNTCBkb2N1bWVudDogIiArIHBhcnNlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgcGFyc2VFeGNlcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gKElPRXhjZXB0aW9uKSB0YXJnZXRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgdGhyb3cgaW9FeGNlcHRpb247Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKHRhcmdldEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHRhcmdldEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbihlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QgYmFzZWQKLSAgICAgKiBvbiBhIHNwZWNpZmljIHBhcnNlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gY3JlYXRlZCBET00gRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIChEb2N1bWVudClDbGFzcy5mb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICAib3JhY2xlLnhtbC5wYXJzZXIudjIuWE1MRG9jdW1lbnQiKQotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpICsgIiB3aGVuIGNyZWF0aW5nIGRvY3VtZW50IiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL1hNTDRKRE9NQWRhcHRlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9YTUw0SkRPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjOGZkYS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL1hNTDRKRE9NQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qLS0gCi0KLSAkSWQ6IFhNTDRKRE9NQWRhcHRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTcgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cyAKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlIAotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MgCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5IAotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotIAotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5qZG9tLio7Ci1pbXBvcnQgb3JnLmpkb20uaW5wdXQuKjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIHRoZSBJQk0gWE1MNEogRE9NIHBhcnNlci4KLSAqIAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTcgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUw0SkRPTUFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdERPTUFkYXB0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IFhNTDRKRE9NQWRhcHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE3ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyA8Y29kZT57QGxpbmsgRG9jdW1lbnR9PC9jb2RlPiBmcm9tIGFuCi0gICAgICogZXhpc3RpbmcgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGJ5IGxldHRpbmcgYSBET00KLSAgICAgKiBwYXJzZXIgaGFuZGxlIHBhcnNpbmcgdXNpbmcgdGhlIHN1cHBsaWVkIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIHZhbGlkYXRlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRvIGluZGljYXRlIGlmIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgotICAgICAqIEByZXR1cm4gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IC0gaW5zdGFuY2UgcmVhZHkgZm9yIHVzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gSS9PIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIgaW4gcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gdmFsaWRhdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbiAgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSUJNIFhNTDRKIGFjdHVhbGx5IHVzZXMgdGhlIFhlcmNlcyBwYXJzZXIsIHNvIHRoaXMgaXMKLSAgICAgICAgICAgICAqICAgYWxsIFhlcmNlcyBzcGVjaWZpYyBjb2RlLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8vIExvYWQgdGhlIHBhcnNlciBjbGFzcwotICAgICAgICAgICAgQ2xhc3MgcGFyc2VyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlciIpOwotICAgICAgICAgICAgT2JqZWN0IHBhcnNlciA9IHBhcnNlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB2YWxpZGF0aW9uCi0gICAgICAgICAgICBNZXRob2Qgc2V0RmVhdHVyZSA9Ci0gICAgICAgICAgICAgICAgcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKCJzZXRGZWF0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge2phdmEubGFuZy5TdHJpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuLmNsYXNzfSk7Ci0gICAgICAgICAgICBzZXRGZWF0dXJlLmludm9rZShwYXJzZXIsIG5ldyBPYmplY3RbXSB7Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih2YWxpZGF0ZSl9KTsKLQotICAgICAgICAgICAgLy8gU2V0IG5hbWVzcGFjZXMKLSAgICAgICAgICAgIHNldEZlYXR1cmUuaW52b2tlKHBhcnNlciwgbmV3IE9iamVjdFtdIHsiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKGZhbHNlKX0pOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGVycm9yIGhhbmRsZXIKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZSkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBzZXRFcnJvckhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICBwYXJzZXJDbGFzcy5nZXRNZXRob2QoInNldEVycm9ySGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7RXJyb3JIYW5kbGVyLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JIYW5kbGVyLmludm9rZShwYXJzZXIsIG5ldyBPYmplY3RbXSB7bmV3IEJ1aWxkZXJFcnJvckhhbmRsZXIoKX0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIE1ldGhvZCBwYXJzZSA9Ci0gICAgICAgICAgICAgICAgcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKCJwYXJzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtvcmcueG1sLnNheC5JbnB1dFNvdXJjZS5jbGFzc30pOwotICAgICAgICAgICAgcGFyc2UuaW52b2tlKHBhcnNlciwgbmV3IE9iamVjdFtde25ldyBJbnB1dFNvdXJjZShpbil9KTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBEb2N1bWVudCBvYmplY3QKLSAgICAgICAgICAgIE1ldGhvZCBnZXREb2N1bWVudCA9IHBhcnNlckNsYXNzLmdldE1ldGhvZCgiZ2V0RG9jdW1lbnQiLCBudWxsKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IChEb2N1bWVudClnZXREb2N1bWVudC5pbnZva2UocGFyc2VyLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRvYzsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uID0gKFNBWFBhcnNlRXhjZXB0aW9uKXRhcmdldEV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXJyb3Igb24gbGluZSAiICsgcGFyc2VFeGNlcHRpb24uZ2V0TGluZU51bWJlcigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZiBYTUwgZG9jdW1lbnQ6ICIgKyBwYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHBhcnNlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbiA9IChJT0V4Y2VwdGlvbikgdGFyZ2V0RXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIHRocm93IGlvRXhjZXB0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbih0YXJnZXRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB0YXJnZXRFeGNlcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IGJhc2VkCi0gICAgICogb24gYSBzcGVjaWZpYyBwYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIGNyZWF0ZWQgRE9NIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAoRG9jdW1lbnQpQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwiKQotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpICsgIiB3aGlsZSBjcmVhdGluZyBkb2N1bWVudCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9YZXJjZXNET01BZGFwdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL1hlcmNlc0RPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmYjZjZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL1hlcmNlc0RPTUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKi0tIAotCi0gJElkOiBYZXJjZXNET01BZGFwdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxNiBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcuamRvbS5pbnB1dC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmb3IgdGhlIEFwYWNoZSBYZXJjZXMgRE9NIHBhcnNlci4KLSAqIAotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTYgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBYZXJjZXNET01BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RET01BZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBYZXJjZXNET01BZGFwdGVyLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTYgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIGEgbmV3IDxjb2RlPntAbGluayBEb2N1bWVudH08L2NvZGU+IGZyb20gYW4KLSAgICAgKiBleGlzdGluZyA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gYnkgbGV0dGluZyBhIERPTQotICAgICAqIHBhcnNlciBoYW5kbGUgcGFyc2luZyB1c2luZyB0aGUgc3VwcGxpZWQgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdG8gaW5kaWNhdGUgaWYgdmFsaWRhdGlvbiAKLSAgICAgKiBzaG91bGQgb2NjdXIuCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBpbnN0YW5jZSByZWFkeSBmb3IgdXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBJL08gZXJyb3Igb2NjdXJzLgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ciBpbiBwYXJzaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiB2YWxpZGF0ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKRE9NRXhjZXB0aW9uICB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIExvYWQgdGhlIHBhcnNlciBjbGFzcwotICAgICAgICAgICAgQ2xhc3MgcGFyc2VyQ2xhc3MgPQotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyIik7Ci0gICAgICAgICAgICBPYmplY3QgcGFyc2VyID0gcGFyc2VyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgLy8gU2V0IHZhbGlkYXRpb24KLSAgICAgICAgICAgIE1ldGhvZCBzZXRGZWF0dXJlID0gcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICJzZXRGZWF0dXJlIiwKLSAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7amF2YS5sYW5nLlN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30pOwotICAgICAgICAgICAgc2V0RmVhdHVyZS5pbnZva2UocGFyc2VyLCAKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsCi0gICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odmFsaWRhdGUpfSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCBuYW1lc3BhY2VzIHRydWUKLSAgICAgICAgICAgIHNldEZlYXR1cmUuaW52b2tlKHBhcnNlciwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsCi0gICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odHJ1ZSl9KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBlcnJvciBoYW5kbGVyCi0gICAgICAgICAgICBpZiAodmFsaWRhdGUpIHsKLSAgICAgICAgICAgICAgICBNZXRob2Qgc2V0RXJyb3JIYW5kbGVyID0gcGFyc2VyQ2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAic2V0RXJyb3JIYW5kbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge0Vycm9ySGFuZGxlci5jbGFzc30pOwotICAgICAgICAgICAgICAgIHNldEVycm9ySGFuZGxlci5pbnZva2UocGFyc2VyLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBCdWlsZGVyRXJyb3JIYW5kbGVyKCl9KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBNZXRob2QgcGFyc2UgPSBwYXJzZXJDbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgInBhcnNlIiwKLSAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7b3JnLnhtbC5zYXguSW5wdXRTb3VyY2UuY2xhc3N9KTsKLSAgICAgICAgICAgIHBhcnNlLmludm9rZShwYXJzZXIsIG5ldyBPYmplY3RbXXtuZXcgSW5wdXRTb3VyY2UoaW4pfSk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICAgICAgICBNZXRob2QgZ2V0RG9jdW1lbnQgPSBwYXJzZXJDbGFzcy5nZXRNZXRob2QoImdldERvY3VtZW50IiwgbnVsbCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpZ2V0RG9jdW1lbnQuaW52b2tlKHBhcnNlciwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkb2M7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2Ygb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChTQVhQYXJzZUV4Y2VwdGlvbil0YXJnZXRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkVycm9yIG9uIGxpbmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgWE1MIGRvY3VtZW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbiA9IChJT0V4Y2VwdGlvbikgdGFyZ2V0RXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIHRocm93IGlvRXhjZXB0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbih0YXJnZXRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBiYXNlZAotICAgICAqIG9uIGEgc3BlY2lmaWMgcGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBjcmVhdGVkIERPTSBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gd2hlbiBlcnJvcnMgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChEb2N1bWVudClDbGFzcy5mb3JOYW1lKAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsIikubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSArICIgd2hlbiBjcmVhdGluZyBkb2N1bWVudCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9hZGFwdGVycy9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MTljZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2FkYXB0ZXJzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPGJvZHk+Ci0KLUNsYXNzZXMgdG8gaW50ZXJmYWNlIHdpdGggdmFyaW91cyBET00gaW1wbGVtZW50YXRpb25zLiAgTm90IGdlbmVyYWxseQotbmVlZGVkIGV4Y2VwdCBpbiB0cnVseSBhZHZhbmNlZCBzaXR1YXRpb25zLiAgSkFYUERPTUFkYXB0ZXIgaXMgbW9zdCBjb21tb25seQotdXNlZC4KLQotPC9ib2R5PgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9maWx0ZXIvQWJzdHJhY3RGaWx0ZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0Fic3RyYWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDRjMzcuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9maWx0ZXIvQWJzdHJhY3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qLS0KLQotICRJZDogQWJzdHJhY3RGaWx0ZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjE5IG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uZmlsdGVyOwotCi0vKioKLSAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEZpbHRlcn0uCi0gKgotICogQGF1dGhvciBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBBYnN0cmFjdEZpbHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQiOwotCi0gICAgcHVibGljIEZpbHRlciBuZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVnYXRlRmlsdGVyKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWx0ZXIgb3IoRmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXR1cm4gbmV3IE9yRmlsdGVyKHRoaXMsIGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbHRlciBhbmQoRmlsdGVyIGZpbHRlcikgewotICAgICAgICByZXR1cm4gbmV3IEFuZEZpbHRlcih0aGlzLCBmaWx0ZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9maWx0ZXIvQW5kRmlsdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9BbmRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMjJlMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9BbmRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IEFuZEZpbHRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTkgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5maWx0ZXI7Ci0KLS8qKgotICogQWxsb3cgdHdvIGZpbHRlcnMgdG8gYmUgY2hhaW5lZCB0b2dldGhlciB3aXRoIGEgbG9naWNhbAotICogPGI+YW5kPC9iPiBvcGVyYXRpb24uCi0gKgotICogQGF1dGhvciBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqLwotZmluYWwgY2xhc3MgQW5kRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IEFuZEZpbHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQiOwotCi0gICAgLy8gRmlsdGVyIGZvciBsZWZ0IHNpZGUgb2YgbG9naWNhbCA8Yj5hbmQ8L2I+LgotICAgIHByaXZhdGUgRmlsdGVyIGxlZnQ7Ci0KLSAgICAvLyBGaWx0ZXIgZm9yIHJpZ2h0IHNpZGUgb2YgbG9naWNhbCA8Yj5hbmQ8L2I+LgotICAgIHByaXZhdGUgRmlsdGVyIHJpZ2h0OwotCi0gICAgLyoqCi0gICAgICogTWF0Y2ggaWYgb25seSBib3RoIHN1cHBsaWVkIGZpbHRlcnMgbWF0Y2guCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGVmdCBsZWZ0IHNpZGUgb2YgbG9naWNhbCA8Yj5hbmQ8L2I+Ci0gICAgICogQHBhcmFtIHJpZ2h0IHJpZ2h0IHNpZGUgb2YgbG9naWNhbCA8Yj5hbmQ8L2I+Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIHN1cHBsaWVkIGZpbHRlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIEFuZEZpbHRlcihGaWx0ZXIgbGVmdCwgRmlsdGVyIHJpZ2h0KSB7Ci0gICAgICAgIGlmICgobGVmdCA9PSBudWxsKSB8fCAocmlnaHQgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgZmlsdGVyIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsKLSAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbGVmdC5tYXRjaGVzKG9iaikgJiYgcmlnaHQubWF0Y2hlcyhvYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQW5kRmlsdGVyKSB7Ci0gICAgICAgICAgICBBbmRGaWx0ZXIgZmlsdGVyID0gKEFuZEZpbHRlcikgb2JqOwotICAgICAgICAgICAgaWYgKChsZWZ0LmVxdWFscyhmaWx0ZXIubGVmdCkgICYmIHJpZ2h0LmVxdWFscyhmaWx0ZXIucmlnaHQpKSB8fAotICAgICAgICAgICAgICAgIChsZWZ0LmVxdWFscyhmaWx0ZXIucmlnaHQpICYmIHJpZ2h0LmVxdWFscyhmaWx0ZXIubGVmdCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gKDMxICogbGVmdC5oYXNoQ29kZSgpKSArIHJpZ2h0Lmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoNjQpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiW0FuZEZpbHRlcjogIikKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGxlZnQudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsXG4iKQotICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICAgICAgICAgICIpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZChyaWdodC50b1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0iKQotICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0NvbnRlbnRGaWx0ZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0NvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjNDE0My4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9Db250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyotLQotCi0gJElkOiBDb250ZW50RmlsdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLmZpbHRlcjsKLQotaW1wb3J0IG9yZy5qZG9tLio7Ci0KLS8qKgotICogQSBnZW5lcmFsIHB1cnBvc2UgRmlsdGVyIGFibGUgdG8gcmVwcmVzZW50IGFsbCBsZWdhbCBKRE9NIG9iamVjdHMgb3IgYQotICogc3BlY2lmaWMgc3Vic2V0LiBGaWx0ZXJpbmcgaXMgYWNjb21wbGlzaGVkIGJ5IHdheSBvZiBhIGZpbHRlcmluZyBtYXNrIGluCi0gKiB3aGljaCBlYWNoIGJpdCByZXByZXNlbnRzIHdoZXRoZXIgYSBKRE9NIG9iamVjdCBpcyB2aXNpYmxlIG9yIG5vdC4KLSAqIEZvciBleGFtcGxlIHRvIHZpZXcgYWxsIFRleHQgYW5kIENEQVRBIG5vZGVzIGluIHRoZSBjb250ZW50IG9mIGVsZW1lbnQgeC4KLSAqIDxwcmU+PGNvZGU+Ci0gKiAgICAgIEZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcihDb250ZW50RmlsdGVyLlRFWFQgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudEZpbHRlci5DREFUQSk7Ci0gKiAgICAgIExpc3QgY29udGVudCA9IHguZ2V0Q29udGVudChmaWx0ZXIpOwotICogPC9jb2RlPjwvcHJlPgotICogPHA+Ci0gKiBGb3IgdGhvc2Ugd2hvIGRvbid0IGxpa2UgYml0LW1hc2tpbmcsIHNldCBtZXRob2RzIGFyZSBwcm92aWRlZCBhcyBhbgotICogYWx0ZXJuYXRpdmUuICBGb3IgZXhhbXBsZSB0byBhbGxvdyBldmVyeXRoaW5nIGV4Y2VwdCBDb21tZW50IG5vZGVzLgotICogPHByZT48Y29kZT4KLSAqICAgICAgRmlsdGVyIGZpbHRlciA9ICBuZXcgQ29udGVudEZpbHRlcigpOwotICogICAgICBmaWx0ZXIuc2V0Q29tbWVudFZpc2libGUoZmFsc2UpOwotICogICAgICBMaXN0IGNvbnRlbnQgPSB4LmdldENvbnRlbnQoZmlsdGVyKTsKLSAqIDwvY29kZT48L3ByZT4KLSAqIDxwPgotICogVGhlIGRlZmF1bHQgaXMgdG8gYWxsb3cgYWxsIHZhbGlkIEpET00gb2JqZWN0cy4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkCi0gKiBAYXV0aG9yIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEZpbHRlciBleHRlbmRzIEFic3RyYWN0RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IENvbnRlbnRGaWx0ZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoxOSAkICROYW1lOiAgJCI7Ci0KLSAgICAvKiogTWFzayBmb3IgSkRPTSB7QGxpbmsgRWxlbWVudH0gb2JqZWN0cyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgICA9IDE7Ci0KLSAgICAvKiogTWFzayBmb3IgSkRPTSB7QGxpbmsgQ0RBVEF9IG9iamVjdHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSAgICAgPSAyOwotCi0gICAgLyoqIE1hc2sgZm9yIEpET00ge0BsaW5rIFRleHR9IG9iamVjdHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUICAgICAgPSA0OwotCi0gICAgLyoqIE1hc2sgZm9yIEpET00ge0BsaW5rIENvbW1lbnR9IG9iamVjdHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UICAgPSA4OwotCi0gICAgLyoqIE1hc2sgZm9yIEpET00ge0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn0gb2JqZWN0cyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJICAgICAgICA9IDE2OwotCi0gICAgLyoqIE1hc2sgZm9yIEpET00ge0BsaW5rIEVudGl0eVJlZn0gb2JqZWN0cyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWVJFRiA9IDMyOwotCi0gICAgLyoqIE1hc2sgZm9yIEpET00ge0BsaW5rIERvY3VtZW50fSBvYmplY3QgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NVTUVOVCAgPSA2NDsKLQotICAgIC8qKiBNYXNrIGZvciBKRE9NIHtAbGluayBEb2NUeXBlfSBvYmplY3QgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NUWVBFID0gMTI4OwotCi0gICAgLyoqIFRoZSBKRE9NIG9iamVjdCBtYXNrICovCi0gICAgcHJpdmF0ZSBpbnQgZmlsdGVyTWFzazsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgYW55IGxlZ2FsIEpET00gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudEZpbHRlcigpIHsKLSAgICAgICAgc2V0RGVmYXVsdE1hc2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciBhbGwgSkRPTSBvYmplY3RzIGFyZSB2aXNpYmxlIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbGxWaXNpYmxlIDxjb2RlPnRydWU8L2NvZGU+IGFsbCBKRE9NIG9iamVjdHMgYXJlIHZpc2libGUsCi0gICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGFsbCBKRE9NIG9iamVjdHMgYXJlIGhpZGRlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudEZpbHRlcihib29sZWFuIGFsbFZpc2libGUpIHsKLSAgICAgICAgaWYgKGFsbFZpc2libGUpIHsKLSAgICAgICAgICAgIHNldERlZmF1bHRNYXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmaWx0ZXJNYXNrICY9IH5maWx0ZXJNYXNrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsdGVyIG91dCBKRE9NIG9iamVjdHMgYWNjb3JkaW5nIHRvIGEgZmlsdGVyaW5nIG1hc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFzayBNYXNrIG9mIEpET00gb2JqZWN0cyB0byBhbGxvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudEZpbHRlcihpbnQgbWFzaykgewotICAgICAgICBzZXRGaWx0ZXJNYXNrKG1hc2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBjdXJyZW50IGZpbHRlcmluZyBtYXNrLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBmaWx0ZXJpbmcgbWFzawotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmlsdGVyTWFzaygpIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlck1hc2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGZpbHRlcmluZyBtYXNrLgotICAgICAqCi0gICAgICogQHBhcmFtIG1hc2sgdGhlIG5ldyBmaWx0ZXJpbmcgbWFzawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlck1hc2soaW50IG1hc2spIHsKLSAgICAgICAgc2V0RGVmYXVsdE1hc2soKTsKLSAgICAgICAgZmlsdGVyTWFzayAmPSBtYXNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIGZpbHRlciB0byBhbGxvdyBhbGwgbGVnYWwgSkRPTSBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNYXNrKCkgewotICAgICAgICBmaWx0ZXJNYXNrID0gRUxFTUVOVCB8IENEQVRBIHwgVEVYVCB8IENPTU1FTlQgfAotICAgICAgICAgICAgICAgICAgICAgUEkgfCBFTlRJVFlSRUYgfCBET0NVTUVOVCB8IERPQ1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGZpbHRlciB0byBtYXRjaCBvbmx5IEpET00gb2JqZWN0cyB0aGF0IGFyZSBsZWdhbAotICAgICAqIGRvY3VtZW50IGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KCkgewotICAgICAgICBmaWx0ZXJNYXNrID0gRUxFTUVOVCB8IENPTU1FTlQgfCBQSSB8IERPQ1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGZpbHRlciB0byBtYXRjaCBvbmx5IEpET00gb2JqZWN0cyB0aGF0IGFyZSBsZWdhbAotICAgICAqIGVsZW1lbnQgY29udGVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50Q29udGVudCgpIHsKLSAgICAgICAgZmlsdGVyTWFzayA9IEVMRU1FTlQgfCBDREFUQSB8IFRFWFQgfAotICAgICAgICAgICAgICAgICAgICAgQ09NTUVOVCB8IFBJIHwgRU5USVRZUkVGOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aXNpYmxpdHkgb2YgPGNvZGU+RWxlbWVudDwvY29kZT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHdoZXRoZXIgRWxlbWVudHMgYXJlIHZpc2libGUsIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogICAgICAgIGlmIHllcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgZmlsdGVyTWFzayB8PSBFTEVNRU5UOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+RUxFTUVOVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aXNpYmxpdHkgb2YgPGNvZGU+Q0RBVEE8L2NvZGU+IG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlzaWJsZSB3aGV0aGVyIENEQVRBIG5vZGVzIGFyZSB2aXNpYmxlLCA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqICAgICAgICBpZiB5ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDREFUQVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBmaWx0ZXJNYXNrIHw9IENEQVRBOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+Q0RBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdmlzaWJsaXR5IG9mIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlzaWJsZSB3aGV0aGVyIFRleHQgbm9kZXMgYXJlIHZpc2libGUsIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogICAgICAgIGlmIHllcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgZmlsdGVyTWFzayB8PSBURVhUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+VEVYVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aXNpYmxpdHkgb2YgPGNvZGU+Q29tbWVudDwvY29kZT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHdoZXRoZXIgQ29tbWVudHMgYXJlIHZpc2libGUsIDxjb2RlPnRydWU8L2NvZGU+Ci0gICAgICogICAgICAgIGlmIHllcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgZmlsdGVyTWFzayB8PSBDT01NRU5UOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+Q09NTUVOVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aXNpYmxpdHkgb2YgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpc2libGUgd2hldGhlciBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zIGFyZSB2aXNpYmxlLAotICAgICAqICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB5ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQSVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBmaWx0ZXJNYXNrIHw9IFBJOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+UEk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdmlzaWJsaXR5IG9mIDxjb2RlPkVudGl0eVJlZjwvY29kZT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHdoZXRoZXIgRW50aXR5UmVmcyBhcmUgdmlzaWJsZSwgPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKiAgICAgICAgaWYgeWVzLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVmVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIGZpbHRlck1hc2sgfD0gRU5USVRZUkVGOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmlsdGVyTWFzayAmPSB+RU5USVRZUkVGOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHZpc2libGl0eSBvZiA8Y29kZT5Eb2NUeXBlPC9jb2RlPiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHZpc2libGUgd2hldGhlciB0aGUgRG9jVHlwZSBpcyB2aXNpYmxlLCA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqICAgICAgICBpZiB5ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NUeXBlVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIGZpbHRlck1hc2sgfD0gRE9DVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZpbHRlck1hc2sgJj0gfkRPQ1RZUEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIG9iamVjdCBtYXRjaGVzIGFjY29yZGluZyB0byB0aGUgZmlsdGVyIG1hc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gdmVyaWZ5LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdGVkIG1hdGNoZWQgYSBwcmVkZmluZWQKLSAgICAgKiAgICAgICAgICAgc2V0IG9mIHJ1bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXJNYXNrICYgRUxFTUVOVCkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDREFUQSkgeyAgLy8gbXVzdCBjb21lIGJlZm9yZSBUZXh0IGNoZWNrCi0gICAgICAgICAgICByZXR1cm4gKGZpbHRlck1hc2sgJiBDREFUQSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGZpbHRlck1hc2sgJiBURVhUKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoZmlsdGVyTWFzayAmIENPTU1FTlQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGZpbHRlck1hc2sgJiBQSSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFbnRpdHlSZWYpIHsKLSAgICAgICAgICAgIHJldHVybiAoZmlsdGVyTWFzayAmIEVOVElUWVJFRikgIT0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXJNYXNrICYgRE9DVU1FTlQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG9jVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXJNYXNrICYgRE9DVFlQRSkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR3byBmaWx0ZXJzIGFyZSBlcXVpdmFsZW50IChpJiM0NjtlJiM0NjsgdGhlCi0gICAgICogbWF0Y2hpbmcgbWFzayB2YWx1ZXMgYXJlIGlkZW50aWNhbCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG9iaiAgICAgICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdHdvIGZpbHRlcnMgYXJlIGVxdWFsCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IEludGVsbGlKCi0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRGaWx0ZXIpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudEZpbHRlciBmaWx0ZXIgPSAoQ29udGVudEZpbHRlcikgb2JqOwotCi0gICAgICAgIGlmIChmaWx0ZXJNYXNrICE9IGZpbHRlci5maWx0ZXJNYXNrKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IEludGVsbGlKCi0gICAgICAgIHJldHVybiBmaWx0ZXJNYXNrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0VsZW1lbnRGaWx0ZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0VsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwYzZjYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9FbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyotLQotCi0gJElkOiBFbGVtZW50RmlsdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLmZpbHRlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuamRvbS4qOwotCi0vKioKLSAqIEEgRmlsdGVyIHRoYXQgb25seSBtYXRjaGVzIHtAbGluayBvcmcuamRvbS5FbGVtZW50fSBvYmplY3RzLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqIEBhdXRob3IgIEpvb2xzIEVudGlja25hcAotICogQGF1dGhvciAgQnJhZGxleSBTLiBIdWZmbWFuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAiQCgjKSAkUkNTZmlsZTogRWxlbWVudEZpbHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKiBUaGUgZWxlbWVudCBuYW1lICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKiBUaGUgZWxlbWVudCBuYW1lc3BhY2UgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBOYW1lc3BhY2UgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0IG9ubHkgdGhlIEVsZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RmlsdGVyKCkge30KLQotICAgIC8qKgotICAgICAqIFNlbGVjdCBvbmx5IHRoZSBFbGVtZW50cyB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGluIGFueSBOYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBFbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RmlsdGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSAgID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3Qgb25seSB0aGUgRWxlbWVudHMgd2l0aCB0aGUgc3VwcGxpZWQgTmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSBFbGVtZW50IGxpdmVzIGluLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RmlsdGVyKE5hbWVzcGFjZSBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0IG9ubHkgdGhlIEVsZW1lbnRzIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIE5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIEVsZW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSBFbGVtZW50IGxpdmVzIGluLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RmlsdGVyKFN0cmluZyBuYW1lLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMubmFtZSAgID0gbmFtZTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBvYmplY3QgbWF0Y2hlcyBhIHByZWRlZmluZWQgc2V0IG9mIHJ1bGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIHZlcmlmeS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3RlZCBtYXRjaGVkIGEgcHJlZGZpbmVkCi0gICAgICogICAgICAgICAgIHNldCBvZiBydWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWwgPSAoRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICh0aGlzLm5hbWUgPT0gbnVsbCB8fCB0aGlzLm5hbWUuZXF1YWxzKGVsLmdldE5hbWUoKSkpICYmCi0gICAgICAgICAgICAgICh0aGlzLm5hbWVzcGFjZSA9PSBudWxsIHx8IHRoaXMubmFtZXNwYWNlLmVxdWFscyhlbC5nZXROYW1lc3BhY2UoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR3byBmaWx0ZXJzIGFyZSBlcXVpdmFsZW50IChpJiM0NjtlJiM0NjsgdGhlCi0gICAgICogbWF0Y2hpbmcgbmFtZXMgYW5kIG5hbWVzcGFjZSBhcmUgZXF1aXZhbGVudCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG9iaiAgICAgICAgICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0d28gZmlsdGVycyBhcmUgZXF1YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAvLyBHZW5lcmF0ZWQgYnkgSW50ZWxsaUoKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRWxlbWVudEZpbHRlcikpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmaW5hbCBFbGVtZW50RmlsdGVyIGZpbHRlciA9IChFbGVtZW50RmlsdGVyKSBvYmo7Ci0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCA/ICFuYW1lLmVxdWFscyhmaWx0ZXIubmFtZSkgOiBmaWx0ZXIubmFtZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCA/ICFuYW1lc3BhY2UuZXF1YWxzKGZpbHRlci5uYW1lc3BhY2UpIDogZmlsdGVyLm5hbWVzcGFjZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IEludGVsbGlKCi0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IChuYW1lICE9IG51bGwgPyBuYW1lLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgcmVzdWx0ID0gMjkgKiByZXN1bHQgKyAobmFtZXNwYWNlICE9IG51bGwgPyBuYW1lc3BhY2UuaGFzaENvZGUoKSA6IDApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIFN1cHBvcnQgYSBjdXN0b20gTmFtZXNwYWNlIHNlcmlhbGl6YXRpb24gc28gbm8gdHdvIG5hbWVzcGFjZQotICAgIC8vIG9iamVjdCBpbnN0YW5jZXMgbWF5IGV4aXN0IGZvciB0aGUgc2FtZSBwcmVmaXgvdXJpIHBhaXIKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gV2UgdXNlIHdyaXRlT2JqZWN0KCkgYW5kIG5vdCB3cml0ZVVURigpIHRvIG1pbmltaXplIHNwYWNlCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciB3cml0aW5nIHBvaW50ZXJzIHRvIGFscmVhZHkgd3JpdHRlbiBzdHJpbmdzCi0gICAgICAgIG91dC53cml0ZU9iamVjdChuYW1lc3BhY2UuZ2V0UHJlZml4KCkpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QobmFtZXNwYWNlLmdldFVSSSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotICAgICAgICBuYW1lc3BhY2UgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKAotICAgICAgICAgICAgICAgIChTdHJpbmcpIGluLnJlYWRPYmplY3QoKSwgKFN0cmluZykgaW4ucmVhZE9iamVjdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9GaWx0ZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTRlNDc5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyotLSAKLQotICRJZDogRmlsdGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoxOSBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5maWx0ZXI7Ci0KLQotLyoqCi0gKiBBIGdlbmVyYWxpemVkIGZpbHRlciB0byByZXN0cmljdCB2aXNpYmlsaXR5IG9yIG11dGFiaWxpdHkgb24gYSBsaXN0LgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqIEBhdXRob3IgIEpvb2xzIEVudGlja25hcAotICogQGF1dGhvciAgQnJhZGxleSBTLiBIdWZmbWFuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyIGV4dGVuZHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0IG1hdGNoZXMgYSBwcmVkZWZpbmVkIHNldCBvZiBydWxlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byB2ZXJpZnkuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IG1hdGNoZXMgYSBwcmVkZmluZWQgCi0gICAgICogICAgICAgICAgIHNldCBvZiBydWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvYmopOwotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9maWx0ZXIvTmVnYXRlRmlsdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9OZWdhdGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4ZmIxZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9OZWdhdGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IE5lZ2F0ZUZpbHRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTkgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5maWx0ZXI7Ci0KLS8qKgotICogRmlsdGVyIHRoYXQgaXMgdGhlIGxvZ2ljYWwgPGI+bmVnYXRpb248L2I+IG9wZXJhdGlvbiBvZiBhbm90aGVyIGZpbHRlci4KLSAqCi0gKgotICogQGF1dGhvciBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQKLSAqLwotZmluYWwgY2xhc3MgTmVnYXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IE5lZ2F0ZUZpbHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQiOwotCi0gICAgLy8gVW5kZXJseWluZyBmaWx0ZXIuCi0gICAgcHJpdmF0ZSBGaWx0ZXIgZmlsdGVyOwotCi0gICAgLyoqCi0gICAgICogTWF0Y2ggaWYgdGhlIHN1cHBsaWVkIGZpbHRlciA8Yj5kb2VzIG5vdDwvYj4gbWF0Y2guCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVyIGZpbHRlciB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIE5lZ2F0ZUZpbHRlcihGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gIWZpbHRlci5tYXRjaGVzKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbHRlciBuZWdhdGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBOZWdhdGVGaWx0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZXF1YWxzKCgoTmVnYXRlRmlsdGVyKSBvYmopLmZpbHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB+ZmlsdGVyLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoNjQpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiW05lZ2F0ZUZpbHRlcjogIikKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZpbHRlci50b1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0iKQotICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL09yRmlsdGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9PckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY3ZDQzLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL09yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyotLQotCi0gJElkOiBPckZpbHRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MTkgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5maWx0ZXI7Ci0KLS8qKgotICogQWxsb3cgdHdvIGZpbHRlcnMgdG8gYmUgY2hhaW5lZCB0b2dldGhlciB3aXRoIGEgbG9naWNhbAotICogPGI+b3I8L2I+IG9wZXJhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEJyYWRsZXkgUy4gSHVmZm1hbgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MTkgJAotICovCi1maW5hbCBjbGFzcyBPckZpbHRlciBleHRlbmRzIEFic3RyYWN0RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBPckZpbHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjE5ICQiOwotCi0gICAgLyoqIEZpbHRlciBmb3IgbGVmdCBzaWRlIG9mIGxvZ2ljYWwgPGI+b3I8L2I+ICovCi0gICAgcHJpdmF0ZSBGaWx0ZXIgbGVmdDsKLQotICAgIC8qKiBGaWx0ZXIgZm9yIHJpZ2h0IHNpZGUgb2YgbG9naWNhbCA8Yj5vcjwvYj4gKi8KLSAgICBwcml2YXRlIEZpbHRlciByaWdodDsKLQotICAgIC8qKgotICAgICAqIE1hdGNoIGlmIGVpdGhlciBvZiB0aGUgc3VwcGxpZWQgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZWZ0IGxlZnQgc2lkZSBvZiBsb2dpY2FsIDxiPm9yPC9iPgotICAgICAqIEBwYXJhbSByaWdodCByaWdodCBzaWRlIG9mIGxvZ2ljYWwgPGI+b3I8L2I+Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyIHN1cHBsaWVkIGZpbHRlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9yRmlsdGVyKEZpbHRlciBsZWZ0LCBGaWx0ZXIgcmlnaHQpIHsKLSAgICAgICAgaWYgKChsZWZ0ID09IG51bGwpIHx8IChyaWdodCA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBmaWx0ZXIgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OwotICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBsZWZ0Lm1hdGNoZXMob2JqKSB8fCByaWdodC5tYXRjaGVzKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPckZpbHRlcikgewotICAgICAgICAgICAgT3JGaWx0ZXIgZmlsdGVyID0gKE9yRmlsdGVyKSBvYmo7Ci0gICAgICAgICAgICBpZiAoKGxlZnQuZXF1YWxzKGZpbHRlci5sZWZ0KSAgJiYgcmlnaHQuZXF1YWxzKGZpbHRlci5yaWdodCkpIHx8Ci0gICAgICAgICAgICAgICAgKGxlZnQuZXF1YWxzKGZpbHRlci5yaWdodCkgJiYgcmlnaHQuZXF1YWxzKGZpbHRlci5sZWZ0KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoMzEgKiBsZWZ0Lmhhc2hDb2RlKCkpICsgcmlnaHQuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcig2NCkKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJbT3JGaWx0ZXI6ICIpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZChsZWZ0LnRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLFxuIikKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgICAgICIpCi0gICAgICAgICAgICAgICAgICAgLmFwcGVuZChyaWdodC50b1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0iKQotICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vZmlsdGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiYzk1ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2ZpbHRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxib2R5PgotCi1DbGFzc2VzIHRvIHByb2dyYW1tYXRpY2FsbHkgZmlsdGVyIG5vZGVzIG9mIGEgZG9jdW1lbnQgYmFzZWQgb24gdHlwZSwgbmFtZSwKLXZhbHVlLCBvciBvdGhlciBhc3BlY3RzIGFuZCB0byBib29sZWFuIGFuZC9vci9uZWdhdGUgdGhlc2UgcnVsZXMuICBGaWx0ZXJzIGNhbgotYmUgdXNlZCBpbiBtZXRob2RzIGxpa2UgZ2V0Q29udGVudChGaWx0ZXIpIGFuZCBnZXREZXNjZW5kYW50cyhGaWx0ZXIpLiAgQQotc2FtcGxpbmcgb2YgZ2VuZXJhbGx5IHVzZWZ1bCBmaWx0ZXJzIGFyZSBwcm92aWRlZCBoZXJlLiAgQWx0ZXJuYXRlIGZpbHRlcnMgY2FuCi1iZSB1c2VyIGRlZmluZWQuCi0KLTwvYm9keT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvQnVpbGRlckVycm9ySGFuZGxlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9CdWlsZGVyRXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzBmMGQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9CdWlsZGVyRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyotLSAKLQotICRJZDogQnVpbGRlckVycm9ySGFuZGxlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjAgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cyAKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlIAotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MgCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5IAotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotIAotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uaW5wdXQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBKRE9NIGVycm9yIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJAotICovCi0KLXB1YmxpYyBjbGFzcyBCdWlsZGVyRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBCdWlsZGVyRXJyb3JIYW5kbGVyLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSB3YXJuaW5nIGhhcyBvY2N1cnJlZDsgdGhpcyBpbmRpY2F0ZXMKLSAgICAgKiB0aGF0IHdoaWxlIG5vIFhNTCBydWxlcyB3ZXJlIGJyb2tlbiwgc29tZXRoaW5nIGFwcGVhcnMgdG8gYmUKLSAgICAgKiBpbmNvcnJlY3Qgb3IgbWlzc2luZy4KLSAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaGVyZSBpcyBhICJubyBvcCIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIDxjb2RlPlNBWFBhcnNlRXhjZXB0aW9uPC9jb2RlPiB0aGF0IG9jY3VycmVkLgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdoZW4gdGhpbmdzIGdvIHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGFuIGVycm9yIHRoYXQgaGFzIG9jY3VycmVkOyAKLSAgICAgKiB0aGlzIGluZGljYXRlcyB0aGF0IGEgcnVsZSB3YXMgYnJva2VuLCB0eXBpY2FsbHkgaW4gdmFsaWRhdGlvbiwgYnV0IAotICAgICAqIHRoYXQgcGFyc2luZyBjb3VsZCByZWFzb25hYmx5IGNvbnRpbnVlLgotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBoZXJlIGlzIHRvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gPGNvZGU+U0FYUGFyc2VFeGNlcHRpb248L2NvZGU+IHRoYXQgb2NjdXJyZWQuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gd2hlbiB0aGluZ3MgZ28gd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBleGNlcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgZmF0YWwgZXJyb3I7IHRoaXMgaW5kaWNhdGVzIHRoYXQKLSAgICAgKiBhIHJ1bGUgaGFzIGJlZW4gYnJva2VuIHRoYXQgbWFrZXMgY29udGludWVkIHBhcnNpbmcgZWl0aGVyIGltcG9zc2libGUKLSAgICAgKiBvciBhbiBhbG1vc3QgY2VydGFpbiB3YXN0ZSBvZiB0aW1lLgotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBoZXJlIGlzIHRvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gPGNvZGU+U0FYUGFyc2VFeGNlcHRpb248L2NvZGU+IHRoYXQgb2NjdXJyZWQuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gd2hlbiB0aGluZ3MgZ28gd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L0RPTUJ1aWxkZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvRE9NQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVhNjE2Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvRE9NQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qLS0KLQotICRJZDogRE9NQnVpbGRlci5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjAgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5pbnB1dDsKLQotaW1wb3J0IG9yZy5qZG9tLio7Ci1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIEJ1aWxkcyBhIEpET00ge0BsaW5rIG9yZy5qZG9tLkRvY3VtZW50IG9yZy5qZG9tLkRvY3VtZW50fSBmcm9tIGEgcHJlLWV4aXN0aW5nCi0gKiBET00ge0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50IG9yZy53M2MuZG9tLkRvY3VtZW50fS4gQWxzbyBoYW5keSBmb3IgdGVzdGluZwotICogYnVpbGRzIGZyb20gZmlsZXMgdG8gc2FuaXR5IGNoZWNrIHtAbGluayBTQVhCdWlsZGVyfS4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIFBoaWxpcCBOZWxzb24KLSAqIEBhdXRob3IgIEtldmluIFJlZ2FuCi0gKiBAYXV0aG9yICBZdXN1ZiBHb29sYW1hYmJhcwotICogQGF1dGhvciAgRGFuIFNjaGFmZmVyCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqLwotcHVibGljIGNsYXNzIERPTUJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAiQCgjKSAkUkNTZmlsZTogRE9NQnVpbGRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKiBBZGFwdGVyIGNsYXNzIHRvIHVzZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFkYXB0ZXJDbGFzczsKLQotICAgIC8qKiBUaGUgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IEpET00gb2JqZWN0cyAqLwotICAgIHByaXZhdGUgSkRPTUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEZWZhdWx0SkRPTUZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyBET01CdWlsZGVyIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBmaXJzdCBsb2NhdGUKLSAgICAgKiBhIHBhcnNlciB2aWEgSkFYUCwgdGhlbiB3aWxsIHRyeSB0byB1c2UgYSBzZXQgb2YgZGVmYXVsdCBwYXJzZXJzLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIHBhcnNlciB3aWxsIG5vdCB2YWxpZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRE9NQnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgRE9NQnVpbGRlciB1c2luZyB0aGUgc3BlY2lmaWVkIERPTUFkYXB0ZXIKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBhcyBhIHdheSB0byBjaG9vc2UgdGhlIHVuZGVybHlpbmcgcGFyc2VyLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIHBhcnNlciB3aWxsIG5vdCB2YWxpZGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyQ2xhc3MgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGNsYXNzCi0gICAgICogICAgICAgICAgICAgICAgICAgICB0byB1c2UgZm9yIERPTSBidWlsZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRE9NQnVpbGRlcihTdHJpbmcgYWRhcHRlckNsYXNzKSB7Ci0gICAgICAgIHRoaXMuYWRhcHRlckNsYXNzID0gYWRhcHRlckNsYXNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBzZXRzIGEgY3VzdG9tIEpET01GYWN0b3J5IGZvciB0aGUgYnVpbGRlci4gIFVzZSB0aGlzIHRvIGJ1aWxkCi0gICAgICogdGhlIHRyZWUgd2l0aCB5b3VyIG93biBzdWJjbGFzc2VzIG9mIHRoZSBKRE9NIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSA8Y29kZT5KRE9NRmFjdG9yeTwvY29kZT4gdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeShKRE9NRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgb3JnLmpkb20uSkRPTUZhY3Rvcnl9IGluIHVzZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IGluIHVzZQotICAgICAqLwotICAgIHB1YmxpYyBKRE9NRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYnVpbGQgYSBKRE9NIHRyZWUgZnJvbSBhbiBleGlzdGluZyBET00gdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb21Eb2N1bWVudCA8Y29kZT5vcmcudzNjLmRvbS5Eb2N1bWVudDwvY29kZT4gb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSBKRE9NIGRvY3VtZW50IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgYnVpbGQob3JnLnczYy5kb20uRG9jdW1lbnQgZG9tRG9jdW1lbnQpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5kb2N1bWVudChudWxsKTsKLSAgICAgICAgYnVpbGRUcmVlKGRvbURvY3VtZW50LCBkb2MsIG51bGwsIHRydWUpOwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBidWlsZCBhIEpET00gRWxlbWVudCBmcm9tIGFuIGV4aXN0aW5nIERPTSBFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9tRWxlbWVudCA8Y29kZT4gb3JnLnczYy5kb20uRWxlbWVudDwvY29kZT4gb2JqZWN0Ci0gICAgICogQHJldHVybiA8Y29kZT5FbGVtZW50PC9jb2RlPiAtIEpET00gRWxlbWVudCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmpkb20uRWxlbWVudCBidWlsZChvcmcudzNjLmRvbS5FbGVtZW50IGRvbUVsZW1lbnQpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZmFjdG9yeS5kb2N1bWVudChudWxsKTsKLSAgICAgICAgYnVpbGRUcmVlKGRvbUVsZW1lbnQsIGRvYywgbnVsbCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHRha2VzIGEgRE9NIDxjb2RlPk5vZGU8L2NvZGU+IGFuZCBidWlsZHMgdXAKLSAgICAgKiBhIEpET00gdHJlZSwgcmVjdXJzaW5nIHVudGlsIHRoZSBET00gdHJlZSBpcyBleGhhdXN0ZWQKLSAgICAgKiBhbmQgdGhlIEpET00gdHJlZSByZXN1bHRzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgPGNvZGU+Q29kZTwvbm9kZT4gdG8gZXhhbWluZS4KLSAgICAgKiBAcGFyYW0gZG9jIEpET00gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IGJlaW5nIGJ1aWx0LgotICAgICAqIEBwYXJhbSBjdXJyZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRoYXQgaXMgY3VycmVudCBwYXJlbnQuCi0gICAgICogQHBhcmFtIGF0Um9vdCA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgYXQgcm9vdCBsZXZlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRUcmVlKE5vZGUgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRSb290KSB7Ci0gICAgICAgIC8vIFJlY3Vyc2UgdGhyb3VnaCB0aGUgdHJlZQotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAsIHNpemU9bm9kZXMuZ2V0TGVuZ3RoKCk7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkVHJlZShub2Rlcy5pdGVtKGkpLCBkb2MsIGN1cnJlbnQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBub2RlTmFtZTsKLSAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBub2RlTmFtZS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbG9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbm9kZU5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gbm9kZU5hbWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gR2V0IGVsZW1lbnQncyBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgbnMgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBucyA9IChjdXJyZW50ID09IG51bGwpID8gTmFtZXNwYWNlLk5PX05BTUVTUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmFjdG9yeS5lbGVtZW50KGxvY2FsTmFtZSwgbnMpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0Um9vdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCByb290LCBzZXQgYXMgZG9jdW1lbnQgcm9vdAotICAgICAgICAgICAgICAgICAgICBkb2Muc2V0Um9vdEVsZW1lbnQoZWxlbWVudCk7ICAvLyBYWFggc2hvdWxkIHdlIHVzZSBhIGZhY3RvcnkgY2FsbD8KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGFkZCB0byBwYXJlbnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoY3VycmVudCwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQWRkIG5hbWVzcGFjZXMKLSAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlTGlzdCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGludCBhdHRzaXplID0gYXR0cmlidXRlTGlzdC5nZXRMZW5ndGgoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHIgYXR0ID0gKEF0dHIpIGF0dHJpYnV0ZUxpc3QuaXRlbShpKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0bmFtZSA9IGF0dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRQcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gYXR0bmFtZS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb24gPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dFByZWZpeCA9IGF0dG5hbWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHR2YWx1ZSA9IGF0dC5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2UgZGVjbGFyZWROUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlLmdldE5hbWVzcGFjZShhdHRQcmVmaXgsIGF0dHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFzIGFkZGl0aW9uYWwgbmFtZXNwYWNlcyBpZiBpdCdzIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGlzIGVsZW1lbnQncyBuYW1lc3BhY2UgKHBlcmhhcHMgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGhhdmUgbG9naWMgbm90IHRvIG1hcmsgdGhlbSBhcyBhZGRpdGlvbmFsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGJlZW4gZG9uZSBhbHJlYWR5LCBidXQgaXQgcHJvYmFibHkgZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0dGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoYXR0UHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0TmFtZXNwYWNlKGRlY2xhcmVkTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihlbGVtZW50LCBkZWNsYXJlZE5TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFkZCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0ciBhdHQgPSAoQXR0cikgYXR0cmlidXRlTGlzdC5pdGVtKGkpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRuYW1lID0gYXR0LmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoICFhdHRuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRQcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRMb2NhbE5hbWUgPSBhdHRuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sb24gPSBhdHRuYW1lLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0UHJlZml4ID0gYXR0bmFtZS5zdWJzdHJpbmcoMCwgY29sb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dExvY2FsTmFtZSA9IGF0dG5hbWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHR2YWx1ZSA9IGF0dC5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXR0cmlidXRlJ3MgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2UgYXR0bnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhhdHRQcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0bnMgPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0bnMgPSBlbGVtZW50LmdldE5hbWVzcGFjZShhdHRQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmF0dHJpYnV0ZShhdHRMb2NhbE5hbWUsIGF0dHZhbHVlLCBhdHRucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LnNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVjdXJzZSBvbiBjaGlsZCBub2RlcwotICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0IHNob3VsZCBuZXZlciBiZSBudWxsIG5vciBzaG91bGQgaXQgZXZlciBjb250YWluCi0gICAgICAgICAgICAgICAgLy8gbnVsbCBub2RlcywgYnV0IHNvbWUgRE9NIGltcGxzIGFyZSBicm9rZW4KLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGl0ZW0gPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVHJlZShpdGVtLCBkb2MsIGVsZW1lbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRDb250ZW50KGN1cnJlbnQsIGZhY3RvcnkudGV4dChkYXRhKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNkYXRhID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoY3VycmVudCwgZmFjdG9yeS5jZGF0YShjZGF0YSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICAgICAgaWYgKGF0Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obm9kZS5nZXROb2RlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChjdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obm9kZS5nZXROb2RlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKLSAgICAgICAgICAgICAgICBpZiAoYXRSb290KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChkb2MsIGZhY3RvcnkuY29tbWVudChub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRDb250ZW50KGN1cnJlbnQsIGZhY3RvcnkuY29tbWVudChub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgICAgIEVudGl0eVJlZiBlbnRpdHkgPSBmYWN0b3J5LmVudGl0eVJlZihub2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChjdXJyZW50LCBlbnRpdHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX05PREU6Ci0gICAgICAgICAgICAgICAgLy8gPz8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9tRG9jVHlwZSA9IChEb2N1bWVudFR5cGUpbm9kZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSUQgPSBkb21Eb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlEID0gZG9tRG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcm5hbERURCA9IGRvbURvY1R5cGUuZ2V0SW50ZXJuYWxTdWJzZXQoKTsKLQotICAgICAgICAgICAgICAgIERvY1R5cGUgZG9jVHlwZSA9IGZhY3RvcnkuZG9jVHlwZShkb21Eb2NUeXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZG9jVHlwZS5zZXRQdWJsaWNJRChwdWJsaWNJRCk7Ci0gICAgICAgICAgICAgICAgZG9jVHlwZS5zZXRTeXN0ZW1JRChzeXN0ZW1JRCk7Ci0gICAgICAgICAgICAgICAgZG9jVHlwZS5zZXRJbnRlcm5hbFN1YnNldChpbnRlcm5hbERURCk7Ci0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZG9jLCBkb2NUeXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvSkFYUFBhcnNlckZhY3RvcnkuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvSkFYUFBhcnNlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlNzM0ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L0pBWFBQYXJzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyotLQotCi0gJElkOiBKQVhQUGFyc2VyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjAgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5pbnB1dDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotaW1wb3J0IG9yZy5qZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBBIG5vbi1wdWJsaWMgdXRpbGl0eSBjbGFzcyB0byBhbGxvY2F0ZSBKQVhQIFNBWCBwYXJzZXJzLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIExhdXJlbnQgQmloYW5pYwotICovCi1jbGFzcyBKQVhQUGFyc2VyRmFjdG9yeSB7ICAgICAgICAgICAgICAgLy8gcGFja2FnZSBwcm90ZWN0ZWQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IEpBWFBQYXJzZXJGYWN0b3J5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqIEpBWFAgMS4yIHNjaGVtYSBsYW5ndWFnZSBwcm9wZXJ0eSBpZC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUF9TQ0hFTUFfTEFOR1VBR0VfUFJPUEVSVFkgPQotICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOwotCi0gICAgLyoqIEpBWFAgMS4yIHNjaGVtYSBsb2NhdGlvbiBwcm9wZXJ0eSBpZC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUF9TQ0hFTUFfTE9DQVRJT05fUFJPUEVSVFkgPQotICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hU291cmNlIjsKLQotICAgIC8qKgotICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gZm9yYmlkIGFsbG9jYXRpbmcgaW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eQotICAgICAqIGNsYXNzLgotICAgICAqLwotICAgIHByaXZhdGUgSkFYUFBhcnNlckZhY3RvcnkoKSB7Ci0gICAgICAgIC8vIE5ldmVyIGNhbGxlZC4KLSAgICB9Ci0KLSAgICAvKiBJbXBsZW1lbnRvcidzIG5vdGUgcmVnYXJkaW5nIGNyZWF0ZVBhcnNlcigpIGRlc2lnbjogVGhlIGZlYXR1cmVzIGFuZAotICAgIHByb3BlcnRpZXMgYXJlIG5vcm1hbGx5IHNldCBpbiBTQVhCdWlsZGVyLCBidXQgd2UgdGFrZSB0aGVtIGluCi0gICAgY3JlYXRlUGFyc2VyKCkgYXMgd2VsbCBiZWNhdXNlIHNvbWUgZmVhdHVyZXMgb3IgcHJvcGVydGllcyBtYXkgbmVlZCB0byBiZQotICAgIGFwcGxpZWQgZHVyaW5nIHRoZSBKQVhQIHBhcnNlciBjb25zdHJ1Y3Rpb24uIFRvZGF5LCBmb3IgZXhhbXBsZSwgcHJvcGVydGllcwotICAgIGlzIHVzZWQgYXMgaXQncyB0aGUgb25seSB3YXkgdG8gY29uZmlndXJlIHNjaGVtYSB2YWxpZGF0aW9uOiBKQVhQIGRlZmluZXMKLSAgICBzY2hlbWEgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGJ1dCBTQVggZG9lcyBub3QuIFRoaXMgcmVmbGVjdHMgaW4gdGhlIEFwYWNoZQotICAgIFhlcmNlcyBpbXBsZW1lbnRhdGlvbiB3aGVyZSB0aGUgU0FYUGFyc2VyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBKQVhQCi0gICAgcHJvcGVydGllcyBidXQgdGhlIFhNTFJlYWRlciBkb2VzIG5vdC4gSGVuY2UsIGNvbmZpZ3VyaW5nIHNjaGVtYSB2YWxpZGF0aW9uCi0gICAgbXVzdCBiZSBkb25lIG9uIHRoZSBTQVhQYXJzZXIgb2JqZWN0IHdoaWNoIGlzIG9ubHkgdmlzaWJsZSBpbgotICAgIEpBWFBhcnNlckZhY3RvcnkuIEZlYXR1cmVzIGlzIGFsc28gcGFzc2VkIGluIGNhc2Ugc29tZSBmdXR1cmUgSkFYUCByZWxlYXNlCi0gICAgZGVmaW5lcyBKQVhQLXNwZWNpZmljIGZlYXR1cmVzLgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFNBWCBwYXJzZXIgYWxsb2NhdGVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgSkFYUCBTQVgKLSAgICAgKiBwYXJzZXIgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgdmFsaWRhdGluZyAgIHdoZXRoZXIgYSB2YWxpZGF0aW5nIHBhcnNlciBpcyByZXF1ZXN0ZWQuCi0gICAgICogQHBhcmFtICBmZWF0dXJlcyAgICAgdGhlIHVzZXItZGVmaW5lZCBTQVggZmVhdHVyZXMuCi0gICAgICogQHBhcmFtICBwcm9wZXJ0aWVzICAgdGhlIHVzZXItZGVmaW5lZCBTQVggcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjb25maWd1cmVkIFhNTFJlYWRlci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJyZWQgd2hlbiBhbGxvY2F0aW5nIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyaW5nIHRoZSBKQVhQIFNBWCBwYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxSZWFkZXIgY3JlYXRlUGFyc2VyKGJvb2xlYW4gdmFsaWRhdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGZlYXR1cmVzLCBNYXAgcHJvcGVydGllcykgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIGFuZCBjb25maWd1cmUgSkFYUCBTQVggcGFyc2VyIGZhY3RvcnkuCi0gICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0gICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHBhcnNlci4KLSAgICAgICAgICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJDb3VsZCBub3QgYWxsb2NhdGUgSkFYUCBTQVggUGFyc2VyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB1c2VyLWRlZmluZWQgSkFYUCBwcm9wZXJ0aWVzIChpZiBhbnkpCi0gICAgICAgICAgICBzZXRQcm9wZXJ0eShwYXJzZXIsIHByb3BlcnRpZXMsIEpBWFBfU0NIRU1BX0xBTkdVQUdFX1BST1BFUlRZKTsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KHBhcnNlciwgcHJvcGVydGllcywgSkFYUF9TQ0hFTUFfTE9DQVRJT05fUFJPUEVSVFkpOwotCi0gICAgICAgICAgICAvLyBSZXR1cm4gY29uZmlndXJlZCBTQVggWE1MUmVhZGVyLgotICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJDb3VsZCBub3QgYWxsb2NhdGUgSkFYUCBTQVggUGFyc2VyIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJvcGVydHkgb24gYSBKQVhQIFNBWCBwYXJzZXIgb2JqZWN0IGlmIGFuZCBvbmx5IGlmIGl0Ci0gICAgICogaXMgZGVjbGFyZWQgaW4gdGhlIHVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtICBwYXJzZXIgICAgICAgdGhlIEpBWFAgU0FYIHBhcnNlciB0byBjb25maWd1cmUuCi0gICAgICogQHBhcmFtICBwcm9wZXJ0aWVzICAgdGhlIHVzZXItZGVmaW5lZCBTQVggcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAgICAqCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25maWd1cmluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTQVhQYXJzZXIgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMsIFN0cmluZyBuYW1lKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eShuYW1lLCBwcm9wZXJ0aWVzLmdldChuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBuYW1lICsgIiBwcm9wZXJ0eSBub3Qgc3VwcG9ydGVkIGZvciBKQVhQIHBhcnNlciAiICsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIG5hbWUgKyAiIHByb3BlcnR5IG5vdCByZWNvZ25pemVkIGZvciBKQVhQIHBhcnNlciAiICsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L0pET01QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9KRE9NUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwODMwMS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L0pET01QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qLS0KLQotICRJZDogSkRPTVBhcnNlRXhjZXB0aW9uLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLmlucHV0OwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0vKioKLSAqIFRocm93biBkdXJpbmcgcGFyc2UgZXJyb3JzLCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBwYXJzZSBlcnJvcgotICogb2NjdXJyZWQgYXMgd2VsbCBhcyBhY2Nlc3MgdG8gdGhlIHBhcnRpYWxseSBidWlsdCBkb2N1bWVudC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkCi0gKiBAYXV0aG9yICBMYXVyZW50IEJpaGFuaWMKLSAqLwotcHVibGljIGNsYXNzIEpET01QYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEpET01FeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAiQCgjKSAkUkNTZmlsZTogSkRPTVBhcnNlRXhjZXB0aW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHRoYXQgd2FzIHN1Y2Nlc3NmdWxseSBidWlsdCBiZWZvcmUKLSAgICAgKiB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBEb2N1bWVudCBwYXJ0aWFsRG9jdW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgcGFyc2UgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBnaXZlbgotICAgICAqIG1lc3NhZ2UgYW5kIHdyYXAgdGhlIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gdGhhdCBjYXVzZSBhIGRvY3VtZW50Ci0gICAgICogcGFyc2UgdG8gZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIDxjb2RlPlN0cmluZzwvY29kZT4gbWVzc2FnZSBpbmRpY2F0aW5nCi0gICAgICogICAgICAgICAgICAgICAgdGhlIHByb2JsZW0gdGhhdCBvY2N1cnJlZC4KLSAgICAgKiBAcGFyYW0gY2F1c2UgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiB0aGF0IGNhdXNlZCB0aGlzCi0gICAgICogICAgICAgICAgICAgIHRvIGJlIHRocm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSkRPTVBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpICB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSwgY2F1c2UsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBwYXJzZSA8Y29kZT5FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGdpdmVuCi0gICAgICogbWVzc2FnZSBhbmQgdGhlIHBhcnRpYWwgZG9jdW1lbnQgYW5kIHdyYXAgdGhlCi0gICAgICogPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiB0aGF0IGNhdXNlIGEgZG9jdW1lbnQgcGFyc2UgdG8gZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIDxjb2RlPlN0cmluZzwvY29kZT4gbWVzc2FnZSBpbmRpY2F0aW5nCi0gICAgICogICAgICAgICAgICAgICAgdGhlIHByb2JsZW0gdGhhdCBvY2N1cnJlZC4KLSAgICAgKiBAcGFyYW0gY2F1c2UgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiB0aGF0IGNhdXNlZCB0aGlzCi0gICAgICogICAgICAgICAgICAgIHRvIGJlIHRocm93bi4KLSAgICAgKiBAcGFyYW0gcGFydGlhbERvY3VtZW50IDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0aGUgcG9ydGlvbiBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IFhNTCBkb2N1bWVudCB0aGF0IHdhcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGJ1aWx0LgotICAgICAqLwotICAgIHB1YmxpYyBKRE9NUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IHBhcnRpYWxEb2N1bWVudCkgIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgICAgICB0aGlzLnBhcnRpYWxEb2N1bWVudCA9IHBhcnRpYWxEb2N1bWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJ0aWFsIGRvY3VtZW50IHRoYXQgd2FzIHN1Y2Nlc3NmdWxseSBidWlsdCBiZWZvcmUKLSAgICAgKiB0aGUgZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJ0aWFsIGRvY3VtZW50IG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0UGFydGlhbERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gcGFydGlhbERvY3VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlCi0gICAgICogcGFyc2UgZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBpZGVudGlmaWVyLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pPwotICAgICAgICAgICAgICAgICAgICAgICAgKChTQVhQYXJzZUV4Y2VwdGlvbilnZXRDYXVzZSgpKS5nZXRQdWJsaWNJZCgpOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlCi0gICAgICogcGFyc2UgZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyLCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pPwotICAgICAgICAgICAgICAgICAgICAgICAgKChTQVhQYXJzZUV4Y2VwdGlvbilnZXRDYXVzZSgpKS5nZXRTeXN0ZW1JZCgpOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgd2hlcmUgdGhlCi0gICAgICogcGFyc2UgZXJyb3Igb2NjdXJyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZpcnN0IGxpbmUgaW4gdGhlIGRvY3VtZW50IGlzIGxpbmUgMS48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBsaW5lIG51bWJlciwgb3IgLTEKLSAgICAgKiAgICAgICAgIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pPwotICAgICAgICAgICAgICAgICAgICAgICAgKChTQVhQYXJzZUV4Y2VwdGlvbilnZXRDYXVzZSgpKS5nZXRMaW5lTnVtYmVyKCk6IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCB3aGVyZSB0aGUKLSAgICAgKiBwYXJzZSBlcnJvciBvY2N1cnJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmlyc3QgY29sdW1uIGluIGEgbGluZSBpcyBwb3NpdGlvbiAxLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiBudW1iZXIsIG9yIC0xCi0gICAgICogICAgICAgICBpZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pPwotICAgICAgICAgICAgICAgICAgICAgICAgKChTQVhQYXJzZUV4Y2VwdGlvbilnZXRDYXVzZSgpKS5nZXRDb2x1bW5OdW1iZXIoKTogLTE7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L1NBWEJ1aWxkZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvU0FYQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTUyYjBkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvU0FYQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IFNBWEJ1aWxkZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLQotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwotCi0vKioKLSAqIEJ1aWxkcyBhIEpET00gZG9jdW1lbnQgZnJvbSBmaWxlcywgc3RyZWFtcywgcmVhZGVycywgVVJMcywgb3IgYSBTQVgge0BsaW5rCi0gKiBvcmcueG1sLnNheC5JbnB1dFNvdXJjZX0gaW5zdGFuY2UgdXNpbmcgYSBTQVggcGFyc2VyLiBUaGUgYnVpbGRlciB1c2VzIGEKLSAqIHRoaXJkLXBhcnR5IFNBWCBwYXJzZXIgKGNob3NlbiBieSBKQVhQIGJ5IGRlZmF1bHQsIG9yIHlvdSBjYW4gY2hvb3NlCi0gKiBtYW51YWxseSkgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIGR1dGllcyBhbmQgc2ltcGx5IGxpc3RlbnMgdG8gdGhlIFNBWCBldmVudHMKLSAqIHRvIGNvbnN0cnVjdCBhIGRvY3VtZW50LiBEZXRhaWxzIHdoaWNoIFNBWCBkb2VzIG5vdCBwcm92aWRlLCBzdWNoIGFzCi0gKiB3aGl0ZXNwYWNlIG91dHNpZGUgdGhlIHJvb3QgZWxlbWVudCwgYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgSkRPTQotICogZG9jdW1lbnQuIEluZm9ybWF0aW9uIGFib3V0IFNBWCBjYW4gYmUgZm91bmQgYXQgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmciPmh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmc8L2E+LgotICogPHA+Ci0gKiBLbm93biBpc3N1ZXM6IFJlbGF0aXZlIHBhdGhzIGZvciBhIHtAbGluayBEb2NUeXBlfSBvciB7QGxpbmsgRW50aXR5UmVmfSBtYXkKLSAqIGJlIGNvbnZlcnRlZCBieSB0aGUgU0FYIHBhcnNlciBpbnRvIGFic29sdXRlIHBhdGhzLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgRGFuIFNjaGFmZmVyCi0gKiBAYXV0aG9yICBQaGlsaXAgTmVsc29uCi0gKiBAYXV0aG9yICBBbGV4IFJvc2VuCi0gKi8KLXB1YmxpYyBjbGFzcyBTQVhCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IFNBWEJ1aWxkZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IHBhcnNlciBjbGFzcyB0byB1c2UuIFRoaXMgaXMgdXNlZCB3aGVuIG5vIG90aGVyIHBhcnNlcgotICAgICAqIGlzIGdpdmVuIGFuZCBKQVhQIGlzbid0IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQVhfRFJJVkVSID0KLSAgICAgICAgIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIjsKLQotICAgIC8qKiBXaGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlOwotCi0gICAgLyoqIFdoZXRoZXIgZXhwYW5zaW9uIG9mIGVudGl0aWVzIHNob3VsZCBvY2N1ciAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBleHBhbmQgPSB0cnVlOwotCi0gICAgLyoqIEFkYXB0ZXIgY2xhc3MgdG8gdXNlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2F4RHJpdmVyQ2xhc3M7Ci0KLSAgICAvKiogRXJyb3JIYW5kbGVyIGNsYXNzIHRvIHVzZSAqLwotICAgIHByaXZhdGUgRXJyb3JIYW5kbGVyIHNheEVycm9ySGFuZGxlciA9IG51bGw7Ci0KLSAgICAvKiogRW50aXR5UmVzb2x2ZXIgY2xhc3MgdG8gdXNlICovCi0gICAgcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBzYXhFbnRpdHlSZXNvbHZlciA9IG51bGw7Ci0KLSAgICAvKiogRFRESGFuZGxlciBjbGFzcyB0byB1c2UgKi8KLSAgICBwcml2YXRlIERUREhhbmRsZXIgc2F4RFRESGFuZGxlciA9IG51bGw7Ci0KLSAgICAvKiogWE1MRmlsdGVyIGluc3RhbmNlIHRvIHVzZSAqLwotICAgIHByaXZhdGUgWE1MRmlsdGVyIHNheFhNTEZpbHRlciA9IG51bGw7Ci0KLSAgICAvKiogVGhlIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBKRE9NIG9iamVjdHMgKi8KLSAgICBwcml2YXRlIEpET01GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdEpET01GYWN0b3J5KCk7Ci0KLSAgICAvKiogV2hldGhlciB0byBpZ25vcmUgaWdub3JhYmxlIHdoaXRlc3BhY2UgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JpbmdXaGl0ZSA9IGZhbHNlOwotCi0gICAgLyoqIFVzZXItc3BlY2lmaWVkIGZlYXR1cmVzIHRvIGJlIHNldCBvbiB0aGUgU0FYIHBhcnNlciAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBmZWF0dXJlcyA9IG5ldyBIYXNoTWFwKDUpOwotCi0gICAgLyoqIFVzZXItc3BlY2lmaWVkIHByb3BlcnRpZXMgdG8gYmUgc2V0IG9uIHRoZSBTQVggcGFyc2VyICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCg1KTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgcGFyc2VyIHJldXNlIGlzIGFsbG93ZWQuCi0gICAgICogPHA+RGVmYXVsdDogPGNvZGU+dHJ1ZTwvY29kZT48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJldXNlUGFyc2VyID0gdHJ1ZTsKLQotICAgIC8qKiBUaGUgY3VycmVudCBTQVggcGFyc2VyLCBpZiBwYXJzZXIgcmV1c2UgaGFzIGJlZW4gYWN0aXZhdGVkLiAqLwotICAgIHByaXZhdGUgWE1MUmVhZGVyIHNheFBhcnNlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFNBWEJ1aWxkZXIgd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGZpcnN0IGxvY2F0ZQotICAgICAqIGEgcGFyc2VyIHZpYSBKQVhQLCB0aGVuIHdpbGwgdHJ5IHRvIHVzZSBhIHNldCBvZiBkZWZhdWx0Ci0gICAgICogU0FYIERyaXZlcnMuIFRoZSB1bmRlcmx5aW5nIHBhcnNlciB3aWxsIG5vdCB2YWxpZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYQnVpbGRlcigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTQVhCdWlsZGVyIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBmaXJzdCBsb2NhdGUKLSAgICAgKiBhIHBhcnNlciB2aWEgSkFYUCwgdGhlbiB3aWxsIHRyeSB0byB1c2UgYSBzZXQgb2YgZGVmYXVsdAotICAgICAqIFNBWCBEcml2ZXJzLiBUaGUgdW5kZXJseWluZyBwYXJzZXIgd2lsbCB2YWxpZGF0ZSBvciBub3QKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIGlmCi0gICAgICogICAgICAgICAgICAgICAgIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBTQVhCdWlsZGVyKGJvb2xlYW4gdmFsaWRhdGUpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU0FYQnVpbGRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFNBWCBwYXJzZXIuCi0gICAgICogVGhlIHVuZGVybHlpbmcgcGFyc2VyIHdpbGwgbm90IHZhbGlkYXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNheERyaXZlckNsYXNzIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiBTQVggRHJpdmVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHRvIHVzZSBmb3IgcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYQnVpbGRlcihTdHJpbmcgc2F4RHJpdmVyQ2xhc3MpIHsKLSAgICAgICAgdGhpcyhzYXhEcml2ZXJDbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU0FYQnVpbGRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFNBWCBwYXJzZXIuCi0gICAgICogVGhlIHVuZGVybHlpbmcgcGFyc2VyIHdpbGwgdmFsaWRhdGUgb3Igbm90Ci0gICAgICogYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2F4RHJpdmVyQ2xhc3MgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIFNBWCBEcml2ZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGZvciBwYXJzaW5nLgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIGlmCi0gICAgICogICAgICAgICAgICAgICAgIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgotICAgICAqLwotICAgIHB1YmxpYyBTQVhCdWlsZGVyKFN0cmluZyBzYXhEcml2ZXJDbGFzcywgYm9vbGVhbiB2YWxpZGF0ZSkgewotICAgICAgICB0aGlzLnNheERyaXZlckNsYXNzID0gc2F4RHJpdmVyQ2xhc3M7Ci0gICAgICAgIHRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkcml2ZXIgY2xhc3MgYXNzaWduZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkcml2ZXIgY2xhc3MgYXNzaWduZWQgaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNheERyaXZlckNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQge0BsaW5rIG9yZy5qZG9tLkpET01GYWN0b3J5fSBpbiB1c2UuCi0gICAgICogQHJldHVybiB0aGUgZmFjdG9yeSBpbiB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSkRPTUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzZXRzIGEgY3VzdG9tIEpET01GYWN0b3J5IGZvciB0aGUgYnVpbGRlci4gIFVzZSB0aGlzIHRvIGJ1aWxkCi0gICAgICogdGhlIHRyZWUgd2l0aCB5b3VyIG93biBzdWJjbGFzc2VzIG9mIHRoZSBKRE9NIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSA8Y29kZT5KRE9NRmFjdG9yeTwvY29kZT4gdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeShKRE9NRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHZhbGlkYXRpb24gaXMgdG8gYmUgcGVyZm9ybWVkIGR1cmluZyB0aGUgYnVpbGQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdmFsaWRhdGlvbiBpcyB0byBiZSBwZXJmb3JtZWQgZHVyaW5nIHRoZSBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgdmFsaWRhdGlvbiBmb3IgdGhlIGJ1aWxkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24KLSAgICAgKiBzaG91bGQgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbihib29sZWFuIHZhbGlkYXRlKSB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRXJyb3JIYW5kbGVyfSBhc3NpZ25lZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gdGhlIEVycm9ySGFuZGxlciBhc3NpZ25lZCwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIEVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzYXhFcnJvckhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzZXRzIGN1c3RvbSBFcnJvckhhbmRsZXIgZm9yIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgIHNheEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5UmVzb2x2ZXJ9IGFzc2lnbmVkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBFbnRpdHlSZXNvbHZlciBhc3NpZ25lZAotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIHNheEVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2V0cyBjdXN0b20gRW50aXR5UmVzb2x2ZXIgZm9yIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgewotICAgICAgICBzYXhFbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBEVERIYW5kbGVyfSBhc3NpZ25lZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgRFRESGFuZGxlciBhc3NpZ25lZAotICAgICAqLwotICAgIHB1YmxpYyBEVERIYW5kbGVyIGdldERUREhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzYXhEVERIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2V0cyBjdXN0b20gRFRESGFuZGxlciBmb3IgdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGR0ZEhhbmRsZXIgPGNvZGU+RFRESGFuZGxlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREVERIYW5kbGVyKERUREhhbmRsZXIgZHRkSGFuZGxlcikgewotICAgICAgICBzYXhEVERIYW5kbGVyID0gZHRkSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgWE1MRmlsdGVyfSB1c2VkIGR1cmluZyBwYXJzaW5nLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBYTUxGaWx0ZXIgdXNlZCBkdXJpbmcgcGFyc2luZwotICAgICAqLwotICAgIHB1YmxpYyBYTUxGaWx0ZXIgZ2V0WE1MRmlsdGVyKCkgewotICAgICAgICByZXR1cm4gc2F4WE1MRmlsdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2V0cyBhIGN1c3RvbSB7QGxpbmsgb3JnLnhtbC5zYXguWE1MRmlsdGVyfSBmb3IgdGhlIGJ1aWxkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sRmlsdGVyIHRoZSBmaWx0ZXIgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WE1MRmlsdGVyKFhNTEZpbHRlciB4bWxGaWx0ZXIpIHsKLSAgICAgICAgc2F4WE1MRmlsdGVyID0geG1sRmlsdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZSBpcyB0byBiZSBpZ25vcmVkIGR1cmluZyB0aGUKLSAgICAgKiBidWlsZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciBlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZSBpcyB0byBiZSBpZ25vcmVkIGR1cmluZyB0aGUKLSAgICAgKiBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gaWdub3JpbmdXaGl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHBhcnNlciBzaG91bGQgZWxtaW5hdGUgd2hpdGVzcGFjZSBpbgotICAgICAqIGVsZW1lbnQgY29udGVudCAoc29tZXRpbWVzIGtub3duIGFzICJpZ25vcmFibGUgd2hpdGVzcGFjZSIpIHdoZW4KLSAgICAgKiBidWlsZGluZyB0aGUgZG9jdW1lbnQuICBPbmx5IHdoaXRlc3BhY2Ugd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbgotICAgICAqIGVsZW1lbnQgY29udGVudCB0aGF0IGhhcyBhbiBlbGVtZW50IG9ubHkgY29udGVudCBtb2RlbCB3aWxsIGJlCi0gICAgICogZWxpbWluYXRlZCAoc2VlIFhNTCBSZWMgMy4yLjEpLiAgRm9yIHRoaXMgc2V0dGluZyB0byB0YWtlIGVmZmVjdAotICAgICAqIHJlcXVpcmVzIHRoYXQgdmFsaWRhdGlvbiBiZSB0dXJuZWQgb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICogc2V0dGluZyBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWdub3JpbmdXaGl0ZSBXaGV0aGVyIHRvIGlnbm9yZSBpZ25vcmFibGUgd2hpdGVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGJvb2xlYW4gaWdub3JpbmdXaGl0ZSkgewotICAgICAgICB0aGlzLmlnbm9yaW5nV2hpdGUgPSBpZ25vcmluZ1doaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29udGFpbmVkIFNBWCBwYXJzZXIgaW5zdGFuY2UgaXMgcmV1c2VkIGFjcm9zcwotICAgICAqIG11bHRpcGxlIHBhcnNlcy4gIFRoZSBkZWZhdWx0IGlzIHRydWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbnRhaW5lZCBTQVggcGFyc2VyIGluc3RhbmNlIGlzIHJldXNlZCBhY3Jvc3MKLSAgICAgKiBtdWx0aXBsZSBwYXJzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXVzZVBhcnNlcigpIHsKLSAgICAgICAgcmV0dXJuIHJldXNlUGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgYnVpbGRlciBzaGFsbCByZXVzZSB0aGUgc2FtZSBTQVggcGFyc2VyCi0gICAgICogd2hlbiBwZXJmb3JtaW5nIHN1YnNlcXVlbnQgcGFyc2VzIG9yIGFsbG9jYXRlIGEgbmV3IHBhcnNlciBmb3IKLSAgICAgKiBlYWNoIHBhcnNlLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBzZXR0aW5nIGlzCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gKHBhcnNlciByZXVzZSkuCi0gICAgICogPHA+Ci0gICAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBBcyBTQVggcGFyc2VyIGluc3RhbmNlcyBhcmUgbm90IHRocmVhZCBzYWZlLAotICAgICAqIHRoZSBwYXJzZXIgcmV1c2UgZmVhdHVyZSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBTQVhCdWlsZGVyIGluc3RhbmNlcwotICAgICAqIHNoYXJlZCBhbW9uZyB0aHJlYWRzLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXVzZVBhcnNlciBXaGV0aGVyIHRvIHJldXNlIHRoZSBTQVggcGFyc2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJldXNlUGFyc2VyKGJvb2xlYW4gcmV1c2VQYXJzZXIpIHsKLSAgICAgICAgdGhpcy5yZXVzZVBhcnNlciA9IHJldXNlUGFyc2VyOwotICAgICAgICB0aGlzLnNheFBhcnNlciAgID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNldHMgYSBmZWF0dXJlIG9uIHRoZSBTQVggcGFyc2VyLiBTZWUgdGhlIFNBWCBkb2N1bWVudGF0aW9uIGZvcgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOT1RFOiBTQVhCdWlsZGVyIHJlcXVpcmVzIHRoYXQgc29tZSBwYXJ0aWN1bGFyIGZlYXR1cmVzIG9mIHRoZSBTQVggcGFyc2VyIGJlCi0gICAgICogc2V0IHVwIGluIGNlcnRhaW4gd2F5cyBmb3IgaXQgdG8gd29yayBwcm9wZXJseS4gVGhlIGxpc3Qgb2Ygc3VjaCBmZWF0dXJlcwotICAgICAqIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gVGhlcmVmb3JlLCB0aGUgdXNlIG9mIHRoaXMgbWV0aG9kIG1heSBjYXVzZQotICAgICAqIHBhcnNpbmcgdG8gYnJlYWssIGFuZCBldmVuIGlmIGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcgdG9kYXkgaXQgbWlnaHQKLSAgICAgKiBicmVhayBwYXJzaW5nIGluIGEgZnV0dXJlIEpET00gdmVyc2lvbiwgYmVjYXVzZSB3aGF0IEpET00gcGFyc2VycyByZXF1aXJlCi0gICAgICogbWF5IGNoYW5nZSBvdmVyIHRpbWUuIFVzZSB3aXRoIGNhdXRpb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIGZlYXR1cmUgbmFtZSwgd2hpY2ggaXMgYSBmdWxseS1xdWFsaWZpZWQgVVJJLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcmVxdWVzdGVkIHN0YXRlIG9mIHRoZSBmZWF0dXJlICh0cnVlIG9yIGZhbHNlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIC8vIFNhdmUgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGZvciBsYXRlci4KLSAgICAgICAgZmVhdHVyZXMucHV0KG5hbWUsIG5ldyBCb29sZWFuKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzZXRzIGEgcHJvcGVydHkgb24gdGhlIFNBWCBwYXJzZXIuIFNlZSB0aGUgU0FYIGRvY3VtZW50YXRpb24gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBOT1RFOiBTQVhCdWlsZGVyIHJlcXVpcmVzIHRoYXQgc29tZSBwYXJ0aWN1bGFyIHByb3BlcnRpZXMgb2YgdGhlIFNBWCBwYXJzZXIgYmUKLSAgICAgKiBzZXQgdXAgaW4gY2VydGFpbiB3YXlzIGZvciBpdCB0byB3b3JrIHByb3Blcmx5LiBUaGUgbGlzdCBvZiBzdWNoIHByb3BlcnRpZXMKLSAgICAgKiBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuIFRoZXJlZm9yZSwgdGhlIHVzZSBvZiB0aGlzIG1ldGhvZCBtYXkgY2F1c2UKLSAgICAgKiBwYXJzaW5nIHRvIGJyZWFrLCBhbmQgZXZlbiBpZiBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nIHRvZGF5IGl0IG1pZ2h0Ci0gICAgICogYnJlYWsgcGFyc2luZyBpbiBhIGZ1dHVyZSBKRE9NIHZlcnNpb24sIGJlY2F1c2Ugd2hhdCBKRE9NIHBhcnNlcnMgcmVxdWlyZQotICAgICAqIG1heSBjaGFuZ2Ugb3ZlciB0aW1lLiBVc2Ugd2l0aCBjYXV0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lLCB3aGljaCBpcyBhIGZ1bGx5LXF1YWxpZmllZCBVUkkuCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSByZXF1ZXN0ZWQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIFNhdmUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBmb3IgbGF0ZXIuCi0gICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGJ1aWxkcyBhIGRvY3VtZW50IGZyb20gdGhlIHN1cHBsaWVkCi0gICAgICogaW5wdXQgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIDxjb2RlPklucHV0U291cmNlPC9jb2RlPiB0byByZWFkIGZyb20KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gSS9PIGVycm9yIHByZXZlbnRzIGEgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGZyb20gYmVpbmcgZnVsbHkgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGJ1aWxkKElucHV0U291cmNlIGluKQotICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTQVhIYW5kbGVyIGNvbnRlbnRIYW5kbGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIGNvbnRlbnQgaGFuZGxlci4KLSAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyID0gY3JlYXRlQ29udGVudEhhbmRsZXIoKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyZUNvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKLQotICAgICAgICAgICAgWE1MUmVhZGVyIHBhcnNlciA9IHRoaXMuc2F4UGFyc2VyOwotICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIHBhcnNlci4KLSAgICAgICAgICAgICAgICBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoKTsKLQotICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgb3B0aW9uYWwgZmlsdGVyCi0gICAgICAgICAgICAgICAgaWYgKHNheFhNTEZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3QgZmlsdGVyIGNoYWluIHRvIHBhcnNlcgotICAgICAgICAgICAgICAgICAgICBYTUxGaWx0ZXIgcm9vdCA9IHNheFhNTEZpbHRlcjsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJvb3QuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBYTUxGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSAoWE1MRmlsdGVyKXJvb3QuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcm9vdC5zZXRQYXJlbnQocGFyc2VyKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIGZyb20gZmlsdGVyCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IHNheFhNTEZpbHRlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb25maWd1cmUgcGFyc2VyCi0gICAgICAgICAgICAgICAgY29uZmlndXJlUGFyc2VyKHBhcnNlciwgY29udGVudEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJldXNlUGFyc2VyID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXhQYXJzZXIgPSBwYXJzZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVzZXQgY29udGVudCBoYW5kbGVyIGFzIFNBWEhhbmRsZXIgaW5zdGFuY2VzIGNhbm5vdAotICAgICAgICAgICAgICAgIC8vIGJlIHJldXNlZAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVBhcnNlcihwYXJzZXIsIGNvbnRlbnRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGRvY3VtZW50LgotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGluKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRIYW5kbGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGNvbnRlbnRIYW5kbGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jLmhhc1Jvb3RFbGVtZW50KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSBlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NUGFyc2VFeGNlcHRpb24oIkVycm9yIG9uIGxpbmUgIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpICsgIiBvZiBkb2N1bWVudCAiICsgc3lzdGVtSWQsIGUsIGRvYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NUGFyc2VFeGNlcHRpb24oIkVycm9yIG9uIGxpbmUgIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpLCBlLCBkb2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01QYXJzZUV4Y2VwdGlvbigiRXJyb3IgaW4gYnVpbGRpbmc6ICIgKwotICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBlLCBjb250ZW50SGFuZGxlci5nZXREb2N1bWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgbnVsbGlmeSB0aGUgaGFuZGxlciB0byBlbmNvdXJhZ2UgR0MKLSAgICAgICAgICAgIC8vIEl0J3MgYSBzdGFjayB2YXIgc28gdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgaXQKLSAgICAgICAgICAgIC8vIHNlZW1zIHRvIGhlbHAgb24gc29tZSBKVk1zCi0gICAgICAgICAgICBjb250ZW50SGFuZGxlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIFNBWEhhbmRsZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIERvY3VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5TQVhIYW5kbGVyPC9jb2RlPiAtIHJlc3VsdGFudCBTQVhIYW5kbGVyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU0FYSGFuZGxlciBjcmVhdGVDb250ZW50SGFuZGxlcigpIHsKLSAgICAgICAgU0FYSGFuZGxlciBjb250ZW50SGFuZGxlciA9IG5ldyBTQVhIYW5kbGVyKGZhY3RvcnkpOwotICAgICAgICByZXR1cm4gY29udGVudEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjb25maWd1cmVzIHRoZSBTQVhIYW5kbGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBEb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcGFzc2VzIHRocm91Z2ggc29tZSBjb25maWd1cmF0aW9uCi0gICAgICogc2V0dGluZ3MgdGhhdCB3ZXJlIHNldCBvbiB0aGUgU0FYQnVpbGRlcjogc2V0RXhwYW5kRW50aXRpZXMoKSBhbmQKLSAgICAgKiBzZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDb250ZW50SGFuZGxlcihTQVhIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKSB7Ci0gICAgICAgIC8vIFNldHVwIHBhc3MgdGhyb3VnaCBiZWhhdmlvcgotICAgICAgICBjb250ZW50SGFuZGxlci5zZXRFeHBhbmRFbnRpdGllcyhleHBhbmQpOwotICAgICAgICBjb250ZW50SGFuZGxlci5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZShpZ25vcmluZ1doaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNyZWF0ZXMgdGhlIFhNTFJlYWRlciB0byBiZSB1c2VkIGZvciByZWFkaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gKDEpIHVzZSB0aGUgc2F4RHJpdmVyQ2xhc3MsIGlmIGl0IGhhcyBiZWVuCi0gICAgICogc2V0LCAoMikgdHJ5IHRvIG9idGFpbiBhIHBhcnNlciBmcm9tIEpBWFAsIGlmIGl0IGlzIGF2YWlsYWJsZSwgYW5kCi0gICAgICogKDMpIGlmIGFsbCBlbHNlIGZhaWxzLCB1c2UgYSBoYXJkLWNvZGVkIGRlZmF1bHQgcGFyc2VyIChjdXJyZW50bHkKLSAgICAgKiB0aGUgWGVyY2VzIHBhcnNlcikuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRldGVybWluZQotICAgICAqIHRoZSBwYXJzZXIgdG8gdXNlIGluIGEgZGlmZmVyZW50IHdheS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlhNTFJlYWRlcjwvY29kZT4gLSByZXN1bHRhbnQgWE1MUmVhZGVyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVBhcnNlcigpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MUmVhZGVyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIGlmIChzYXhEcml2ZXJDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgdXNlciBrbm93cyB0aGF0IHRoZXkgd2FudCB0byB1c2UgYSBwYXJ0aWN1bGFyIGNsYXNzCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKHNheERyaXZlckNsYXNzKTsKLQotICAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBwYXJzZXIKLSAgICAgICAgICAgICAgICBzZXRGZWF0dXJlc0FuZFByb3BlcnRpZXMocGFyc2VyLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgIiArIHNheERyaXZlckNsYXNzLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRyeSB1c2luZyBKQVhQLi4uCi0gICAgICAgICAgICAvLyBOb3RlIHdlIG5lZWQgSkFYUCAxLjEsIGFuZCBpZiBKQVhQIDEuMCBpcyBhbGwgdGhhdCdzCi0gICAgICAgICAgICAvLyBhdmFpbGFibGUgdGhlbiB0aGUgZ2V0WE1MUmVhZGVyIGNhbGwgZmFpbHMgYW5kIHdlIHNraXAKLSAgICAgICAgICAgIC8vIHRvIHRoZSBoYXJkIGNvZGVkIGRlZmF1bHQgcGFyc2VyCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEdldCBmYWN0b3J5IGNsYXNzIGFuZCBtZXRob2QuCi0gICAgICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmpkb20uaW5wdXQuSkFYUFBhcnNlckZhY3RvcnkiKTsKLQotICAgICAgICAgICAgICAgIE1ldGhvZCBjcmVhdGVQYXJzZXIgPQotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MuZ2V0TWV0aG9kKCJjcmVhdGVQYXJzZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBib29sZWFuLmNsYXNzLCBNYXAuY2xhc3MsIE1hcC5jbGFzcyB9KTsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBTQVggcGFyc2VyLgotICAgICAgICAgICAgICAgIHBhcnNlciA9IChYTUxSZWFkZXIpY3JlYXRlUGFyc2VyLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgQm9vbGVhbih2YWxpZGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzLCBwcm9wZXJ0aWVzIH0pOwotCi0gICAgICAgICAgICAgICAgLy8gQ29uZmlndXJlIHBhcnNlcgotICAgICAgICAgICAgICAgIHNldEZlYXR1cmVzQW5kUHJvcGVydGllcyhwYXJzZXIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChKRE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2xhc3MgbG9hZGVyIGZhaWxlZCB0byByZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAvLyBvZiBvcmcuamRvbS5pbnB1dC5KQVhQUGFyc2VyRmFjdG9yeS4gVGhpcyBwcm9iYWJseSBtZWFucwotICAgICAgICAgICAgICAgIC8vIHRoYXQgbm8gSkFYUCBwYXJzZXIgaXMgcHJlc2VudCBpbiBpdHMgY2xhc3MgcGF0aC4KLSAgICAgICAgICAgICAgICAvLyA9PiBJZ25vcmUgYW5kIHRyeSBhbGxvY2F0aW5nIGRlZmF1bHQgU0FYIHBhcnNlciBpbnN0YW5jZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbmQgdHJ5IGFsbG9jYXRpbmcgZGVmYXVsdCBTQVggcGFyc2VyIGluc3RhbmNlLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhIHBhcnNlciB5ZXQsIGlmIG5vdCwgdHJ5IHRvIHVzZSBhCi0gICAgICAgIC8vIGhhcmQgY29kZWQgZGVmYXVsdAotICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoREVGQVVMVF9TQVhfRFJJVkVSKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVzaW5nIGRlZmF1bHQgIiArIERFRkFVTFRfU0FYX0RSSVZFUik7Ci0gICAgICAgICAgICAgICAgc2F4RHJpdmVyQ2xhc3MgPSBwYXJzZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb25maWd1cmUgcGFyc2VyCi0gICAgICAgICAgICAgICAgc2V0RmVhdHVyZXNBbmRQcm9wZXJ0aWVzKHBhcnNlciwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgZGVmYXVsdCBTQVggcGFyc2VyOiAiCi0gICAgICAgICAgICAgICAgICArIERFRkFVTFRfU0FYX0RSSVZFUiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uZmlndXJlcyB0aGUgWE1MUmVhZGVyIHRvIGJlIHVzZWQgZm9yIHJlYWRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXRzIHZhcmlvdXMgb3B0aW9ucyBvbiB0aGUgZ2l2ZW4gWE1MUmVhZGVyLAotICAgICAqICBzdWNoIGFzIHZhbGlkYXRpb24sIERURCByZXNvbHV0aW9uLCBlbnRpdHkgaGFuZGxlcnMsIGV0Yy4sIGFjY29yZGluZwotICAgICAqICB0byB0aGUgb3B0aW9ucyB0aGF0IHdlcmUgc2V0IChlLmcuIHZpYSA8Y29kZT5zZXRFbnRpdHlSZXNvbHZlcjwvY29kZT4pCi0gICAgICogIGFuZCBzZXQgdmFyaW91cyBTQVggcHJvcGVydGllcyBhbmQgZmVhdHVyZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIEpET00KLSAgICAgKiAgaW50ZXJuYWxzLiBUaGVzZSBmZWF0dXJlcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcywgc28gY2hhbmdlIHRoaXMKLSAgICAgKiAgYmVoYXZpb3IgYXQgeW91ciBvd24gcmlzay4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFyc2VyKFhNTFJlYWRlciBwYXJzZXIsIFNBWEhhbmRsZXIgY29udGVudEhhbmRsZXIpCi0gICAgICAgIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBTZXR1cCBTQVggaGFuZGxlcnMuCi0KLSAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKLQotICAgICAgICBpZiAoc2F4RW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKHNheEVudGl0eVJlc29sdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYXhEVERIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcnNlci5zZXREVERIYW5kbGVyKHNheERUREhhbmRsZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyc2VyLnNldERUREhhbmRsZXIoY29udGVudEhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNheEVycm9ySGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlcihzYXhFcnJvckhhbmRsZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIobmV3IEJ1aWxkZXJFcnJvckhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXR1cCBsZXhpY2FsIHJlcG9ydGluZy4KLSAgICAgICAgYm9vbGVhbiBsZXhpY2FsUmVwb3J0aW5nID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9oYW5kbGVycy9MZXhpY2FsSGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIpOwotICAgICAgICAgICAgbGV4aWNhbFJlcG9ydGluZyA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBObyBsZXhpY2FsIHJlcG9ydGluZyBhdmFpbGFibGUKLSAgICAgICAgfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBObyBsZXhpY2FsIHJlcG9ydGluZyBhdmFpbGFibGUKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNvbWUgcGFyc2VycyB1c2UgYWx0ZXJuYXRlIHByb3BlcnR5IGZvciBsZXhpY2FsIGhhbmRsaW5nIChncnIuLi4pCi0gICAgICAgIGlmICghbGV4aWNhbFJlcG9ydGluZykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbGV4aWNhbFJlcG9ydGluZyA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vIGxleGljYWwgcmVwb3J0aW5nIGF2YWlsYWJsZQotICAgICAgICAgICAgfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbGV4aWNhbCByZXBvcnRpbmcgYXZhaWxhYmxlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUcnkgc2V0dGluZyB0aGUgRGVjbEhhbmRsZXIgaWYgZW50aXR5IGV4cGFuc2lvbiBpcyBvZmYKLSAgICAgICAgaWYgKCFleHBhbmQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbGV4aWNhbCByZXBvcnRpbmcgYXZhaWxhYmxlCi0gICAgICAgICAgICB9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBsZXhpY2FsIHJlcG9ydGluZyBhdmFpbGFibGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRGZWF0dXJlc0FuZFByb3BlcnRpZXMoWE1MUmVhZGVyIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY29yZUZlYXR1cmVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCBhbnkgdXNlci1zcGVjaWZpZWQgZmVhdHVyZXMgb24gdGhlIHBhcnNlci4KLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nICBuYW1lICA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pZmVhdHVyZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaW50ZXJuYWxTZXRGZWF0dXJlKHBhcnNlciwgbmFtZSwgdmFsdWUuYm9vbGVhblZhbHVlKCksIG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IGFueSB1c2VyLXNwZWNpZmllZCBwcm9wZXJ0aWVzIG9uIHRoZSBwYXJzZXIuCi0gICAgICAgIGl0ZXIgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaW50ZXJuYWxTZXRQcm9wZXJ0eShwYXJzZXIsIG5hbWUsIHByb3BlcnRpZXMuZ2V0KG5hbWUpLCBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb3JlRmVhdHVyZXMpIHsKLSAgICAgICAgICAgIC8vIFNldCB2YWxpZGF0aW9uLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnRlcm5hbFNldEZlYXR1cmUocGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLCAiVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdmFsaWRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgdGhlIHVzZXIgaXMgcmVxdWVzdGluZwotICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgZG9uJ3QgdmFsaWRhdGUsIHRoYXQncyBmaW5lIC0gZG9uJ3QgdGhyb3cgYW4KLSAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXR1cCBzb21lIG5hbWVzcGFjZSBmZWF0dXJlcy4KLSAgICAgICAgICAgIGludGVybmFsU2V0RmVhdHVyZShwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIk5hbWVzcGFjZXMiKTsKLSAgICAgICAgICAgIGludGVybmFsU2V0RmVhdHVyZShwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAiTmFtZXNwYWNlIHByZWZpeGVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgZW50aXR5IGV4cGFuc2lvbgotICAgICAgICAvLyBOb3RlIFNBWEhhbmRsZXIgY2FuIHdvcmsgcmVnYXJkbGVzcyBvZiBob3cgdGhpcyBpcyBzZXQsIGJ1dCB3aGVuCi0gICAgICAgIC8vIGVudGl0eSBleHBhbnNpb24gaXQncyB3b3J0aCBpdCB0byB0cnkgdG8gdGVsbCB0aGUgcGFyc2VyIG5vdCB0bwotICAgICAgICAvLyBldmVuIGJvdGhlciB3aXRoIGV4dGVybmFsIGdlbmVyYWwgZW50aXRpZXMuCi0gICAgICAgIC8vIEFwcGFyZW50bHkgbm8gcGFyc2VycyB5ZXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCi0gICAgICAgIC8vIFhYWCBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIHNldEVudGl0eVJlc29sdmVyKCkgd2l0aCBhIHJlc29sdmVyCi0gICAgICAgIC8vIHRoYXQgc2ltcGx5IGlnbm9yZXMgZXh0ZXJuYWwgZ2VuZXJhbCBlbnRpdGllcwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHBhcnNlci5nZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyIpICE9IGV4cGFuZCkgewotICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyIsIGV4cGFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgeyAvKiBJZ25vcmUuLi4gKi8gfQotICAgICAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uICBlKSB7IC8qIElnbm9yZS4uLiAqLyB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gc2V0IGEgZmVhdHVyZSBvbiB0aGUgcGFyc2VyLiBJZiB0aGUgZmVhdHVyZSBjYW5ub3QgYmUgc2V0LAotICAgICAqIHRocm93cyBhIEpET01FeGNlcHRpb24gZGVzY3JpYmluZyB0aGUgcHJvYmxlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXRGZWF0dXJlKFhNTFJlYWRlciBwYXJzZXIsIFN0cmluZyBmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbHVlLCBTdHJpbmcgZGlzcGxheU5hbWUpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKGZlYXR1cmUsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lICsgIiBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQgZm9yIFNBWCBkcml2ZXIgIiArIHBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgKyAiIGZlYXR1cmUgbm90IHJlY29nbml6ZWQgZm9yIFNBWCBkcml2ZXIgIiArIHBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUcmllcyB0byBzZXQgYSBwcm9wZXJ0eSBvbiB0aGUgcGFyc2VyLiBJZiB0aGUgcHJvcGVydHkgY2Fubm90IGJlIHNldCwKLSAgICAgKiB0aHJvd3MgYSBKRE9NRXhjZXB0aW9uIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFNldFByb3BlcnR5KFhNTFJlYWRlciBwYXJzZXIsIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlLCBTdHJpbmcgZGlzcGxheU5hbWUpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgKyAiIHByb3BlcnR5IG5vdCBzdXBwb3J0ZWQgZm9yIFNBWCBkcml2ZXIgIiArIHBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgKyAiIHByb3BlcnR5IG5vdCByZWNvZ25pemVkIGZvciBTQVggZHJpdmVyICIgKyBwYXJzZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBidWlsZHMgYSBkb2N1bWVudCBmcm9tIHRoZSBzdXBwbGllZAotICAgICAqICAgaW5wdXQgc3RyZWFtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdG8gcmVhZCBmcm9tCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gcmVzdWx0YW50IERvY3VtZW50IG9iamVjdAotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ciBpbiBwYXJzaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIGFuIEkvTyBlcnJvciBwcmV2ZW50cyBhIGRvY3VtZW50Ci0gICAgICogICAgICAgICBmcm9tIGJlaW5nIGZ1bGx5IHBhcnNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgYnVpbGQoSW5wdXRTdHJlYW0gaW4pCi0gICAgIHRocm93cyBKRE9NRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBidWlsZChuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGJ1aWxkcyBhIGRvY3VtZW50IGZyb20gdGhlIHN1cHBsaWVkCi0gICAgICogICBmaWxlbmFtZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSA8Y29kZT5GaWxlPC9jb2RlPiB0byByZWFkIGZyb20KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gSS9PIGVycm9yIHByZXZlbnRzIGEgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGZyb20gYmVpbmcgZnVsbHkgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGJ1aWxkKEZpbGUgZmlsZSkKLSAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBmaWxlVG9VUkwoZmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGQodXJsKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJFcnJvciBpbiBidWlsZGluZyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBidWlsZHMgYSBkb2N1bWVudCBmcm9tIHRoZSBzdXBwbGllZAotICAgICAqICAgVVJMLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgPGNvZGU+VVJMPC9jb2RlPiB0byByZWFkIGZyb20uCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gLSByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ciBpbiBwYXJzaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIGFuIEkvTyBlcnJvciBwcmV2ZW50cyBhIGRvY3VtZW50Ci0gICAgICogICAgICAgICBmcm9tIGJlaW5nIGZ1bGx5IHBhcnNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgYnVpbGQoVVJMIHVybCkKLSAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN5c3RlbUlEID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIHJldHVybiBidWlsZChuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSUQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGJ1aWxkcyBhIGRvY3VtZW50IGZyb20gdGhlIHN1cHBsaWVkCi0gICAgICogICBpbnB1dCBzdHJlYW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGluIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0byByZWFkIGZyb20uCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIGJhc2UgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUklzCi0gICAgICogQHJldHVybiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gcmVzdWx0YW50IERvY3VtZW50IG9iamVjdAotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB3aGVuIGVycm9ycyBvY2N1ciBpbiBwYXJzaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIGFuIEkvTyBlcnJvciBwcmV2ZW50cyBhIGRvY3VtZW50Ci0gICAgICogICAgICAgICBmcm9tIGJlaW5nIGZ1bGx5IHBhcnNlZAotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBidWlsZChJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIElucHV0U291cmNlIHNyYyA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0gICAgICAgIHNyYy5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0gICAgICAgIHJldHVybiBidWlsZChzcmMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYnVpbGRzIGEgZG9jdW1lbnQgZnJvbSB0aGUgc3VwcGxpZWQKLSAgICAgKiAgIFJlYWRlci4gIEl0J3MgdGhlIHByb2dyYW1tZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUKLSAgICAgKiAgIHRoZSByZWFkZXIgbWF0Y2hlcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUuICBJdCdzIG9mdGVuIGVhc2llcgotICAgICAqICAgYW5kIHNhZmVyIHRvIHVzZSBhbiBJbnB1dFN0cmVhbSByYXRoZXIgdGhhbiBhIFJlYWRlciwgYW5kIHRvIGxldCB0aGUKLSAgICAgKiAgIHBhcnNlciBhdXRvLWRldGVjdCB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgWE1MIGRlY2xhcmF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFyYWN0ZXJTdHJlYW0gPGNvZGU+UmVhZGVyPC9jb2RlPiB0byByZWFkIGZyb20KLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gSS9PIGVycm9yIHByZXZlbnRzIGEgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGZyb20gYmVpbmcgZnVsbHkgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGJ1aWxkKFJlYWRlciBjaGFyYWN0ZXJTdHJlYW0pCi0gICAgICAgIHRocm93cyBKRE9NRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBidWlsZChuZXcgSW5wdXRTb3VyY2UoY2hhcmFjdGVyU3RyZWFtKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBidWlsZHMgYSBkb2N1bWVudCBmcm9tIHRoZSBzdXBwbGllZAotICAgICAqICAgUmVhZGVyLiAgSXQncyB0aGUgcHJvZ3JhbW1lcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZQotICAgICAqICAgdGhlIHJlYWRlciBtYXRjaGVzIHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZS4gIEl0J3Mgb2Z0ZW4gZWFzaWVyCi0gICAgICogICBhbmQgc2FmZXIgdG8gdXNlIGFuIElucHV0U3RyZWFtIHJhdGhlciB0aGFuIGEgUmVhZGVyLCBhbmQgdG8gbGV0IHRoZQotICAgICAqICAgcGFyc2VyIGF1dG8tZGV0ZWN0IHRoZSBlbmNvZGluZyBmcm9tIHRoZSBYTUwgZGVjbGFyYXRpb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNoYXJhY3RlclN0cmVhbSA8Y29kZT5SZWFkZXI8L2NvZGU+IHRvIHJlYWQgZnJvbS4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgYmFzZSBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSSXMKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gSS9PIGVycm9yIHByZXZlbnRzIGEgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGZyb20gYmVpbmcgZnVsbHkgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGJ1aWxkKFJlYWRlciBjaGFyYWN0ZXJTdHJlYW0sIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBJbnB1dFNvdXJjZSBzcmMgPSBuZXcgSW5wdXRTb3VyY2UoY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgICAgc3JjLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkKHNyYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBidWlsZHMgYSBkb2N1bWVudCBmcm9tIHRoZSBzdXBwbGllZAotICAgICAqICAgVVJJLgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVVJJIGZvciB0aGUgaW5wdXQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiByZXN1bHRhbnQgRG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIHdoZW4gZXJyb3JzIG9jY3VyIGluIHBhcnNpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gYW4gSS9PIGVycm9yIHByZXZlbnRzIGEgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIGZyb20gYmVpbmcgZnVsbHkgcGFyc2VkCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGJ1aWxkKFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkKG5ldyBJbnB1dFNvdXJjZShzeXN0ZW1JZCkpOwotICAgIH0KLQotLy8gICAgLyoqCi0vLyAgICAgKiBJbWl0YXRpb24gb2YgRmlsZS50b1VSTCgpLCBhIEpESyAxLjIgbWV0aG9kLCByZWltcGxlbWVudGVkCi0vLyAgICAgKiBoZXJlIHRvIHdvcmsgd2l0aCBKREsgMS4xLgotLy8gICAgICoKLS8vICAgICAqIEBzZWUgamF2YS5pby5GaWxlCi0vLyAgICAgKgotLy8gICAgICogQHBhcmFtIGYgdGhlIGZpbGUgdG8gY29udmVydAotLy8gICAgICogQHJldHVybiB0aGUgZmlsZSBwYXRoIGNvbnZlcnRlZCB0byBhIGZpbGU6IFVSTAotLy8gICAgICovCi0vLyAgICBwcm90ZWN0ZWQgVVJMIGZpbGVUb1VSTChGaWxlIGYpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotLy8gICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotLy8gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotLy8gICAgICAgICAgICBwYXRoID0gIi8iICsgcGF0aDsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIvIikgJiYgZi5pc0RpcmVjdG9yeSgpKSB7Ci0vLyAgICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iOwotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCBwYXRoKTsKLS8vICAgIH0KLQotICAgIC8qKiBDdXN0b20gRmlsZS50b1VybCgpIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBzcGVjaWFsIGNoYXJzIGluIGZpbGUgbmFtZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgb2JqZWN0IHdob3NlIHBhdGggd2lsbCBiZSBjb252ZXJ0ZWQKLSAgICAgKiBAcmV0dXJuIFVSTCBmb3JtIG9mIHRoZSBmaWxlLCB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyBoYW5kbGVkCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlcmUncyBhIHByb2JsZW0gY29uc3RydWN0aW5nIGEgVVJMCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMIGZpbGVUb1VSTChGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBub24tVVJMIHN0eWxlIGZpbGUgc2VwYXJhdG9ycwotICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgc3RhcnRzIGF0IHJvb3QKLSAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29weSwgY29udmVydGluZyBVUkwgc3BlY2lhbCBjaGFyYWN0ZXJzIGFzIHdlIGdvCi0gICAgICAgIGludCBsZW4gPSBwYXRoLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBwYXRoLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICcgJykKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIlMjAiKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyMnKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiUyMyIpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnJScpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiJTI1Iik7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09ICcmJykKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIlMjYiKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJzsnKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiUzQiIpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnPCcpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiJTNDIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09ICc9JykKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIlM0QiKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJz4nKQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiUzRSIpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnPycpCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiJTNGIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09ICd+JykKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIlN0UiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGRpcmVjdG9yaWVzIGVuZCB3aXRoIHNsYXNoCi0gICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIFVSTAotICAgICAgICByZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBlbnRpdGllcyBhcmUgYmVpbmcgZXhwYW5kZWQgaW50byBub3JtYWwgdGV4dAotICAgICAqIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZW50aXRpZXMgYXJlIGJlaW5nIGV4cGFuZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBleHBhbmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBzZXRzIHdoZXRoZXIgb3Igbm90IHRvIGV4cGFuZCBlbnRpdGllcyBmb3IgdGhlIGJ1aWxkZXIuCi0gICAgICogQSB0cnVlIG1lYW5zIHRvIGV4cGFuZCBlbnRpdGllcyBhcyBub3JtYWwgY29udGVudC4gIEEgZmFsc2UgbWVhbnMgdG8KLSAgICAgKiBsZWF2ZSBlbnRpdGllcyB1bmV4cGFuZGVkIGFzIDxjb2RlPkVudGl0eVJlZjwvY29kZT4gb2JqZWN0cy4gIFRoZQotICAgICAqIGRlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIHNldHRpbmcgaXMgZmFsc2UsIHRoZSBpbnRlcm5hbCBEVEQgc3Vic2V0IGlzIHJldGFpbmVkOyB3aGVuCi0gICAgICogdGhpcyBzZXR0aW5nIGlzIHRydWUsIHRoZSBpbnRlcm5hbCBEVEQgc3Vic2V0IGlzIG5vdCByZXRhaW5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IFhlcmNlcyAoYXQgbGVhc3QgdXAgdG8gMS40LjQpIGhhcyBhIGJ1ZyB3aGVyZSBlbnRpdGllcwotICAgICAqIGluIGF0dHJpYnV0ZSB2YWx1ZXMgd2lsbCBiZSBtaXNyZXBvcnRlZCBpZiB0aGlzIGZsYWcgaXMgdHVybmVkIG9mZiwKLSAgICAgKiByZXN1bHRpbmcgaW4gZW50aXRpZXMgdG8gYXBwZWFyIHdpdGhpbiBlbGVtZW50IGNvbnRlbnQuICBXaGVuIHR1cm5pbmcKLSAgICAgKiBlbnRpdHkgZXhwYW5zaW9uIG9mZiBlaXRoZXIgYXZvaWQgZW50aXRpZXMgaW4gYXR0cmlidXRlIHZhbHVlcywgb3IKLSAgICAgKiB1c2UgYW5vdGhlciBwYXJzZXIgbGlrZSBDcmltc29uLgotICAgICAqIGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjExMQotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHBhbmQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIGVudGl0eSBleHBhbnNpb24KLSAgICAgKiBzaG91bGQgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXRpZXMoYm9vbGVhbiBleHBhbmQpIHsKLSAgICAgICAgdGhpcy5leHBhbmQgPSBleHBhbmQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9TQVhIYW5kbGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L1NBWEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxNGM3Mi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L1NBWEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MCArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IFNBWEhhbmRsZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uaW5wdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5qZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogQSBzdXBwb3J0IGNsYXNzIGZvciB7QGxpbmsgU0FYQnVpbGRlcn0uCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKiBAYXV0aG9yICBQaGlsaXAgTmVsc29uCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEBhdXRob3IgIHBoaWxAdHJpbG9nZ3JvdXAuY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBTQVhIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBMZXhpY2FsSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVERIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IFNBWEhhbmRsZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKiogSGFzaCB0YWJsZSB0byBtYXAgU0FYIGF0dHJpYnV0ZSB0eXBlIG5hbWVzIHRvIEpET00gYXR0cmlidXRlIHR5cGVzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBhdHRyTmFtZVRvVHlwZU1hcCA9IG5ldyBIYXNoTWFwKDEzKTsKLQotICAgIC8qKiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IGJlaW5nIGJ1aWx0ICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLQotICAgIC8qKiA8Y29kZT5FbGVtZW50PC9jb2RlPiBvYmplY3QgYmVpbmcgYnVpbHQgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEVsZW1lbnQ7Ci0KLSAgICAvKiogSW5kaWNhdG9yIG9mIHdoZXJlIGluIHRoZSBkb2N1bWVudCB3ZSBhcmUgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYXRSb290OwotCi0gICAgLyoqIEluZGljYXRvciBvZiB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgRG9jVHlwZS4gTm90ZSB0aGF0IHRoZSBEVEQgY29uc2lzdHMKLSAgICAgKiBvZiBib3RoIHRoZSBpbnRlcm5hbCBzdWJzZXQgKGluc2lkZSB0aGUgPCFET0NUWVBFPiB0YWcpIGFuZCB0aGUKLSAgICAgICogZXh0ZXJuYWwgc3Vic2V0IChpbiBhIHNlcGFyYXRlIC5kdGQgZmlsZSkuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluRFREID0gZmFsc2U7Ci0KLSAgICAvKiogSW5kaWNhdG9yIG9mIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBpbnRlcm5hbCBzdWJzZXQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5JbnRlcm5hbFN1YnNldCA9IGZhbHNlOwotCi0gICAgLyoqIEluZGljYXRvciBvZiB3aGV0aGVyIHdlIHByZXZpb3VzbHkgd2VyZSBpbiBhIENEQVRBICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHByZXZpb3VzQ0RBVEEgPSBmYWxzZTsKLQotICAgIC8qKiBJbmRpY2F0b3Igb2Ygd2hldGhlciB3ZSBhcmUgaW4gYSBDREFUQSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbkNEQVRBID0gZmFsc2U7Ci0KLSAgICAvKiogSW5kaWNhdG9yIG9mIHdoZXRoZXIgd2Ugc2hvdWxkIGV4cGFuZCBlbnRpdGllcyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBleHBhbmQgPSB0cnVlOwotCi0gICAgLyoqIEluZGljYXRvciBvZiB3aGV0aGVyIHdlIGFyZSBhY3RpdmVseSBzdXBwcmVzc2luZyAobm9uLWV4cGFuZGluZykgYQotICAgICAgICBjdXJyZW50IGVudGl0eSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzcyA9IGZhbHNlOwotCi0gICAgLyoqIEhvdyBtYW55IG5lc3RlZCBlbnRpdGllcyB3ZSdyZSBjdXJyZW50bHkgd2l0aGluICovCi0gICAgcHJpdmF0ZSBpbnQgZW50aXR5RGVwdGggPSAwOyAgLy8gWFhYIG1heSBub3QgYmUgbmVjZXNzYXJ5IGFueW1vcmU/Ci0KLSAgICAvKiogVGVtcG9yYXJ5IGhvbGRlciBmb3IgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYmVlbiBkZWNsYXJlZCB3aXRoCi0gICAgICAqIHN0YXJ0UHJlZml4TWFwcGluZywgYnV0IGFyZSBub3QgeWV0IGF2YWlsYWJsZSBvbiB0aGUgZWxlbWVudCAqLwotICAgIHByaXZhdGUgTGlzdCBkZWNsYXJlZE5hbWVzcGFjZXM7Ci0KLSAgICAvKiogVGVtcG9yYXJ5IGhvbGRlciBmb3IgdGhlIGludGVybmFsIHN1YnNldCAqLwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGludGVybmFsU3Vic2V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgLyoqIFRlbXBvcmFyeSBob2xkZXIgZm9yIFRleHQgYW5kIENEQVRBICovCi0gICAgcHJpdmF0ZSBUZXh0QnVmZmVyIHRleHRCdWZmZXIgPSBuZXcgVGV4dEJ1ZmZlcigpOwotCi0gICAgLyoqIFRoZSBleHRlcm5hbCBlbnRpdGllcyBkZWZpbmVkIGluIHRoaXMgZG9jdW1lbnQgKi8KLSAgICBwcml2YXRlIE1hcCBleHRlcm5hbEVudGl0aWVzOwotCi0gICAgLyoqIFRoZSBKRE9NRmFjdG9yeSB1c2VkIGZvciBKRE9NIG9iamVjdCBjcmVhdGlvbiAqLwotICAgIHByaXZhdGUgSkRPTUZhY3RvcnkgZmFjdG9yeTsKLQotICAgIC8qKiBXaGV0aGVyIHRvIGlnbm9yZSBpZ25vcmFibGUgd2hpdGVzcGFjZSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmluZ1doaXRlID0gZmFsc2U7Ci0KLSAgICAvKiogVGhlIFNBWCBMb2NhdG9yIG9iamVjdCBwcm92aWRlZCBieSB0aGUgcGFyc2VyICovCi0gICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyBpbml0aWFsaXplcjogUG9wdWxhdGUgYSB0YWJsZSB0byB0cmFuc2xhdGUgU0FYIGF0dHJpYnV0ZQotICAgICAqIHR5cGUgbmFtZXMgaW50byBKRE9NIGF0dHJpYnV0ZSB0eXBlIHZhbHVlIChpbnRlZ2VyKS4KLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5Ob3RlIHRoYXQgYWxsIHRoZSBtYXBwaW5ncyBkZWZpbmVkIGJlbG93IGFyZSBjb21wbGlhbnQgd2l0aAotICAgICAqIHRoZSBTQVggMi4wIHNwZWNpZmljYXRpb24gZXhjZXB0aW9uIGZvciAiRU5VTUVSQVRJT04iIHdpdGggaXMKLSAgICAgKiBzcGVjaWZpYyB0byBDcmltc29uIDEuMS5YIGFuZCBYZXJjZXMgMi4wLjAtYmV0YVggd2hpY2ggcmVwb3J0Ci0gICAgICogYXR0cmlidXRlcyBvZiBlbnVtZXJhdGVkIHR5cGVzIHdpdGggYSB0eXBlICJFTlVNRVJBVElPTiIKLSAgICAgKiBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCAiTk1UT0tFTiIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgYWxzbyB0aGF0IFhlcmNlcyAxLjQuWCBpcyBub3QgU0FYIDIuMCBjb21wbGlhbnQgZWl0aGVyCi0gICAgICogYnV0IGhhbmRsaW5nIGl0cyBjYXNlIHJlcXVpcmVzCi0gICAgICoge0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlIHNwZWNpZmljIGNvZGV9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBzdGF0aWMgewotICAgICAgICBhdHRyTmFtZVRvVHlwZU1hcC5wdXQoIkNEQVRBIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEF0dHJpYnV0ZS5DREFUQV9UWVBFKSk7Ci0gICAgICAgIGF0dHJOYW1lVG9UeXBlTWFwLnB1dCgiSUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXR0cmlidXRlLklEX1RZUEUpKTsKLSAgICAgICAgYXR0ck5hbWVUb1R5cGVNYXAucHV0KCJJRFJFRiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBdHRyaWJ1dGUuSURSRUZfVFlQRSkpOwotICAgICAgICBhdHRyTmFtZVRvVHlwZU1hcC5wdXQoIklEUkVGUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBdHRyaWJ1dGUuSURSRUZTX1RZUEUpKTsKLSAgICAgICAgYXR0ck5hbWVUb1R5cGVNYXAucHV0KCJFTlRJVFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXR0cmlidXRlLkVOVElUWV9UWVBFKSk7Ci0gICAgICAgIGF0dHJOYW1lVG9UeXBlTWFwLnB1dCgiRU5USVRJRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXR0cmlidXRlLkVOVElUSUVTX1RZUEUpKTsKLSAgICAgICAgYXR0ck5hbWVUb1R5cGVNYXAucHV0KCJOTVRPS0VOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEF0dHJpYnV0ZS5OTVRPS0VOX1RZUEUpKTsKLSAgICAgICAgYXR0ck5hbWVUb1R5cGVNYXAucHV0KCJOTVRPS0VOUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBdHRyaWJ1dGUuTk1UT0tFTlNfVFlQRSkpOwotICAgICAgICBhdHRyTmFtZVRvVHlwZU1hcC5wdXQoIk5PVEFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEF0dHJpYnV0ZS5OT1RBVElPTl9UWVBFKSk7Ci0gICAgICAgIGF0dHJOYW1lVG9UeXBlTWFwLnB1dCgiRU5VTUVSQVRJT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXR0cmlidXRlLkVOVU1FUkFURURfVFlQRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+U0FYSGFuZGxlcjwvY29kZT4gdGhhdCBsaXN0ZW5zIHRvIFNBWAotICAgICAqIGV2ZW50cyBhbmQgY3JlYXRlcyBhIEpET00gRG9jdW1lbnQuICBUaGUgb2JqZWN0cyB3aWxsIGJlIGNvbnN0cnVjdGVkCi0gICAgICogdXNpbmcgdGhlIGRlZmF1bHQgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYSGFuZGxlcigpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPlNBWEhhbmRsZXI8L2NvZGU+IHRoYXQgbGlzdGVucyB0byBTQVgKLSAgICAgKiBldmVudHMgYW5kIGNyZWF0ZXMgYSBKRE9NIERvY3VtZW50LiAgVGhlIG9iamVjdHMgd2lsbCBiZSBjb25zdHJ1Y3RlZAotICAgICAqIHVzaW5nIHRoZSBwcm92aWRlZCBmYWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgPGNvZGU+SkRPTUZhY3Rvcnk8L2NvZGU+IHRvIGJlIHVzZWQgZm9yIGNvbnN0cnVjdGluZwotICAgICAqIG9iamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYSGFuZGxlcihKRE9NRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgRGVmYXVsdEpET01GYWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdFJvb3QgPSB0cnVlOwotICAgICAgICBkZWNsYXJlZE5hbWVzcGFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGV4dGVybmFsRW50aXRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGRvY3VtZW50ID0gdGhpcy5mYWN0b3J5LmRvY3VtZW50KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2hlcyBhbiBlbGVtZW50IG9udG8gdGhlIHRyZWUgdW5kZXIgY29uc3RydWN0aW9uLiAgQWxsb3dzIHN1YmNsYXNzZXMKLSAgICAgKiB0byBwdXQgY29udGVudCB1bmRlciBhIGR1bW15IHJvb3QgZWxlbWVudCB3aGljaCBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nCi0gICAgICogY29udGVudCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIG5vbi13ZWxsIGZvcm1lZCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHJvb3QgZWxlbWVudCB1bmRlciB3aGljaCBjb250ZW50IHdpbGwgYmUgYnVpbHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGF0Um9vdCkgewotICAgICAgICAgICAgZG9jdW1lbnQuc2V0Um9vdEVsZW1lbnQoZWxlbWVudCk7ICAvLyBYWFggc2hvdWxkIHdlIHVzZSBhIGZhY3RvcnkgY2FsbD8KLSAgICAgICAgICAgIGF0Um9vdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmFjdG9yeS5hZGRDb250ZW50KGN1cnJlbnRFbGVtZW50LCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQuICBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHBhcnNpbmcgaXMgY29tcGxldGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkRvY3VtZW50PC9jb2RlPiAtIERvY3VtZW50IHRoYXQgd2FzIGJ1aWx0Ci0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB1c2VkIGZvciBjb25zdHJ1Y3Rpbmcgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+SkRPTUZhY3Rvcnk8L2NvZGU+IC0gdGhlIGZhY3RvcnkgdXNlZCBmb3IKLSAgICAgKiBjb25zdHJ1Y3Rpbmcgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBzZWUgI1NBWEhhbmRsZXIob3JnLmpkb20uSkRPTUZhY3RvcnkpCi0gICAgICovCi0gICAgcHVibGljIEpET01GYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2V0cyB3aGV0aGVyIG9yIG5vdCB0byBleHBhbmQgZW50aXRpZXMgZHVyaW5nIHRoZSBidWlsZC4KLSAgICAgKiBBIHRydWUgbWVhbnMgdG8gZXhwYW5kIGVudGl0aWVzIGFzIG5vcm1hbCBjb250ZW50LiAgQSBmYWxzZSBtZWFucyB0bwotICAgICAqIGxlYXZlIGVudGl0aWVzIHVuZXhwYW5kZWQgYXMgPGNvZGU+RW50aXR5UmVmPC9jb2RlPiBvYmplY3RzLiAgVGhlCi0gICAgICogZGVmYXVsdCBpcyB0cnVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGFuZCA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgZW50aXR5IGV4cGFuc2lvbgotICAgICAqIHNob3VsZCBvY2N1ci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdGllcyhib29sZWFuIGV4cGFuZCkgewotICAgICAgICB0aGlzLmV4cGFuZCA9IGV4cGFuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGVudGl0aWVzIHdpbGwgYmUgZXhwYW5kZWQgZHVyaW5nIHRoZQotICAgICAqIGJ1aWxkLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiAtIHdoZXRoZXIgZW50aXR5IGV4cGFuc2lvbgotICAgICAqIHdpbGwgb2NjdXIgZHVyaW5nIGJ1aWxkLgotICAgICAqCi0gICAgICogQHNlZSAjc2V0RXhwYW5kRW50aXRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIGV4cGFuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHBhcnNlciBzaG91bGQgZWxtaW5hdGUgd2hpdGVzcGFjZSBpbgotICAgICAqIGVsZW1lbnQgY29udGVudCAoc29tZXRpbWVzIGtub3duIGFzICJpZ25vcmFibGUgd2hpdGVzcGFjZSIpIHdoZW4KLSAgICAgKiBidWlsZGluZyB0aGUgZG9jdW1lbnQuICBPbmx5IHdoaXRlc3BhY2Ugd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbgotICAgICAqIGVsZW1lbnQgY29udGVudCB0aGF0IGhhcyBhbiBlbGVtZW50IG9ubHkgY29udGVudCBtb2RlbCB3aWxsIGJlCi0gICAgICogZWxpbWluYXRlZCAoc2VlIFhNTCBSZWMgMy4yLjEpLiAgRm9yIHRoaXMgc2V0dGluZyB0byB0YWtlIGVmZmVjdAotICAgICAqIHJlcXVpcmVzIHRoYXQgdmFsaWRhdGlvbiBiZSB0dXJuZWQgb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICogc2V0dGluZyBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWdub3JpbmdXaGl0ZSBXaGV0aGVyIHRvIGlnbm9yZSBpZ25vcmFibGUgd2hpdGVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKGJvb2xlYW4gaWdub3JpbmdXaGl0ZSkgewotICAgICAgICB0aGlzLmlnbm9yaW5nV2hpdGUgPSBpZ25vcmluZ1doaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHBhcnNlciB3aWxsIGVsbWluYXRlIHdoaXRlc3BhY2UgaW4KLSAgICAgKiBlbGVtZW50IGNvbnRlbnQgKHNvbWV0aW1lcyBrbm93biBhcyAiaWdub3JhYmxlIHdoaXRlc3BhY2UiKSB3aGVuCi0gICAgICogYnVpbGRpbmcgdGhlIGRvY3VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiAtIHdoZXRoZXIgaWdub3JhYmxlIHdoaXRlc3BhY2Ugd2lsbAotICAgICAqIGJlIGlnbm9yZWQgZHVyaW5nIGJ1aWxkLgotICAgICAqCi0gICAgICogQHNlZSAjc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGlnbm9yaW5nV2hpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHsKLSAgICAgICAgaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9jdW1lbnQuc2V0QmFzZVVSSShsb2NhdG9yLmdldFN5c3RlbUlkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYW4gZXh0ZXJuYWwgZW50aXR5Ci0gICAgICogZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBlbnRpdHkgbmFtZQotICAgICAqIEBwYXJhbSBwdWJsaWNJRCBwdWJsaWMgaWQKLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgc3lzdGVtIGlkCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gd2hlbiB0aGluZ3MgZ28gd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3RvcmUgdGhlIHB1YmxpYyBhbmQgc3lzdGVtIGlkcyBmb3IgdGhlIG5hbWUKLSAgICAgICAgZXh0ZXJuYWxFbnRpdGllcy5wdXQobmFtZSwgbmV3IFN0cmluZ1tde3B1YmxpY0lELCBzeXN0ZW1JRH0pOwotCi0gICAgICAgIGlmICghaW5JbnRlcm5hbFN1YnNldCkgcmV0dXJuOwotCi0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiICA8IUVOVElUWSAiKQotICAgICAgICAgICAgICAuYXBwZW5kKG5hbWUpOwotICAgICAgICBhcHBlbmRFeHRlcm5hbElkKHB1YmxpY0lELCBzeXN0ZW1JRCk7Ci0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiPlxuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBoYW5kbGVzIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBpbiB0aGUgaW50ZXJuYWwgc3Vic2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVOYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gZWxlbWVudCBuYW1lIG9mIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSBhTmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGF0dHJpYnV0ZSBuYW1lCi0gICAgICogQHBhcmFtIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBhdHRyaWJ1dGUgdHlwZQotICAgICAqIEBwYXJhbSB2YWx1ZURlZmF1bHQgPGNvZGU+U3RyaW5nPC9jb2RlPiBkZWZhdWx0IHZhbHVlIG9mIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIG9mIGF0dHJpYnV0ZQotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghaW5JbnRlcm5hbFN1YnNldCkgcmV0dXJuOwotCi0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiICA8IUFUVExJU1QgIikKLSAgICAgICAgICAgICAgLmFwcGVuZChlTmFtZSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgnICcpCi0gICAgICAgICAgICAgIC5hcHBlbmQoYU5hbWUpCi0gICAgICAgICAgICAgIC5hcHBlbmQoJyAnKQotICAgICAgICAgICAgICAuYXBwZW5kKHR5cGUpCi0gICAgICAgICAgICAgIC5hcHBlbmQoJyAnKTsKLSAgICAgICAgaWYgKHZhbHVlRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCh2YWx1ZURlZmF1bHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50ZXJuYWxTdWJzZXQuYXBwZW5kKCdcIicpCi0gICAgICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlKQotICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnXCInKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHZhbHVlRGVmYXVsdCAhPSBudWxsKSAmJiAodmFsdWVEZWZhdWx0LmVxdWFscygiI0ZJWEVEIikpKSB7Ci0gICAgICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIiBcIiIpCi0gICAgICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlKQotICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnXCInKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIj5cbiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIGluIGEgRFRELgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gbW9kZWwgPGNvZGU+U3RyaW5nPC9jb2RlPiBtb2RlbCBvZiB0aGUgZWxlbWVudCBpbiBEVEQgc3ludGF4Ci0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2tpcCBlbGVtZW50cyB0aGF0IGNvbWUgZnJvbSB0aGUgZXh0ZXJuYWwgc3Vic2V0Ci0gICAgICAgIGlmICghaW5JbnRlcm5hbFN1YnNldCkgcmV0dXJuOwotCi0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiICA8IUVMRU1FTlQgIikKLSAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKQotICAgICAgICAgICAgICAuYXBwZW5kKCcgJykKLSAgICAgICAgICAgICAgLmFwcGVuZChtb2RlbCkKLSAgICAgICAgICAgICAgLmFwcGVuZCgiPlxuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGFuIGludGVybmFsIGVudGl0eSBkZWNsYXJhdGlvbiBpbiBhIERURC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gbmFtZSBvZiBlbnRpdHkKLSAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gU2tpcCBlbnRpdGllcyB0aGF0IGNvbWUgZnJvbSB0aGUgZXh0ZXJuYWwgc3Vic2V0Ci0gICAgICAgIGlmICghaW5JbnRlcm5hbFN1YnNldCkgcmV0dXJuOwotCi0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiICA8IUVOVElUWSAiKTsKLSAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7Ci0gICAgICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiJSAiKS5hcHBlbmQobmFtZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWxTdWJzZXQuYXBwZW5kKCIgXCIiKQotICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlKQotICAgICAgICAgICAgICAuYXBwZW5kKCJcIj5cbiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBpbmRpY2F0ZSB0aGF0IGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBoYXMgYmVlbiBlbmNvdW50ZXJlZC4KLSAgICAgKiAoVGhlIFhNTCBkZWNsYXJhdGlvbiBpcyBub3QgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGFuZCB3aWxsIG5vdAotICAgICAqIGJlIHJlcG9ydGVkLikKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0YXJnZXQgb2YgUEkKLSAgICAgKiBAcGFyYW0gZGF0YSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgYWxsIGRhdGEgc2VudCB0byB0aGUgUEkuCi0gICAgICogICAgICAgICAgICAgVGhpcyB0eXBpY2FsbHkgbG9va3MgbGlrZSBvbmUgb3IgbW9yZSBhdHRyaWJ1dGUgdmFsdWUKLSAgICAgKiAgICAgICAgICAgICBwYWlycy4KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiB3aGVuIHRoaW5ncyBnbyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHN1cHByZXNzKSByZXR1cm47Ci0KLSAgICAgICAgZmx1c2hDaGFyYWN0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKGF0Um9vdCkgewotICAgICAgICAgICAgZmFjdG9yeS5hZGRDb250ZW50KGRvY3VtZW50LCBmYWN0b3J5LnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChnZXRDdXJyZW50RWxlbWVudCgpLAotICAgICAgICAgICAgICAgIGZhY3RvcnkucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbiB1bnJlc29sdmFibGUgZW50aXR5IHJlZmVyZW5jZSBoYXMgYmVlbgotICAgICAqIGVuY291bnRlcmVkLCBub3JtYWxseSBiZWNhdXNlIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGhhcyBub3QgYmVlbgotICAgICAqIHJlYWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZW50aXR5Ci0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gd2hlbiB0aGluZ3MgZ28gd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBXZSBkb24ndCBoYW5kbGUgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2VzLgotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHJldHVybjsKLQotICAgICAgICBmbHVzaENoYXJhY3RlcnMoKTsKLQotICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZ2V0Q3VycmVudEVsZW1lbnQoKSwgZmFjdG9yeS5lbnRpdHlSZWYobmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBhZGQgdGhlIHByZWZpeCBtYXBwaW5nIHRvIHRoZSBKRE9NCi0gICAgICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lc3BhY2UgcHJlZml4LgotICAgICAqIEBwYXJhbSB1cmkgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lc3BhY2UgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc3VwcHJlc3MpIHJldHVybjsKLQotICAgICAgICBOYW1lc3BhY2UgbnMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLSAgICAgICAgZGVjbGFyZWROYW1lc3BhY2VzLmFkZChucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXBvcnRzIHRoZSBvY2N1cnJlbmNlIG9mIGFuIGFjdHVhbCBlbGVtZW50LiAgSXQgd2lsbCBpbmNsdWRlCi0gICAgICogdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgWE1MIHZvY2FidWxhcnkKLSAgICAgKiBzcGVjaWZpYyBhdHRyaWJ1dGVzLCBzdWNoIGFzCi0gICAgICogPGNvZGU+eG1sbnM6W25hbWVzcGFjZSBwcmVmaXhdPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT54c2k6c2NoZW1hTG9jYXRpb248L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWVzcGFjZSBVUkkgdGhpcyBlbGVtZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGFuIGVtcHR5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICogQHBhcmFtIGxvY2FsTmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudCAod2l0aCBubwotICAgICAqICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHByZWZpeCwgaWYgb25lIGlzIHByZXNlbnQpCi0gICAgICogQHBhcmFtIHFOYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gWE1MIDEuMCB2ZXJzaW9uIG9mIGVsZW1lbnQgbmFtZToKLSAgICAgKiAgICAgICAgICAgICAgICBbbmFtZXNwYWNlIHByZWZpeF06W2xvY2FsTmFtZV0KLSAgICAgKiBAcGFyYW0gYXR0cyA8Y29kZT5BdHRyaWJ1dGVzPC9jb2RlPiBsaXN0IGZvciB0aGlzIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiB3aGVuIHRoaW5ncyBnbyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdXBwcmVzcykgcmV0dXJuOwotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgJiYgKCFuYW1lc3BhY2VVUkkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGFueSBwcmVmaXggb24gdGhlIEVsZW1lbnQKLSAgICAgICAgICAgIGlmICghcU5hbWUuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3BsaXQgPSBxTmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gcU5hbWUuc3Vic3RyaW5nKDAsIHNwbGl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5hbWVzcGFjZSBlbGVtZW50TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBmYWN0b3J5LmVsZW1lbnQobG9jYWxOYW1lLCBlbGVtZW50TmFtZXNwYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBmYWN0b3J5LmVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRha2UgbGVmdG92ZXIgZGVjbGFyZWQgbmFtZXNwYWNlcyBhbmQgYWRkIHRoZW0gdG8gdGhpcyBlbGVtZW50J3MKLSAgICAgICAgLy8gbWFwIG9mIG5hbWVzcGFjZXMKLSAgICAgICAgaWYgKGRlY2xhcmVkTmFtZXNwYWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB0cmFuc2Zlck5hbWVzcGFjZXMoZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgYXR0cmlidXRlcwotICAgICAgICBmb3IgKGludCBpPTAsIGxlbj1hdHRzLmdldExlbmd0aCgpOyBpPGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQotICAgICAgICAgICAgU3RyaW5nIGF0dExvY2FsTmFtZSA9IGF0dHMuZ2V0TG9jYWxOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIGF0dFFOYW1lID0gYXR0cy5nZXRRTmFtZShpKTsKLSAgICAgICAgICAgIGludCBhdHRUeXBlID0gZ2V0QXR0cmlidXRlVHlwZShhdHRzLmdldFR5cGUoaSkpOwotCi0gICAgICAgICAgICAvLyBCeXBhc3MgYW55IHhtbG5zIGF0dHJpYnV0ZXMgd2hpY2ggbWlnaHQgYXBwZWFyLCBhcyB3ZSBnb3QKLSAgICAgICAgICAgIC8vIHRoZW0gYWxyZWFkeSBpbiBzdGFydFByZWZpeE1hcHBpbmcoKS4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIFNBWEhhbmRsZXIgaXMgdXNlZCB3aXRoCi0gICAgICAgICAgICAvLyBhbm90aGVyIHNvdXJjZSB0aGFuIFNBWEJ1aWxkZXIsIGFzIHdpdGggSkRPTVJlc3VsdC4KLSAgICAgICAgICAgIGlmIChhdHRRTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSB8fCBhdHRRTmFtZS5lcXVhbHMoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFhdHRRTmFtZS5lcXVhbHMoYXR0TG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRQcmVmaXggPSBhdHRRTmFtZS5zdWJzdHJpbmcoMCwgYXR0UU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgYXR0TnMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKGF0dFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0VVJJKGkpKTsKLQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGZhY3RvcnkuYXR0cmlidXRlKGF0dExvY2FsTmFtZSwgYXR0cy5nZXRWYWx1ZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRUeXBlLCBhdHROcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGZhY3RvcnkuYXR0cmlidXRlKGF0dExvY2FsTmFtZSwgYXR0cy5nZXRWYWx1ZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbHVzaENoYXJhY3RlcnMoKTsKLQotICAgICAgICBpZiAoYXRSb290KSB7Ci0gICAgICAgICAgICBkb2N1bWVudC5zZXRSb290RWxlbWVudChlbGVtZW50KTsgIC8vIFhYWCBzaG91bGQgd2UgdXNlIGEgZmFjdG9yeSBjYWxsPwotICAgICAgICAgICAgYXRSb290ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZ2V0Q3VycmVudEVsZW1lbnQoKSwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB0YWtlIHRoZSBzdXBwbGllZCA8Y29kZT57QGxpbmsgRWxlbWVudH08L2NvZGU+IGFuZAotICAgICAqIHRyYW5zZmVyIGl0cyBuYW1lc3BhY2VzIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHN0b3JhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byByZWFkIG5hbWVzcGFjZXMgZnJvbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmZXJOYW1lc3BhY2VzKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBJdGVyYXRvciBpID0gZGVjbGFyZWROYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSlpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChucyAhPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVjbGFyZWROYW1lc3BhY2VzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJlcG9ydCBjaGFyYWN0ZXIgZGF0YSAod2l0aGluIGFuIGVsZW1lbnQpLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIDxjb2RlPmNoYXJbXTwvY29kZT4gY2hhcmFjdGVyIGFycmF5IHdpdGggY2hhcmFjdGVyIGRhdGEKLSAgICAgKiBAcGFyYW0gc3RhcnQgPGNvZGU+aW50PC9jb2RlPiBpbmRleCBpbiBhcnJheSB3aGVyZSBkYXRhIHN0YXJ0cy4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIDxjb2RlPmludDwvY29kZT4gbGVuZ3RoIG9mIGRhdGEuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc3VwcHJlc3MgfHwgKGxlbmd0aCA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocHJldmlvdXNDREFUQSAhPSBpbkNEQVRBKSB7Ci0gICAgICAgICAgICBmbHVzaENoYXJhY3RlcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRleHRCdWZmZXIuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXB0dXJlIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGFzIHRleHQuICBJZgotICAgICAqIHNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpIGhhcyBiZWVuIGNhbGxlZCB0aGVuIHRoaXMKLSAgICAgKiBtZXRob2QgZG9lcyBub3RoaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIDxjb2RlPltdPC9jb2RlPiAtIGNoYXIgYXJyYXkgb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UKLSAgICAgKiBAcGFyYW0gc3RhcnQgPGNvZGU+aW50PC9jb2RlPiAtIHN0YXJ0aW5nIHBvc2l0aW9uIHdpdGhpbiBhcnJheQotICAgICAqIEBwYXJhbSBsZW5ndGggPGNvZGU+aW50PC9jb2RlPiAtIGxlbmd0aCBvZiB3aGl0ZXNwYWNlIGFmdGVyIHN0YXJ0Ci0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gd2hlbiB0aGluZ3MgZ28gd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpZ25vcmluZ1doaXRlKSB7Ci0gICAgICAgICAgICBjaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBmbHVzaCBhbnkgY2hhcmFjdGVycyBmcm9tIFNBWCBjaGFyYWN0ZXIgY2FsbHMgd2UndmUKLSAgICAgKiBiZWVuIGJ1ZmZlcmluZy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdoZW4gdGhpbmdzIGdvIHdyb25nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmx1c2hDaGFyYWN0ZXJzKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZsdXNoQ2hhcmFjdGVycyh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB0ZXh0QnVmZmVyLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmx1c2ggdGhlIGdpdmVuIHN0cmluZyBpbnRvIHRoZSBkb2N1bWVudC4gIFRoaXMgaXMgYSBwcm90ZWN0ZWQgbWV0aG9kCi0gICAgICogc28gc3ViY2xhc3NlcnMgY2FuIGNvbnRyb2wgdGV4dCBoYW5kbGluZyB3aXRob3V0IGtub3dsZWRnZSBvZiB0aGUKLSAgICAgKiBpbnRlcm5hbHMgb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN0cmluZyB0byBmbHVzaAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZsdXNoQ2hhcmFjdGVycyhTdHJpbmcgZGF0YSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkYXRhLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHByZXZpb3VzQ0RBVEEgPSBpbkNEQVRBOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLS8qKgotICogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2Ugb2Ygc29tZSBwcm9ibGVtcyB3aXRoCi0gKiB0aGUgaW5saW5lIERURHMgdGhhdCBYZXJjZXMgc2VlbXMgdG8gaGF2ZS4KLWlmICghaW5EVEQpIHsKLSAgaWYgKGluRW50aXR5KSB7Ci0gICAgZ2V0Q3VycmVudEVsZW1lbnQoKS5zZXRDb250ZW50KGZhY3RvcnkudGV4dChkYXRhKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2V0Q3VycmVudEVsZW1lbnQoKS5hZGRDb250ZW50KGZhY3RvcnkudGV4dChkYXRhKSk7Ci19Ci0qLwotCi0gICAgICAgIGlmIChwcmV2aW91c0NEQVRBKSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZ2V0Q3VycmVudEVsZW1lbnQoKSwgZmFjdG9yeS5jZGF0YShkYXRhKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZ2V0Q3VycmVudEVsZW1lbnQoKSwgZmFjdG9yeS50ZXh0KGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZpb3VzQ0RBVEEgPSBpbkNEQVRBOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQKLSAgICAgKiAoPGNvZGU+Jmx0Oy9bZWxlbWVudCBuYW1lXSZndDs8L2NvZGU+KSBpcyByZWFjaGVkLiAgTm90ZSB0aGF0Ci0gICAgICogdGhlIHBhcnNlciBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVtcHR5Ci0gICAgICogZWxlbWVudHMgYW5kIG5vbi1lbXB0eSBlbGVtZW50cywgc28gdGhpcyB3aWxsIG9jY3VyIHVuaWZvcm1seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgPGNvZGU+U3RyaW5nPC9jb2RlPiBVUkkgb2YgbmFtZXNwYWNlIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudCB3aXRob3V0IHByZWZpeAotICAgICAqIEBwYXJhbSBxTmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUgb2YgZWxlbWVudCBpbiBYTUwgMS4wIGZvcm0KLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiB3aGVuIHRoaW5ncyBnbyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHN1cHByZXNzKSByZXR1cm47Ci0KLSAgICAgICAgZmx1c2hDaGFyYWN0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKCFhdFJvb3QpIHsKLSAgICAgICAgICAgIFBhcmVudCBwID0gY3VycmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICBhdFJvb3QgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIklsbC1mb3JtZWQgWE1MIGRvY3VtZW50IChtaXNzaW5nIG9wZW5pbmcgdGFnIGZvciAiICsKLSAgICAgICAgICAgICAgICBsb2NhbE5hbWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNpZ25pZnkgdGhhdCBhIERURCBpcyBiZWluZyBwYXJzZWQsIGFuZCBjYW4gYmUKLSAgICAgKiB1c2VkIHRvIGVuc3VyZSB0aGF0IGNvbW1lbnRzIGFuZCBvdGhlciBsZXhpY2FsIHN0cnVjdHVyZXMKLSAgICAgKiBpbiB0aGUgRFREIGFyZSBub3QgYWRkZWQgdG8gdGhlIEpET00gPGNvZGU+RG9jdW1lbnQ8L2NvZGU+Ci0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGVsZW1lbnQgbGlzdGVkIGluIERURAotICAgICAqIEBwYXJhbSBwdWJsaWNJRCA8Y29kZT5TdHJpbmc8L2NvZGU+IHB1YmxpYyBJRCBvZiBEVEQKLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgPGNvZGU+U3RyaW5nPC9jb2RlPiBzeXN0ZW0gSUQgb2YgRFRECi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBmbHVzaENoYXJhY3RlcnMoKTsgLy8gSXMgdGhpcyBuZWVkZWQgaGVyZT8KLQotICAgICAgICBmYWN0b3J5LmFkZENvbnRlbnQoZG9jdW1lbnQsIGZhY3RvcnkuZG9jVHlwZShuYW1lLCBwdWJsaWNJRCwgc3lzdGVtSUQpKTsKLSAgICAgICAgaW5EVEQgPSB0cnVlOwotICAgICAgICBpbkludGVybmFsU3Vic2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNpZ25pZmllcyB0aGF0IHRoZSByZWFkaW5nIG9mIHRoZSBEVEQgaXMgY29tcGxldGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0gICAgICAgIGRvY3VtZW50LmdldERvY1R5cGUoKS5zZXRJbnRlcm5hbFN1YnNldChpbnRlcm5hbFN1YnNldC50b1N0cmluZygpKTsKLSAgICAgICAgaW5EVEQgPSBmYWxzZTsKLSAgICAgICAgaW5JbnRlcm5hbFN1YnNldCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgZW50aXR5RGVwdGgrKzsKLQotICAgICAgICBpZiAoZXhwYW5kIHx8IGVudGl0eURlcHRoID4gMSkgewotICAgICAgICAgICAgLy8gU2hvcnQgY3V0IG91dCBpZiB3ZSdyZSBleHBhbmRpbmcgb3IgaWYgd2UncmUgbmVzdGVkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBICJbZHRkXSIgZW50aXR5IGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleHRlcm5hbCBzdWJzZXQKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJbZHRkXSIpKSB7Ci0gICAgICAgICAgICBpbkludGVybmFsU3Vic2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZ25vcmUgRFREIHJlZmVyZW5jZXMsIGFuZCB0cmFuc2xhdGUgdGhlIHN0YW5kYXJkIDUKLSAgICAgICAgaWYgKCghaW5EVEQpICYmCi0gICAgICAgICAgICAoIW5hbWUuZXF1YWxzKCJhbXAiKSkgJiYKLSAgICAgICAgICAgICghbmFtZS5lcXVhbHMoImx0IikpICYmCi0gICAgICAgICAgICAoIW5hbWUuZXF1YWxzKCJndCIpKSAmJgotICAgICAgICAgICAgKCFuYW1lLmVxdWFscygiYXBvcyIpKSAmJgotICAgICAgICAgICAgKCFuYW1lLmVxdWFscygicXVvdCIpKSkgewotCi0gICAgICAgICAgICBpZiAoIWV4cGFuZCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwdWIgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBzeXMgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IChTdHJpbmdbXSkgZXh0ZXJuYWxFbnRpdGllcy5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBwdWIgPSBpZHNbMF07ICAvLyBtYXkgYmUgbnVsbCwgdGhhdCdzIE9LCi0gICAgICAgICAgICAgICAgICBzeXMgPSBpZHNbMV07ICAvLyBtYXkgYmUgbnVsbCwgdGhhdCdzIE9LCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGlmIG5vIGN1cnJlbnQgZWxlbWVudCwgdGhpcyBlbnRpdHkgYmVsb25ncyB0byBhbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgKiBpbiB0aGVzZSBjYXNlcywgaXQgaXMgYW4gZXJyb3Igb24gdGhlIHBhcnQgb2YgdGhlIHBhcnNlcgotICAgICAgICAgICAgICAgICAqIHRvIGNhbGwgc3RhcnRFbnRpdHkgYnV0IHRoaXMgd2lsbCBoZWxwIGluIHNvbWUgY2FzZXMuCi0gICAgICAgICAgICAgICAgICogU2VlIG9yZy94bWwvc2F4L2V4dC9MZXhpY2FsSGFuZGxlci5odG1sI3N0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAgICAgICAgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF0Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBmbHVzaENoYXJhY3RlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgRW50aXR5UmVmIGVudGl0eSA9IGZhY3RvcnkuZW50aXR5UmVmKG5hbWUsIHB1Yiwgc3lzKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgZW50aXR5IHdhcyBmcm9tIGFuIGF0dHJpYnV0ZSBvciBlbGVtZW50IHNvIGp1c3QgYXNzdW1lIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRDb250ZW50KGdldEN1cnJlbnRFbGVtZW50KCksIGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cHByZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVudGl0eURlcHRoLS07Ci0gICAgICAgIGlmIChlbnRpdHlEZXB0aCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBObyB3YXkgYXJlIHdlIHN1cHByZXNzaW5nIGlmIG5vdCBpbiBhbiBlbnRpdHksCi0gICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSAiZXhwYW5kIiB2YWx1ZQotICAgICAgICAgICAgc3VwcHJlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsKLSAgICAgICAgICAgIGluSW50ZXJuYWxTdWJzZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IGEgQ0RBVEEgc2VjdGlvbgotICAgICAqCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdXBwcmVzcykgcmV0dXJuOwotCi0gICAgICAgIGluQ0RBVEEgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCBhIENEQVRBIHNlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAoc3VwcHJlc3MpIHJldHVybjsKLQotICAgICAgICBwcmV2aW91c0NEQVRBID0gdHJ1ZTsKLSAgICAgICAgaW5DREFUQSA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmVwb3J0cyB0aGF0IGEgY29tbWVudHMgaXMgcGFyc2VkLiAgSWYgbm90IGluIHRoZQotICAgICAqIERURCwgdGhpcyBjb21tZW50IGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IEpET00KLSAgICAgKiA8Y29kZT5FbGVtZW50PC9jb2RlPiwgb3IgdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBpdHNlbGYKLSAgICAgKiBpZiBhdCB0aGF0IGxldmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoIDxjb2RlPmNoW108L2NvZGU+IGFycmF5IG9mIGNvbW1lbnQgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gc3RhcnQgPGNvZGU+aW50PC9jb2RlPiBpbmRleCB0byBzdGFydCByZWFkaW5nIGZyb20uCi0gICAgICogQHBhcmFtIGxlbmd0aCA8Y29kZT5pbnQ8L2NvZGU+IGxlbmd0aCBvZiBkYXRhLgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHN1cHByZXNzKSByZXR1cm47Ci0KLSAgICAgICAgZmx1c2hDaGFyYWN0ZXJzKCk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbW1lbnRUZXh0ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgIGlmIChpbkRURCAmJiBpbkludGVybmFsU3Vic2V0ICYmIChleHBhbmQgPT0gZmFsc2UpKSB7Ci0gICAgICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIiAgPCEtLSIpCi0gICAgICAgICAgICAgICAgICAuYXBwZW5kKGNvbW1lbnRUZXh0KQotICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLS0+XG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKCFpbkRURCkgJiYgKCFjb21tZW50VGV4dC5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgaWYgKGF0Um9vdCkgewotICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChkb2N1bWVudCwgZmFjdG9yeS5jb21tZW50KGNvbW1lbnRUZXh0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkQ29udGVudChnZXRDdXJyZW50RWxlbWVudCgpLCBmYWN0b3J5LmNvbW1lbnQoY29tbWVudFRleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBOb3RhdGlvbiBpbiBhIERURAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgbm90YXRpb24KLSAgICAgKiBAcGFyYW0gcHVibGljSUQgdGhlIHB1YmxpYyBJRCBvZiB0aGUgbm90YXRpb24KLSAgICAgKiBAcGFyYW0gc3lzdGVtSUQgdGhlIHN5c3RlbSBJRCBvZiB0aGUgbm90YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RhdGlvbkRlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIWluSW50ZXJuYWxTdWJzZXQpIHJldHVybjsKLQotICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIiAgPCFOT1RBVElPTiAiKQotICAgICAgICAgICAgICAuYXBwZW5kKG5hbWUpOwotICAgICAgICBhcHBlbmRFeHRlcm5hbElkKHB1YmxpY0lELCBzeXN0ZW1JRCk7Ci0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiPlxuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBmb3IgdW5wYXJzZWQgZW50aXR5IGRlY2xhcmF0aW9ucyBpbiB0aGUgRFRECi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9mIHRoZSB1bnBhcnNlZCBlbnRpdHkgZGVjbAotICAgICAqIEBwYXJhbSBwdWJsaWNJRCA8Y29kZT5TdHJpbmc8L2NvZGU+IG9mIHRoZSB1bnBhcnNlZCBlbnRpdHkgZGVjbAotICAgICAqIEBwYXJhbSBzeXN0ZW1JRCA8Y29kZT5TdHJpbmc8L2NvZGU+IG9mIHRoZSB1bnBhcnNlZCBlbnRpdHkgZGVjbAotICAgICAqIEBwYXJhbSBub3RhdGlvbk5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZiB0aGUgdW5wYXJzZWQgZW50aXR5IGRlY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnBhcnNlZEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlELCBTdHJpbmcgbm90YXRpb25OYW1lKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIWluSW50ZXJuYWxTdWJzZXQpIHJldHVybjsKLQotICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIiAgPCFFTlRJVFkgIikKLSAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKTsKLSAgICAgICAgYXBwZW5kRXh0ZXJuYWxJZChwdWJsaWNJRCwgc3lzdGVtSUQpOwotICAgICAgICBpbnRlcm5hbFN1YnNldC5hcHBlbmQoIiBOREFUQSAiKQotICAgICAgICAgICAgICAuYXBwZW5kKG5vdGF0aW9uTmFtZSk7Ci0gICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiPlxuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhbiBleHRlcm5hbCBJRCB0byB0aGUgaW50ZXJuYWwgc3Vic2V0IGJ1ZmZlci4gRWl0aGVyIHB1YmxpY0lECi0gICAgICogb3Igc3lzdGVtSUQgbWF5IGJlIG51bGwsIGJ1dCBub3QgYm90aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwdWJsaWNJRCB0aGUgcHVibGljIElECi0gICAgICogQHBhcmFtIHN5c3RlbUlEIHRoZSBzeXN0ZW0gSUQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kRXh0ZXJuYWxJZChTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotICAgICAgICBpZiAocHVibGljSUQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZXJuYWxTdWJzZXQuYXBwZW5kKCIgUFVCTElDIFwiIikKLSAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHVibGljSUQpCi0gICAgICAgICAgICAgICAgICAuYXBwZW5kKCdcIicpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzeXN0ZW1JRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHVibGljSUQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgiIFNZU1RFTSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGludGVybmFsU3Vic2V0LmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWxTdWJzZXQuYXBwZW5kKCdcIicpCi0gICAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbUlEKQotICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnXCInKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJlaW5nLXBhcnNlZCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5FbGVtZW50PC9jb2RlPiAtIGVsZW1lbnQgYmVpbmcgYnVpbHQuCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRDdXJyZW50RWxlbWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiSWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQgKG11bHRpcGxlIHJvb3QgZWxlbWVudHMgZGV0ZWN0ZWQpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRoZSBKRE9NIEF0dHJpYnV0ZSB0eXBlIHZhbHVlIGZyb20gdGhlIFNBWCAyLjAKLSAgICAgKiBhdHRyaWJ1dGUgdHlwZSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlTmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoZSBTQVggMi4wIGF0dHJpYnV0ZQotICAgICAqIHR5cGUgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5pbnQ8L2NvZGU+IHRoZSBKRE9NIGF0dHJpYnV0ZSB0eXBlLgotICAgICAqCi0gICAgICogQHNlZSBBdHRyaWJ1dGUjc2V0QXR0cmlidXRlVHlwZQotICAgICAqIEBzZWUgQXR0cmlidXRlcyNnZXRUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgdHlwZSA9IChJbnRlZ2VyKShhdHRyTmFtZVRvVHlwZU1hcC5nZXQodHlwZU5hbWUpKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgdHlwZU5hbWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgdHlwZU5hbWUuY2hhckF0KDApID09ICcoJykgewotICAgICAgICAgICAgICAgIC8vIFhlcmNlcyAxLjQuWCByZXBvcnRzIGF0dHJpYnV0ZXMgb2YgZW51bWVyYXRlZCB0eXBlIHdpdGgKLSAgICAgICAgICAgICAgICAvLyBhIHR5cGUgc3RyaW5nIGVxdWFscyB0byB0aGUgZW51bWVyYXRpb24gZGVmaW5pdGlvbiwgaS5lLgotICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHdpdGggYSBwYXJlbnRoZXNpcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlLkVOVU1FUkFURURfVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGUuVU5ERUNMQVJFRF9UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmVzIGFuIG9iamVjdCBmb3IgbG9jYXRpbmcgdGhlIG9yaWdpbiBvZiBTQVggZG9jdW1lbnQKLSAgICAgKiBldmVudHMuICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBTQVggcGFyc2VyLgotICAgICAqIDxwPgotICAgICAqIHtAbGluayBvcmcuamRvbS5KRE9NRmFjdG9yeX0gaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgdGhlCi0gICAgICoge0BsaW5rICNnZXREb2N1bWVudExvY2F0b3J9IG1ldGhvZCB0byBnZXQgYWNjZXNzIHRvIHRoZQotICAgICAqIHtAbGluayBMb2NhdG9yfSBkdXJpbmcgcGFyc2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2F0b3IgPGNvZGU+TG9jYXRvcjwvY29kZT4gYW4gb2JqZWN0IHRoYXQgY2FuIHJldHVybgotICAgICAqIHRoZSBsb2NhdGlvbiBvZiBhbnkgU0FYIGRvY3VtZW50IGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHtAbGluayBMb2NhdG9yfSBvYmplY3QgcHJvdmlkZWQgYnkgdGhlCi0gICAgICogU0FYIHBhcnNlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+TG9jYXRvcjwvY29kZT4gYW4gb2JqZWN0IHRoYXQgY2FuIHJldHVybgotICAgICAqIHRoZSBsb2NhdGlvbiBvZiBhbnkgU0FYIGRvY3VtZW50IGV2ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdG9yIGdldERvY3VtZW50TG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9UZXh0QnVmZmVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L1RleHRCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiZWZlNS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL2lucHV0L1RleHRCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IFRleHRCdWZmZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20uaW5wdXQ7Ci0KLS8qKgotICogQSBub24tcHVibGljIHV0aWxpdHkgY2xhc3Mgc2ltaWxhciB0byBTdHJpbmdCdWZmZXIgYnV0IG9wdGltaXplZCBmb3IgWE1MCi0gKiBwYXJzaW5nIHdoZXJlIHRoZSBjb21tb24gY2FzZSBpcyB0aGF0IHlvdSBnZXQgb25seSBvbmUgY2h1bmsgb2YgY2hhcmFjdGVycwotICogcGVyIHRleHQgc2VjdGlvbi4gVGV4dEJ1ZmZlciBzdG9yZXMgdGhlIGZpcnN0IGNodW5rIG9mIGNoYXJhY3RlcnMgaW4gYQotICogU3RyaW5nLCB3aGljaCBjYW4ganVzdCBiZSByZXR1cm5lZCBkaXJlY3RseSBpZiBubyBzZWNvbmQgY2h1bmsgaXMgcmVjZWl2ZWQuCi0gKiBTdWJzZXF1ZW50IGNodW5rcyBhcmUgc3RvcmVkIGluIGEgc3VwcGxlbWVudGFsIGNoYXIgYXJyYXkgKGxpa2UgU3RyaW5nQnVmZmVyCi0gKiB1c2VzKS4gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuZWQgdGV4dCB3aWxsIGJlIHRoZSBmaXJzdCBTdHJpbmcgY2h1bmssCi0gKiBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgc3Vic2VxdWVudCBjaHVua3Mgc3RvcmVkIGluIHRoZSBjaGFyIGFycmF5LiBUaGlzCi0gKiBwcm92aWRlcyBvcHRpbWFsIHBlcmZvcm1hbmNlIGluIHRoZSBjb21tb24gY2FzZSwgd2hpbGUgc3RpbGwgcHJvdmlkaW5nIHZlcnkKLSAqIGdvb2QgcGVyZm9ybWFuY2UgaW4gdGhlIHVuY29tbW9uIGNhc2UuIEZ1cnRoZXJtb3JlLCBhdm9pZGluZyBTdHJpbmdCdWZmZXIKLSAqIG1lYW5zIHRoYXQgbm8gZXh0cmEgdW51c2VkIGNoYXIgYXJyYXkgc3BhY2Ugd2lsbCBiZSBrZXB0IGFyb3VuZCBhZnRlciBwYXJzaW5nCi0gKiBpcyB0aHJvdWdoLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICogQGF1dGhvciAgQWxleCBSb3NlbgotICovCi1jbGFzcyBUZXh0QnVmZmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICJAKCMpICRSQ1NmaWxlOiBUZXh0QnVmZmVyLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB0ZXh0IHZhbHVlICh0aGUgInByZWZpeCIpLiBJZiBudWxsLCB0aGUKLSAgICAgICogdGV4dCB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeFN0cmluZzsKLQotICAgIC8qKiBUaGUgcmVzdCBvZiB0aGUgdGV4dCB2YWx1ZSAodGhlICJzdWZmaXgiKS4gT25seSB0aGUgZmlyc3QgCi0gICAgICAqIGNvZGU+YXJyYXlTaXplPC9jb2RlPiBjaGFyYWN0ZXJzIGFyZSB2YWxpZC4gKi8KLSAgICBwcml2YXRlIGNoYXJbXSBhcnJheTsKLQotICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGUgcmVzdCBvZiB0aGUgdGV4dCB2YWx1ZS4gSWYgemVybywgdGhlbiBvbmx5IAotICAgICAgKiBjb2RlPnByZWZpeFN0cmluZzwvY29kZT4gY29udGFpbnMgdGhlIHRleHQgdmFsdWUuICovCi0gICAgcHJpdmF0ZSBpbnQgYXJyYXlTaXplOwotCi0gICAgLyoqIENvbnN0cnVjdG9yICovCi0gICAgVGV4dEJ1ZmZlcigpIHsKLSAgICAgICAgYXJyYXkgPSBuZXcgY2hhcls0MDk2XTsgLy8gaW5pdGlhbCBjYXBhY2l0eQotICAgICAgICBhcnJheVNpemUgPSAwOwotICAgIH0KLQotICAgIC8qKiBBcHBlbmQgdGhlIHNwZWNpZmllZCB0ZXh0IHRvIHRoZSB0ZXh0IHZhbHVlIG9mIHRoaXMgYnVmZmVyLiAqLwotICAgIHZvaWQgYXBwZW5kKGNoYXJbXSBzb3VyY2UsIGludCBzdGFydCwgaW50IGNvdW50KSB7Ci0gICAgICAgIGlmIChwcmVmaXhTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgY2h1bmssIHNvIHdlJ2xsIHN0b3JlIGl0IGluIHRoZSBwcmVmaXggc3RyaW5nCi0gICAgICAgICAgICBwcmVmaXhTdHJpbmcgPSBuZXcgU3RyaW5nKHNvdXJjZSwgc3RhcnQsIGNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdWJzZXF1ZW50IGNodW5rLCBzbyB3ZSdsbCBhZGQgaXQgdG8gdGhlIGNoYXIgYXJyYXkKLSAgICAgICAgICAgIGVuc3VyZUNhcGFjaXR5KGFycmF5U2l6ZSArIGNvdW50KTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzdGFydCwgYXJyYXksIGFycmF5U2l6ZSwgY291bnQpOwotICAgICAgICAgICAgYXJyYXlTaXplICs9IGNvdW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHRleHQgdmFsdWUuICovCi0gICAgaW50IHNpemUoKSB7Ci0gICAgICAgIGlmIChwcmVmaXhTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZml4U3RyaW5nLmxlbmd0aCgpICsgYXJyYXlTaXplOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENsZWFycyB0aGUgdGV4dCB2YWx1ZSBhbmQgcHJlcGFyZXMgdGhlIFRleHRCdWZmZXIgZm9yIHJldXNlLiAqLwotICAgIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGFycmF5U2l6ZSA9IDA7Ci0gICAgICAgIHByZWZpeFN0cmluZyA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIHRleHQgdmFsdWUgc3RvcmVkIGluIHRoZSBidWZmZXIuICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKHByZWZpeFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc3RyID0gIiI7Ci0gICAgICAgIGlmIChhcnJheVNpemUgPT0gMCkgewotICAgICAgICAgICAgLy8gQ2hhciBhcnJheSBpcyBlbXB0eSwgc28gdGhlIHRleHQgdmFsdWUgaXMganVzdCBwcmVmaXhTdHJpbmcuCi0gICAgICAgICAgICBzdHIgPSBwcmVmaXhTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBDaGFyIGFycmF5IGlzIG5vdCBlbXB0eSwgc28gdGhlIHRleHQgdmFsdWUgaXMgcHJlZml4U3RyaW5nCi0gICAgICAgICAgICAvLyBwbHVzIHRoZSBjaGFyIGFycmF5LgotICAgICAgICAgICAgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhTdHJpbmcubGVuZ3RoKCkgKyBhcnJheVNpemUpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocHJlZml4U3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGFycmF5LCAwLCBhcnJheVNpemUpCi0gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotCi0gICAgLy8gRW5zdXJlIHRoYXQgdGhlIGNoYXIgYXJyYXkgaGFzIHJvb20gZm9yIGF0IGxlYXN0ICJjc2l6ZSIgY2hhcmFjdGVycy4KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IGNzaXplKSB7Ci0gICAgICAgIGludCBjYXBhY2l0eSA9IGFycmF5Lmxlbmd0aDsKLSAgICAgICAgaWYgKGNzaXplID4gY2FwYWNpdHkpIHsKLSAgICAgICAgICAgIGNoYXJbXSBvbGQgPSBhcnJheTsKLSAgICAgICAgICAgIGludCBuc2l6ZSA9IGNhcGFjaXR5OwotICAgICAgICAgICAgd2hpbGUgKGNzaXplID4gbnNpemUpIHsKLSAgICAgICAgICAgICAgICBuc2l6ZSArPSAoY2FwYWNpdHkvMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnJheSA9IG5ldyBjaGFyW25zaXplXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkLCAwLCBhcnJheSwgMCwgYXJyYXlTaXplKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vaW5wdXQvcGFja2FnZS5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGQ1ZTMuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9pbnB1dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08Ym9keT4KLQotQ2xhc3NlcyB0byBidWlsZCBKRE9NIGRvY3VtZW50cyBmcm9tIHZhcmlvdXMgc291cmNlcy4gIFRoZSBtb3N0IGNvbW1vbiBidWlsZGVyCi1jbGFzcyBpcyBTQVhCdWlsZGVyIHdoaWNoIGNvbnN0cnVjdHMgYSBKRE9NIGRvY3VtZW50IHVzaW5nIGEgU0FYIHBhcnNlciBhbmQKLWNhbiBwdWxsIGNvbnRlbnQgZnJvbSBmaWxlcywgc3RyZWFtcywgc29ja2V0cywgcmVhZGVycywgYW5kIHNvIG9uLiAgSXQgY2FuIHVzZQotYW55IHVuZGVybHlpbmcgU0FYIHBhcnNlciB0byBoYW5kbGUgdGhlIHBhcnNpbmcgY2hvcmVzLiAgU0FYSGFuZGxlciBwcm92aWRlcwotc3VwcG9ydCBmb3IgU0FYQnVpbGRlci4gIERPTUJ1aWxkZXIgbGV0cyB5b3UgYnVpbGQgZnJvbSBhIHByZS1leGlzdGluZyBET00KLXRyZWUuCi0KLTwvYm9keT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L0RPTU91dHB1dHRlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvRE9NT3V0cHV0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGViY2YuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvRE9NT3V0cHV0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyotLSAKLQotICRJZDogRE9NT3V0cHV0dGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5qZG9tLm91dHB1dDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLWltcG9ydCBvcmcuamRvbS5hZGFwdGVycy4qOwotCi0KLS8qKgotICogT3V0cHV0cyBhIEpET00ge0BsaW5rIG9yZy5qZG9tLkRvY3VtZW50IG9yZy5qZG9tLkRvY3VtZW50fSBhcyBhIERPTSB7QGxpbmsKLSAqIG9yZy53M2MuZG9tLkRvY3VtZW50IG9yZy53M2MuZG9tLkRvY3VtZW50fS4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkCi0gKiBAYXV0aG9yICBCcmV0dCBNY0xhdWdobGluCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqIEBhdXRob3IgIE1hdHRoZXcgTWVybG8KLSAqIEBhdXRob3IgIERhbiBTY2hhZmZlcgotICogQGF1dGhvciAgWXVzdWYgR29vbGFtYWJiYXMKLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1wdWJsaWMgY2xhc3MgRE9NT3V0cHV0dGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPSAKLSAgICAgICJAKCMpICRSQ1NmaWxlOiBET01PdXRwdXR0ZXIuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKiogRGVmYXVsdCBhZGFwdGVyIGNsYXNzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQURBUFRFUl9DTEFTUyA9Ci0gICAgICAgICJvcmcuamRvbS5hZGFwdGVycy5YZXJjZXNET01BZGFwdGVyIjsKLQotICAgIC8qKiBBZGFwdGVyIHRvIHVzZSBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgRE9NIGltcGxlbWVudGF0aW9uICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWRhcHRlckNsYXNzOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIGEgbmV3IERPTU91dHB1dHRlciB3aGljaCB3aWxsIGF0dGVtcHQgdG8gZmlyc3QgbG9jYXRlCi0gICAgICogYSBET00gaW1wbGVtZW50YXRpb24gdG8gdXNlIHZpYSBKQVhQLCBhbmQgaWYgSkFYUCBkb2VzIG5vdCBleGlzdCBvcgotICAgICAqIHRoZXJlJ3MgYSBwcm9ibGVtLCB3aWxsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBwYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIERPTU91dHB1dHRlcigpIHsKLSAgICAgICAgLy8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY3JlYXRlcyBhIG5ldyBET01PdXRwdXR0ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBET01BZGFwdGVyCi0gICAgICogaW1wbGVtZW50YXRpb24gYXMgYSB3YXkgdG8gY2hvb3NlIHRoZSB1bmRlcmx5aW5nIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyQ2xhc3MgPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lIG9mIGNsYXNzCi0gICAgICogICAgICAgICAgICAgICAgICAgICB0byB1c2UgZm9yIERPTSBvdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgRE9NT3V0cHV0dGVyKFN0cmluZyBhZGFwdGVyQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5hZGFwdGVyQ2xhc3MgPSBhZGFwdGVyQ2xhc3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNvbnZlcnRzIHRoZSBKRE9NIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBwYXJhbWV0ZXIgdG8gYSAKLSAgICAgKiBET00gRG9jdW1lbnQsIHJldHVybmluZyB0aGUgRE9NIHZlcnNpb24uICBUaGUgRE9NIGltcGxlbWVudGF0aW9uCi0gICAgICogaXMgdGhlIG9uZSBjaG9zZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50IDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5vcmcudzNjLmRvbS5Eb2N1bWVudDwvY29kZT4gdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Eb2N1bWVudCBvdXRwdXQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMgPSBuZXcgTmFtZXNwYWNlU3RhY2soKTsKLQotICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb21Eb2MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQXNzaWduIERPQ1RZUEUgZHVyaW5nIGNvbnN0cnVjdGlvbgotICAgICAgICAgICAgRG9jVHlwZSBkdCA9IGRvY3VtZW50LmdldERvY1R5cGUoKTsKLSAgICAgICAgICAgIGRvbURvYyA9IGNyZWF0ZURPTURvY3VtZW50KGR0KTsKLQotICAgICAgICAgICAgLy8gQWRkIGNvbnRlbnQKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGRvY3VtZW50LmdldENvbnRlbnQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgbm9kZSA9IGl0ci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQoZWxlbWVudCwgZG9tRG9jLCBuYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcm9vdCBlbGVtZW50LCBmaXJzdCBjaGVjayBmb3IgZXhpc3Rpbmcgcm9vdAotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCByb290ID0gZG9tRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tRG9jLmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpOyAvLyBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGVyY2VzIDEuMyBjcmVhdGVzIG5ldyBkb2NzIHdpdGggYSA8cm9vdCAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhYWDogTmVlZCB0byBhZGRyZXNzIERPQ1RZUEUgbWlzbWF0Y2ggc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Eb2MucmVwbGFjZUNoaWxkKGRvbUVsZW1lbnQsIHJvb3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudCBkb21Db21tZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbURvYy5jcmVhdGVDb21tZW50KGNvbW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRG9jLmFwcGVuZENoaWxkKGRvbUNvbW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uIGRvbVBJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBkb21Eb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmdldFRhcmdldCgpLCBwaS5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICBkb21Eb2MuYXBwZW5kQ2hpbGQoZG9tUEkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGRlYWx0IHdpdGggdGhlIERvY1R5cGUgYWJvdmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IGNvbnRhaW5lZCB0b3AtbGV2ZWwgY29udGVudCB3aXRoIHR5cGU6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXhjZXB0aW9uIG91dHB1dHRpbmcgRG9jdW1lbnQiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb21Eb2M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudChEb2NUeXBlIGR0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICBpZiAoYWRhcHRlckNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSB1c2VyIGtub3dzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBhIHBhcnRpY3VsYXIgaW1wbAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBET01BZGFwdGVyIGFkYXB0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoRE9NQWRhcHRlcilDbGFzcy5mb3JOYW1lKGFkYXB0ZXJDbGFzcykubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVzaW5nIHNwZWNpZmljICIgKyBhZGFwdGVyQ2xhc3MpOwotICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVyLmNyZWF0ZURvY3VtZW50KGR0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRyeSB1c2luZyBKQVhQLi4uCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERPTUFkYXB0ZXIgYWRhcHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIChET01BZGFwdGVyKUNsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJvcmcuamRvbS5hZGFwdGVycy5KQVhQRE9NQWRhcHRlciIpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1c2luZyBKQVhQIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIuY3JlYXRlRG9jdW1lbnQoZHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgbm8gRE9NIGRvYyB5ZXQsIHRyeSB0byB1c2UgYSBoYXJkIGNvZGVkIGRlZmF1bHQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERPTUFkYXB0ZXIgYWRhcHRlciA9IChET01BZGFwdGVyKQotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoREVGQVVMVF9BREFQVEVSX0NMQVNTKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIuY3JlYXRlRG9jdW1lbnQoZHQpOwotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBkZWZhdWx0ICIgKwotICAgICAgICAgICAgLy8gICBERUZBVUxUX0FEQVBURVJfQ0xBU1MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIk5vIEpBWFAgb3IgZGVmYXVsdCBwYXJzZXIgYXZhaWxhYmxlIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgb3JnLnczYy5kb20uRWxlbWVudCBvdXRwdXQoRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb21Eb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBwcmV2aW91c2x5RGVjbGFyZWROYW1lc3BhY2VzID0gbmFtZXNwYWNlcy5zaXplKCk7Ci0KLSAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lc3BhY2UoKSA9PSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbmFtZXNwYWNlLCB1c2UgY3JlYXRlRWxlbWVudAotICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQgPSBkb21Eb2MuY3JlYXRlRWxlbWVudChlbGVtZW50LmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb21FbGVtZW50ID0gZG9tRG9jLmNyZWF0ZUVsZW1lbnROUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBuYW1lc3BhY2UgYXR0cmlidXRlcywgYmVnaW5uaW5nIHdpdGggdGhlIGVsZW1lbnQncyBvd24KLSAgICAgICAgICAgIC8vIERvIHRoaXMgb25seSBpZiBpdCdzIG5vdCB0aGUgWE1MIG5hbWVzcGFjZSBhbmQgaXQncwotICAgICAgICAgICAgLy8gbm90IHRoZSBOT19OQU1FU1BBQ0Ugd2l0aCB0aGUgcHJlZml4ICIiIG5vdCB5ZXQgbWFwcGVkCi0gICAgICAgICAgICAvLyAod2UgZG8gb3V0cHV0IHhtbG5zPSIiIGlmIHRoZSAiIiBwcmVmaXggd2FzIGFscmVhZHkgdXNlZCAKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlY2xhaW0gaXQgZm9yIHRoZSBOT19OQU1FU1BBQ0UpCi0gICAgICAgICAgICBOYW1lc3BhY2UgbnMgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKG5zICE9IE5hbWVzcGFjZS5YTUxfTkFNRVNQQUNFICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhKG5zID09IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuZ2V0VVJJKCIiKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBucy5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlcy5nZXRVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICBpZiAoIW5zLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7IC8vIG91dHB1dCBhIG5ldyBuYW1lc3BhY2UgZGVjbAotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1c2gobnMpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBnZXRYbWxuc1RhZ0Zvcihucyk7Ci0gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBucy5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgYWRkaXRpb25hbCBuYW1lc3BhY2VzIGFsc28KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGVsZW1lbnQuZ2V0QWRkaXRpb25hbE5hbWVzcGFjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgYWRkaXRpb25hbCA9IChOYW1lc3BhY2UpaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYWRkaXRpb25hbC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlcy5nZXRVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICBpZiAoIWFkZGl0aW9uYWwuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gZ2V0WG1sbnNUYWdGb3IoYWRkaXRpb25hbCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhZGRpdGlvbmFsLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5wdXNoKGFkZGl0aW9uYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGF0dHJpYnV0ZXMgdG8gdGhlIERPTSBlbGVtZW50Ci0gICAgICAgICAgICBpdHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBkb21FbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUob3V0cHV0KGF0dHJpYnV0ZSwgZG9tRG9jKSk7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIG5zMSA9IGF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5zMSAhPSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgKG5zMSAhPSBOYW1lc3BhY2UuWE1MX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5zMS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZXMuZ2V0VVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbnMxLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7IC8vIG91dHB1dCBhIG5ldyBkZWNsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBnZXRYbWxuc1RhZ0ZvcihuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIG5zMS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1c2gobnMxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDcmltc29uIGRvZXNuJ3QgbGlrZSBzZXRBdHRyaWJ1dGVOUygpIGZvciBub24tTlMgYXR0cmlicwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlKCkgPT0gTmFtZXNwYWNlLk5PX05BTUVTUEFDRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBObyBuYW1lc3BhY2UsIHVzZSBzZXRBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgY29udGVudCB0byB0aGUgRE9NIGVsZW1lbnQKLSAgICAgICAgICAgIGl0ciA9IGVsZW1lbnQuZ2V0Q29udGVudCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBub2RlID0gaXRyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkb21FbHQgPSBvdXRwdXQoZSwgZG9tRG9jLCBuYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChkb21FbHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKSBub2RlOwotICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IGRvbVRleHQgPSBkb21Eb2MuY3JlYXRlVGV4dE5vZGUoc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChkb21UZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENEQVRBKSB7Ci0gICAgICAgICAgICAgICAgICAgIENEQVRBIGNkYXRhID0gKENEQVRBKSBub2RlOwotICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb24gZG9tQ2RhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgZG9tRG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihjZGF0YS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LmFwcGVuZENoaWxkKGRvbUNkYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQgZG9tVGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb21Eb2MuY3JlYXRlVGV4dE5vZGUodGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LmFwcGVuZENoaWxkKGRvbVRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudCBkb21Db21tZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbURvYy5jcmVhdGVDb21tZW50KGNvbW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChkb21Db21tZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbiBkb21QSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZG9tRG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChkb21QSSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHlSZWYpIHsKLSAgICAgICAgICAgICAgICAgICAgRW50aXR5UmVmIGVudGl0eSA9IChFbnRpdHlSZWYpIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZSBkb21FbnRpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgZG9tRG9jLmNyZWF0ZUVudGl0eVJlZmVyZW5jZShlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChkb21FbnRpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCBjb250YWluZWQgY29udGVudCB3aXRoIHR5cGU6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLyBSZW1vdmUgZGVjbGFyZWQgbmFtZXNwYWNlcyBmcm9tIHN0YWNrCi0gICAgICAgICAgICB3aGlsZSAobmFtZXNwYWNlcy5zaXplKCkgPiBwcmV2aW91c2x5RGVjbGFyZWROYW1lc3BhY2VzKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5wb3AoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGRvbUVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXhjZXB0aW9uIG91dHB1dHRpbmcgRWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgb3JnLnczYy5kb20uQXR0ciBvdXRwdXQoQXR0cmlidXRlIGF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9tRG9jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgICBvcmcudzNjLmRvbS5BdHRyIGRvbUF0dHIgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBpZiAoYXR0cmlidXRlLmdldE5hbWVzcGFjZSgpID09IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpIHsKLSAgICAgICAgICAgICAgICAgLy8gTm8gbmFtZXNwYWNlLCB1c2UgY3JlYXRlQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgIGRvbUF0dHIgPSBkb21Eb2MuY3JlYXRlQXR0cmlidXRlKGF0dHJpYnV0ZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgZG9tQXR0ciA9IGRvbURvYy5jcmVhdGVBdHRyaWJ1dGVOUyhhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBkb21BdHRyLnNldFZhbHVlKGF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkV4Y2VwdGlvbiBvdXRwdXR0aW5nIEF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBkb21BdHRyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgYWRkaW5nIGFueSA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4KLSAgICAgKiBhdHRyaWJ1dGVzIHRvIHRoZSBET00gdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBucyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIGFkZCBkZWZpbml0aW9uIG9mCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFhtbG5zVGFnRm9yKE5hbWVzcGFjZSBucykgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAieG1sbnMiOwotICAgICAgICBpZiAoIW5zLmdldFByZWZpeCgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGF0dHJOYW1lICs9ICI6IjsKLSAgICAgICAgICAgIGF0dHJOYW1lICs9IG5zLmdldFByZWZpeCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9Fc2NhcGVTdHJhdGVneS5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvRXNjYXBlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYjViNi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9Fc2NhcGVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyotLQotCi0gJElkOiBFc2NhcGVTdHJhdGVneS5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjAgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS5vdXRwdXQ7Ci0KLS8qKgotICogTG9naWMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBjaGFyYWN0ZXIKLSAqIGVudGl0aWVzLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgQWxleCBSb3NlbgotICogQGF1dGhvciBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqIEBhdXRob3IgSmFzb24gSHVudGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXNjYXBlU3RyYXRlZ3kgewotCi0gICAgLyoqCi0gICAgICogVGVzdCB3aGV0aGVyIHRoZSBzdXBwbGllZCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGZvcm1hdHRlZCBsaXRlcmFsbHkKLSAgICAgKiBvciBhcyBhIGNoYXJhY3RlciBlbnRpdHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRXNjYXBlKGNoYXIgY2gpOwotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9Gb3JtYXQuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L0Zvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTlmNjBmLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L0Zvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qLS0KLQotICRJZDogRm9ybWF0LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLm91dHB1dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBYTUxPdXRwdXR0ZXIgZm9ybWF0IG9wdGlvbnMuCi0gKiBUeXBpY2FsIHVzZXJzIGNhbiB1c2UgdGhlIHN0YW5kYXJkIGZvcm1hdCBjb25maWd1cmF0aW9ucyBvYnRhaW5lZCBieQotICoge0BsaW5rICNnZXRSYXdGb3JtYXR9IChubyB3aGl0ZXNwYWNlIGNoYW5nZXMpLAotICoge0BsaW5rICNnZXRQcmV0dHlGb3JtYXR9ICh3aGl0ZXNwYWNlIGJlYXV0aWZpY2F0aW9uKSwgYW5kCi0gKiB7QGxpbmsgI2dldENvbXBhY3RGb3JtYXR9ICh3aGl0ZXNwYWNlIG5vcm1hbGl6YXRpb24pLgotICogPHA+Ci0gKiBTZXZlcmFsIG1vZGVzIGFyZSBhdmFpbGFibGUgdG8gZWZmZWN0IHRoZSB3YXkgdGV4dHVhbCBjb250ZW50IGlzIHByaW50ZWQuCi0gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluayBUZXh0TW9kZX0gZm9yIGRldGFpbHMuCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJAotICogQGF1dGhvciBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIEZvcm1hdCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICAgICAgICJAKCMpICRSQ1NmaWxlOiBGb3JtYXQuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkICROYW1lOiAgJCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZvcm1hdCBvYmplY3QgdGhhdCBwZXJmb3JtcyBubyB3aGl0ZXNwYWNlIGNoYW5nZXMsIHVzZXMKLSAgICAgKiB0aGUgVVRGLTggZW5jb2RpbmcsIGRvZXNuJ3QgZXhwYW5kIGVtcHR5IGVsZW1lbnRzLCBpbmNsdWRlcyB0aGUKLSAgICAgKiBkZWNsYXJhdGlvbiBhbmQgZW5jb2RpbmcsIGFuZCB1c2VzIHRoZSBkZWZhdWx0IGVudGl0eSBlc2NhcGUgc3RyYXRlZ3kuCi0gICAgICogVHdlYWtzIGNhbiBiZSBtYWRlIHRvIHRoZSByZXR1cm5lZCBGb3JtYXQgaW5zdGFuY2Ugd2l0aG91dCBhZmZlY3RpbmcKLSAgICAgKiBvdGhlciBpbnN0YW5jZXMuCi0KLSAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgYSBGb3JtYXQgd2l0aCBubyB3aGl0ZXNwYWNlIGNoYW5nZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZvcm1hdCBnZXRSYXdGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRm9ybWF0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGb3JtYXQgb2JqZWN0IHRoYXQgcGVyZm9ybXMgd2hpdGVzcGFjZSBiZWF1dGlmaWNhdGlvbiB3aXRoCi0gICAgICogMi1zcGFjZSBpbmRlbnRzLCB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZywgZG9lc24ndCBleHBhbmQgZW1wdHkgZWxlbWVudHMsCi0gICAgICogaW5jbHVkZXMgdGhlIGRlY2xhcmF0aW9uIGFuZCBlbmNvZGluZywgYW5kIHVzZXMgdGhlIGRlZmF1bHQgZW50aXR5Ci0gICAgICogZXNjYXBlIHN0cmF0ZWd5LgotICAgICAqIFR3ZWFrcyBjYW4gYmUgbWFkZSB0byB0aGUgcmV0dXJuZWQgRm9ybWF0IGluc3RhbmNlIHdpdGhvdXQgYWZmZWN0aW5nCi0gICAgICogb3RoZXIgaW5zdGFuY2VzLgotICAgICAqCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIGEgRm9ybWF0IHdpdGggd2hpdGVzcGFjZSBiZWF1dGlmaWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9ybWF0IGdldFByZXR0eUZvcm1hdCgpIHsKLSAgICAgICAgRm9ybWF0IGYgPSBuZXcgRm9ybWF0KCk7Ci0gICAgICAgIGYuc2V0SW5kZW50KFNUQU5EQVJEX0lOREVOVCk7Ci0gICAgICAgIGYuc2V0VGV4dE1vZGUoVGV4dE1vZGUuVFJJTSk7Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgRm9ybWF0IG9iamVjdCB0aGF0IHBlcmZvcm1zIHdoaXRlc3BhY2Ugbm9ybWFsaXphdGlvbiwgdXNlcwotICAgICAqIHRoZSBVVEYtOCBlbmNvZGluZywgZG9lc24ndCBleHBhbmQgZW1wdHkgZWxlbWVudHMsIGluY2x1ZGVzIHRoZQotICAgICAqIGRlY2xhcmF0aW9uIGFuZCBlbmNvZGluZywgYW5kIHVzZXMgdGhlIGRlZmF1bHQgZW50aXR5IGVzY2FwZSBzdHJhdGVneS4KLSAgICAgKiBUd2Vha3MgY2FuIGJlIG1hZGUgdG8gdGhlIHJldHVybmVkIEZvcm1hdCBpbnN0YW5jZSB3aXRob3V0IGFmZmVjdGluZwotICAgICAqIG90aGVyIGluc3RhbmNlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICBhIEZvcm1hdCB3aXRoIHdoaXRlc3BhY2Ugbm9ybWFsaXphdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9ybWF0IGdldENvbXBhY3RGb3JtYXQoKSB7Ci0gICAgICAgIEZvcm1hdCBmID0gbmV3IEZvcm1hdCgpOwotICAgICAgICBmLnNldFRleHRNb2RlKFRleHRNb2RlLk5PUk1BTElaRSk7Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIC8qKiBzdGFuZGFyZCB2YWx1ZSB0byBpbmRlbnQgYnksIGlmIHdlIGFyZSBpbmRlbnRpbmcgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfSU5ERU5UID0gIiAgIjsKLQotICAgIC8qKiBzdGFuZGFyZCBzdHJpbmcgd2l0aCB3aGljaCB0byBlbmQgYSBsaW5lICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0xJTkVfU0VQQVJBVE9SID0gIlxyXG4iOwotCi0gICAgLyoqIHN0YW5kYXJkIGVuY29kaW5nICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0VOQ09ESU5HID0gIlVURi04IjsKLQotCi0gICAgLyoqIFRoZSBkZWZhdWx0IGluZGVudCBpcyBubyBzcGFjZXMgKGFzIG9yaWdpbmFsIGRvY3VtZW50KSAqLwotICAgIFN0cmluZyBpbmRlbnQgPSBudWxsOwotCi0gICAgLyoqIE5ldyBsaW5lIHNlcGFyYXRvciAqLwotICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU1RBTkRBUkRfTElORV9TRVBBUkFUT1I7Ci0KLSAgICAvKiogVGhlIGVuY29kaW5nIGZvcm1hdCAqLwotICAgIFN0cmluZyBlbmNvZGluZyA9IFNUQU5EQVJEX0VOQ09ESU5HOwotCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIG91dHB1dCB0aGUgWE1MIGRlY2xhcmF0aW9uCi0gICAgICogLSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiAqLwotICAgIGJvb2xlYW4gb21pdERlY2xhcmF0aW9uID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgdG8gb3V0cHV0IHRoZSBlbmNvZGluZyBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uCi0gICAgICogLSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiAqLwotICAgIGJvb2xlYW4gb21pdEVuY29kaW5nID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgdG8gZXhwYW5kIGVtcHR5IGVsZW1lbnRzIHRvCi0gICAgICogJmx0O3RhZ05hbWUmZ3Q7Jmx0Oy90YWdOYW1lJmd0OyAtIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICovCi0gICAgYm9vbGVhbiBleHBhbmRFbXB0eUVsZW1lbnRzID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBUckFYIG91dHB1dCBlc2NhcGluZyBkaXNhYmxpbmcvZW5hYmxpbmcgUElzIGFyZSBpZ25vcmVkCi0gICAgICAqIG9yIHByb2Nlc3NlZCAtIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICovCi0gICAgYm9vbGVhbiBpZ25vcmVUckFYRXNjYXBpbmdQSXMgPSBmYWxzZTsKLQotICAgIC8qKiB0ZXh0IGhhbmRsaW5nIG1vZGUgKi8KLSAgICBUZXh0TW9kZSBtb2RlID0gVGV4dE1vZGUuUFJFU0VSVkU7Ci0KLSAgICAvKiogZW50aXR5IGVzY2FwZSBsb2dpYyAqLwotICAgIEVzY2FwZVN0cmF0ZWd5IGVzY2FwZVN0cmF0ZWd5ID0gbmV3IERlZmF1bHRFc2NhcGVTdHJhdGVneShlbmNvZGluZyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdCBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgKHJhdykgYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGb3JtYXQoKSB7IH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHtAbGluayBFc2NhcGVTdHJhdGVneX0gdG8gdXNlIGZvciBjaGFyYWN0ZXIgZXNjYXBpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgdGhlIEVzY2FwZVN0cmF0ZWd5IHRvIHVzZQotICAgICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoaXMgRm9ybWF0IGZvciBjaGFpbmluZwotICAgICAqLwotICAgIHB1YmxpYyBGb3JtYXQgc2V0RXNjYXBlU3RyYXRlZ3koRXNjYXBlU3RyYXRlZ3kgc3RyYXRlZ3kpIHsKLSAgICAgICAgZXNjYXBlU3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBlc2NhcGUgc3RyYXRlZ3kKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZXNjYXBlIHN0cmF0ZWd5Ci0gICAgICovCi0gICAgcHVibGljIEVzY2FwZVN0cmF0ZWd5IGdldEVzY2FwZVN0cmF0ZWd5KCkgewotICAgICAgICByZXR1cm4gZXNjYXBlU3RyYXRlZ3k7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgbmV3bGluZSBzZXBhcmF0b3IgKDxjb2RlPmxpbmVTZXBhcmF0b3I8L2NvZGU+KS4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5cclxuPC9jb2RlPi4gTm90ZSB0aGF0IGlmIHRoZSAibmV3bGluZXMiCi0gICAgICogcHJvcGVydHkgaXMgZmFsc2UsIHRoaXMgdmFsdWUgaXMgaXJyZWxldmFudC4gIFRvIG1ha2UgaXQgb3V0cHV0Ci0gICAgICogdGhlIHN5c3RlbSBkZWZhdWx0IGxpbmUgZW5kaW5nIHN0cmluZywgY2FsbAotICAgICAqIDxjb2RlPnNldExpbmVTZXBhcmF0b3IoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTwvY29kZT4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFRvIG91dHB1dCAiVU5JWC1zdHlsZSIgZG9jdW1lbnRzLCBjYWxsCi0gICAgICogPGNvZGU+c2V0TGluZVNlcGFyYXRvcigiXG4iKTwvY29kZT4uICBUbyBvdXRwdXQgIk1hYy1zdHlsZSIKLSAgICAgKiBkb2N1bWVudHMsIGNhbGwgPGNvZGU+c2V0TGluZVNlcGFyYXRvcigiXHIiKTwvY29kZT4uICBET1Mtc3R5bGUKLSAgICAgKiBkb2N1bWVudHMgdXNlIENSLUxGICgiXHJcbiIpLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGFwcGxpZXMgdG8gbmV3bGluZXMgZ2VuZXJhdGVkIGJ5IHRoZQotICAgICAqIG91dHB1dHRlci4gIElmIHlvdSBwYXJzZSBhbiBYTUwgZG9jdW1lbnQgdGhhdCBjb250YWlucyBuZXdsaW5lcwotICAgICAqIGVtYmVkZGVkIGluc2lkZSBhIHRleHQgbm9kZSwgYW5kIHlvdSBkbyBub3Qgc2V0IFRleHRNb2RlLk5PUk1BTElaRSwKLSAgICAgKiB0aGVuIHRoZSBuZXdsaW5lcyB3aWxsIGJlIG91dHB1dAotICAgICAqIHZlcmJhdGltLCBhcyAiXG4iIHdoaWNoIGlzIGhvdyBwYXJzZXJzIG5vcm1hbGl6ZSB0aGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI3NldFRleHRNb2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIDxjb2RlPlN0cmluZzwvY29kZT4gbGluZSBzZXBhcmF0b3IgdG8gdXNlLgotICAgICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoaXMgRm9ybWF0IGZvciBjaGFpbmluZwotICAgICAqLwotICAgIHB1YmxpYyBGb3JtYXQgc2V0TGluZVNlcGFyYXRvcihTdHJpbmcgc2VwYXJhdG9yKSB7Ci0gICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IHNlcGFyYXRvcjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsaW5lIHNlcGFyYXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBzZXBhcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpbmVTZXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBsaW5lU2VwYXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgd2hldGhlciB0aGUgWE1MIGRlY2xhcmF0aW9uCi0gICAgICogKDxjb2RlPiZsdDsmIzA2Mzt4bWwgdmVyc2lvbj0iMSYjMDQ2OzAiCi0gICAgICogZW5jb2Rpbmc9IlVURi04IiYjMDYzOyZndDs8L2NvZGU+KQotICAgICAqIGluY2x1ZGVzIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuIEl0IGlzIGNvbW1vbiB0byBvbWl0Ci0gICAgICogdGhpcyBpbiB1c2VzIHN1Y2ggYXMgV01MIGFuZCBvdGhlciB3aXJlbGVzcyBkZXZpY2UgcHJvdG9jb2xzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9taXRFbmNvZGluZyA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90Ci0gICAgICogICAgICAgIHRoZSBYTUwgZGVjbGFyYXRpb24gc2hvdWxkIGluZGljYXRlIHRoZSBkb2N1bWVudCBlbmNvZGluZy4KLSAgICAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGlzIEZvcm1hdCBmb3IgY2hhaW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9ybWF0IHNldE9taXRFbmNvZGluZyhib29sZWFuIG9taXRFbmNvZGluZykgewotICAgICAgICB0aGlzLm9taXRFbmNvZGluZyA9IG9taXRFbmNvZGluZzsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBYTUwgZGVjbGFyYXRpb24gZW5jb2Rpbmcgd2lsbCBiZSBvbWl0dGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBYTUwgZGVjbGFyYXRpb24gZW5jb2Rpbmcgd2lsbCBiZSBvbWl0dGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T21pdEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gb21pdEVuY29kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgd2hldGhlciB0aGUgWE1MIGRlY2xhcmF0aW9uCi0gICAgICogKDxjb2RlPiZsdDsmIzA2Mzt4bWwgdmVyc2lvbj0iMSYjMDQ2OzAiJiMwNjM7Z3Q7PC9jb2RlPikKLSAgICAgKiB3aWxsIGJlIG9taXR0ZWQgb3Igbm90LiBJdCBpcyBjb21tb24gdG8gb21pdCB0aGlzIGluIHVzZXMgc3VjaAotICAgICAqIGFzIFNPQVAgYW5kIFhNTC1SUEMgY2FsbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb21pdERlY2xhcmF0aW9uIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgd2hldGhlciBvciBub3QKLSAgICAgKiAgICAgICAgdGhlIFhNTCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgb21pdHRlZC4KLSAgICAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGlzIEZvcm1hdCBmb3IgY2hhaW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9ybWF0IHNldE9taXREZWNsYXJhdGlvbihib29sZWFuIG9taXREZWNsYXJhdGlvbikgewotICAgICAgICB0aGlzLm9taXREZWNsYXJhdGlvbiA9IG9taXREZWNsYXJhdGlvbjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBYTUwgZGVjbGFyYXRpb24gd2lsbCBiZSBvbWl0dGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBYTUwgZGVjbGFyYXRpb24gd2lsbCBiZSBvbWl0dGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0T21pdERlY2xhcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gb21pdERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgd2hldGhlciBlbXB0eSBlbGVtZW50cyBhcmUgZXhwYW5kZWQgZnJvbQotICAgICAqIDxjb2RlPiZsdDt0YWdOYW1lLyZndDs8L2NvZGU+IHRvCi0gICAgICogPGNvZGU+Jmx0O3RhZ05hbWUmZ3Q7Jmx0Oy90YWdOYW1lJmd0OzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwYW5kRW1wdHlFbGVtZW50cyA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90Ci0gICAgICogICAgICAgIGVtcHR5IGVsZW1lbnRzIHNob3VsZCBiZSBleHBhbmRlZC4KLSAgICAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGlzIEZvcm1hdCBmb3IgY2hhaW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9ybWF0IHNldEV4cGFuZEVtcHR5RWxlbWVudHMoYm9vbGVhbiBleHBhbmRFbXB0eUVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZXhwYW5kRW1wdHlFbGVtZW50cyA9IGV4cGFuZEVtcHR5RWxlbWVudHM7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBlbXB0eSBlbGVtZW50cyBhcmUgZXhwYW5kZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZW1wdHkgZWxlbWVudHMgYXJlIGV4cGFuZGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW1wdHlFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGV4cGFuZEVtcHR5RWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB3aGV0aGVyIEpBWFAgVHJBWCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBmb3IKLSAgICAgKiBkaXNhYmxpbmcvZW5hYmxpbmcgb3V0cHV0IGVzY2FwaW5nIGFyZSBpZ25vcmVkLiAgRGlzYWJsaW5nCi0gICAgICogb3V0cHV0IGVzY2FwaW5nIGFsbG93cyB1c2luZyBYTUwgdGV4dCBhcyBlbGVtZW50IGNvbnRlbnQgYW5kCi0gICAgICogb3V0cHV0aW5nIGl0IHZlcmJhdGltLCBpJiM0NjtlJiM0NjsgYXMgZWxlbWVudCBjaGlsZHJlbiB3b3VsZCBiZS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHByb2Nlc3NlZCwgdGhlc2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlIHJlbW92ZWQgZnJvbQotICAgICAqIHRoZSBnZW5lcmF0ZWQgWE1MIHRleHQgYW5kIGNvbnRyb2wgd2hldGhlciB0aGUgZWxlbWVudCB0ZXh0Ci0gICAgICogY29udGVudCBpcyBvdXRwdXQgdmVyYmF0aW0gb3Igd2l0aCBlc2NhcGluZyBvZiB0aGUgcHJlLWRlZmluZWQKLSAgICAgKiBlbnRpdGllcyBpbiBYTUwgMS4wLiAgVGhlIHRleHQgdG8gYmUgb3V0cHV0IHZlcmJhdGltIHNoYWxsIGJlCi0gICAgICogc3Vycm91bmRlZCBieSB0aGUKLSAgICAgKiA8Y29kZT4mbHQ7P2phdmF4LnhtbC50cmFuc2Zvcm0uZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmcgPyZndDs8L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPiZsdDs/amF2YXgueG1sLnRyYW5zZm9ybS5lbmFibGUtb3V0cHV0LWVzY2FwaW5nID8mZ3Q7PC9jb2RlPgotICAgICAqIFBJcy48L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2hlbiBpZ25vcmVkLCB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlCi0gICAgICogZ2VuZXJhdGVkIFhNTCB0ZXh0IGFuZCB0aGUgcHJlLWRlZmluZWQgZW50aXRpZXMgaW4gWE1MIDEuMCBhcmUKLSAgICAgKiBlc2NhcGVkLgotICAgICAqIDxwPgotICAgICAqIERlZmF1bHQ6IDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaWdub3JlVHJBWEVzY2FwaW5nUElzIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcKLSAgICAgKiAgICAgICAgd2hldGhlciBvciBub3QgVHJBWCBvdXB1dCBlc2NhcGluZyBQSXMgYXJlIGlnbm9yZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0I1BJX0VOQUJMRV9PVVRQVVRfRVNDQVBJTkcKLSAgICAgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0I1BJX0RJU0FCTEVfT1VUUFVUX0VTQ0FQSU5HCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlVHJBWEVzY2FwaW5nUElzKGJvb2xlYW4gaWdub3JlVHJBWEVzY2FwaW5nUElzKSB7Ci0gICAgICAgIHRoaXMuaWdub3JlVHJBWEVzY2FwaW5nUElzID0gaWdub3JlVHJBWEVzY2FwaW5nUElzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBKQVhQIFRyQVggcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgZm9yCi0gICAgICogZGlzYWJsaW5nL2VuYWJsaW5nIG91dHB1dCBlc2NhcGluZyBhcmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgVHJBWCBvdXB1dCBlc2NhcGluZyBQSXMgYXJlIGlnbm9yZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlVHJBWEVzY2FwaW5nUElzKCkgewotICAgICAgICByZXR1cm4gaWdub3JlVHJBWEVzY2FwaW5nUElzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgc2V0cyB0aGUgdGV4dCBvdXRwdXQgc3R5bGUuICBPcHRpb25zIGFyZSBhdmFpbGFibGUgYXMgc3RhdGljCi0gICAgICoge0BsaW5rIFRleHRNb2RlfSBpbnN0YW5jZXMuICBUaGUgZGVmYXVsdCBpcyB7QGxpbmsgVGV4dE1vZGUjUFJFU0VSVkV9LgotICAgICAqCi0gICAgICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhpcyBGb3JtYXQgZm9yIGNoYWluaW5nCi0gICAgICovCi0gICAgcHVibGljIEZvcm1hdCBzZXRUZXh0TW9kZShGb3JtYXQuVGV4dE1vZGUgbW9kZSkgewotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRleHQgb3V0cHV0IHN0eWxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB0ZXh0IG91dHB1dCBzdHlsZQotICAgICAqLwotICAgIHB1YmxpYyBGb3JtYXQuVGV4dE1vZGUgZ2V0VGV4dE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIGluZGVudCA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHVzZTsgdGhpcwotICAgICAqIGlzIHVzdWFsbHkgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9mIGVtcHR5IHNwYWNlcy4gSWYgeW91IHBhc3MKLSAgICAgKiBudWxsLCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIiksIHRoZW4gbm8gaW5kZW50YXRpb24gd2lsbAotICAgICAqIGhhcHBlbi4gIERlZmF1bHQ6IG5vbmUgKG51bGwpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZW50IDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdXNlIGZvciBpbmRlbnRhdGlvbi4KLSAgICAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGlzIEZvcm1hdCBmb3IgY2hhaW5pbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgRm9ybWF0IHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIC8vIGlmIHBhc3NlZCB0aGUgZW1wdHkgc3RyaW5nLCBjaGFuZ2UgaXQgdG8gbnVsbCwgZm9yIG1hcmdpbmFsCi0gICAgICAgIC8vIHBlcmZvcm1hbmNlIGdhaW5zIGxhdGVyIChjYW4gY29tcGFyZSB0byBudWxsIGZpcnN0IGluc3RlYWQKLSAgICAgICAgLy8gb2YgY2FsbGluZyBlcXVhbHMoKSkKLSAgICAgICAgaWYgKCIiLmVxdWFscyhpbmRlbnQpKSB7Ci0gICAgICAgICAgICBpbmRlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRlbnQgc3RyaW5nIGluIHVzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGluZGVudCBzdHJpbmcgaW4gdXNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbmRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBpbmRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb3V0cHV0IGVuY29kaW5nLiAgVGhlIG5hbWUgc2hvdWxkIGJlIGFuIGFjY2VwdGVkIFhNTAotICAgICAqIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBmb3JtYXQuICBVc2UgWE1MLXN0eWxlIG5hbWVzIGxpa2UKLSAgICAgKiAgICAgICAgICAgICAgICAgIlVURi04IiBvciAiSVNPLTg4NTktMSIgb3IgIlVTLUFTQ0lJIgotICAgICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoaXMgRm9ybWF0IGZvciBjaGFpbmluZwotICAgICAqLwotICAgIHB1YmxpYyBGb3JtYXQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICAgICAgZXNjYXBlU3RyYXRlZ3kgPSBuZXcgRGVmYXVsdEVzY2FwZVN0cmF0ZWd5KGVuY29kaW5nKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJlZCBvdXRwdXQgZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgRm9ybWF0IGZvcm1hdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvcm1hdCA9IChGb3JtYXQpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZm9ybWF0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGNvbW1vbiBjaGFyc2V0cyBxdWlja2x5IGFuZCBlYXNpbHkuICBVc2UgcmVmbGVjdGlvbgotICAgICAqIHRvIHF1ZXJ5IHRoZSBKREsgMS40IENoYXJzZXRFbmNvZGVyIGNsYXNzIGZvciB1bmtub3duIGNoYXJzZXRzLgotICAgICAqIElmIEpESyAxLjQgaXNuJ3QgYXJvdW5kLCBkZWZhdWx0IHRvIG5vIHNwZWNpYWwgZW5jb2RpbmcuCi0gICAgICovCi0gICAgY2xhc3MgRGVmYXVsdEVzY2FwZVN0cmF0ZWd5IGltcGxlbWVudHMgRXNjYXBlU3RyYXRlZ3kgewotICAgICAgICBwcml2YXRlIGludCBiaXRzOwotICAgICAgICBPYmplY3QgZW5jb2RlcjsKLSAgICAgICAgTWV0aG9kIGNhbkVuY29kZTsKLQotICAgICAgICBwdWJsaWMgRGVmYXVsdEVzY2FwZVN0cmF0ZWd5KFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAgICAgaWYgKCJVVEYtOCIuZXF1YWxzSWdub3JlQ2FzZShlbmNvZGluZykgfHwKLSAgICAgICAgICAgICAgICAgICAgIlVURi0xNiIuZXF1YWxzSWdub3JlQ2FzZShlbmNvZGluZykpIHsKLSAgICAgICAgICAgICAgICBiaXRzID0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgiSVNPLTg4NTktMSIuZXF1YWxzSWdub3JlQ2FzZShlbmNvZGluZykgfHwKLSAgICAgICAgICAgICAgICAgICAgIkxhdGluMSIuZXF1YWxzSWdub3JlQ2FzZShlbmNvZGluZykpIHsKLSAgICAgICAgICAgICAgICBiaXRzID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCJVUy1BU0NJSSIuZXF1YWxzSWdub3JlQ2FzZShlbmNvZGluZykgfHwKLSAgICAgICAgICAgICAgICAgICAgIkFTQ0lJIi5lcXVhbHNJZ25vcmVDYXNlKGVuY29kaW5nKSkgewotICAgICAgICAgICAgICAgIGJpdHMgPSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYml0cyA9IDA7Ci0gICAgICAgICAgICAgICAgLy9lbmNvZGVyID0gQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKS5uZXdFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2hhcnNldENsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGVuY29kZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGZvck5hbWUgPSBjaGFyc2V0Q2xhc3MuZ2V0TWV0aG9kKCJmb3JOYW1lIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBjaGFyc2V0T2JqID0gZm9yTmFtZS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde2VuY29kaW5nfSk7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBuZXdFbmNvZGVyID0gY2hhcnNldENsYXNzLmdldE1ldGhvZCgibmV3RW5jb2RlciIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gbmV3RW5jb2Rlci5pbnZva2UoY2hhcnNldE9iaiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbkVuY29kZSA9IGVuY29kZXJDbGFzcy5nZXRNZXRob2QoImNhbkVuY29kZSIsIG5ldyBDbGFzc1tde2NoYXIuY2xhc3N9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRXNjYXBlKGNoYXIgY2gpIHsKLSAgICAgICAgICAgIGlmIChiaXRzID09IDE2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpdHMgPT0gOCkgewotICAgICAgICAgICAgICAgIGlmICgoaW50KSBjaCA+IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYml0cyA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpIGNoID4gMTI3KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjYW5FbmNvZGUgIT0gbnVsbCAmJiBlbmNvZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gdmFsID0gKEJvb2xlYW4pIGNhbkVuY29kZS5pbnZva2UoZW5jb2RlciwgbmV3IE9iamVjdFtde25ldyBDaGFyYWN0ZXIoY2gpfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXZhbC5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgd2UgZG9uJ3Qga25vdy4gIFRoaXMgcmlza3Mgbm90IGVzY2FwaW5nCi0gICAgICAgICAgICAgICAgLy8gdGhpbmdzIHdoaWNoIHNob3VsZCBiZSBlc2NhcGVkLCBidXQgYWxzbyBtZWFucyBwZW9wbGUgd29uJ3QKLSAgICAgICAgICAgICAgICAvLyBzdGFydCBnZXR0aW5nIGxvYWRzIG9mIHVubmVjZXNzYXJ5IGVzY2FwZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDbGFzcyB0byBzaWduaWZ5IGhvdyB0ZXh0IHNob3VsZCBiZSBoYW5kbGVkIG9uIG91dHB1dC4gIFRoZSBmb2xsb3dpbmcKLSAgICAgKiB0YWJsZSBwcm92aWRlcyBkZXRhaWxzLgotICAgICAqCi0gICAgICogPHRhYmxlPgotICAgICAqICAgPHRyPgotICAgICAqICAgICA8dGggYWxpZ249ImxlZnQiPgotICAgICAqICAgICAgIFRleHQgTW9kZQotICAgICAqICAgICA8L3RoPgotICAgICAqICAgICA8dGg+Ci0gICAgICogICAgICAgUmVzdWx0aW5nIGJlaGF2aW9yLgotICAgICAqICAgICA8L3RoPgotICAgICAqICAgPC90cj4KLSAgICAgKgotICAgICAqICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgKiAgICAgPHRkPgotICAgICAqICAgICAgIDxpPlBSRVNFUlZFIChEZWZhdWx0KTwvaT4KLSAgICAgKiAgICAgPC90ZD4KLSAgICAgKiAgICAgPHRkPgotICAgICAqICAgICAgIEFsbCBjb250ZW50IGlzIHByaW50ZWQgaW4gdGhlIGZvcm1hdCBpdCB3YXMgY3JlYXRlZCwgbm8gd2hpdGVzcGFjZQotICAgICAqICAgICAgIG9yIGxpbmUgc2VwYXJhdG9ycyBhcmUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0gICAgICogICAgIDwvdGQ+Ci0gICAgICogICA8L3RyPgotICAgICAqCi0gICAgICogICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAqICAgICA8dGQ+Ci0gICAgICogICAgICAgVFJJTV9GVUxMX1dISVRFCi0gICAgICogICAgIDwvdGQ+Ci0gICAgICogICAgIDx0ZD4KLSAgICAgKiAgICAgICBDb250ZW50IGJldHdlZW4gdGFncyBjb25zaXN0aW5nIG9mIGFsbCB3aGl0ZXNwYWNlIGlzIG5vdCBwcmludGVkLgotICAgICAqICAgICAgIElmIHRoZSBjb250ZW50IGNvbnRhaW5zIGV2ZW4gb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciwgaXQgaXMKLSAgICAgKiAgICAgICBwcmludGVkIHZlcmJhdGltLCB3aGl0ZXNwYWNlIGFuZCBhbGwuCi0gICAgICogICAgIDwvdGQ+Ci0gICAgICogICA8L3RyPgotICAgICAqCi0gICAgICogICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAqICAgICA8dGQ+Ci0gICAgICogICAgICAgVFJJTQotICAgICAqICAgICA8L3RkPgotICAgICAqICAgICA8dGQ+Ci0gICAgICogICAgICAgU2FtZSBhcyBUcmltQWxsV2hpdGUsIHBsdXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGFyZQotICAgICAqICAgICAgIHRyaW1tZWQuCi0gICAgICogICAgIDwvdGQ+Ci0gICAgICogICA8L3RyPgotICAgICAqCi0gICAgICogICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAqICAgICA8dGQ+Ci0gICAgICogICAgICAgTk9STUFMSVpFCi0gICAgICogICAgIDwvdGQ+Ci0gICAgICogICAgIDx0ZD4KLSAgICAgKiAgICAgICBTYW1lIGFzIFRleHRUcmltLCBwbHVzIGFkZGl0aW9uIGludGVyaW9yIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZAotICAgICAqICAgICAgIHRvIGEgc2luZ2xlIHNwYWNlLgotICAgICAqICAgICA8L3RkPgotICAgICAqICAgPC90cj4KLSAgICAgKiA8L3RhYmxlPgotICAgICAqCi0gICAgICogSW4gbW9zdCBjYXNlcyB0ZXh0dWFsIGNvbnRlbnQgaXMgYWxpZ25lZCB3aXRoIHRoZSBzdXJyb3VuZGluZyB0YWdzCi0gICAgICogKGFmdGVyIHRoZSBhcHByb3ByaWF0ZSB0ZXh0IG1vZGUgaXMgYXBwbGllZCkuIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBvbmx5Ci0gICAgICogY29udGVudCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHRhZ3MgaXMgdGV4dHVhbCwgdGhlIHN0YXJ0IHRhZywgdGV4dCwKLSAgICAgKiBhbmQgZW5kIHRhZyBhcmUgYWxsIHByaW50ZWQgb24gdGhlIHNhbWUgbGluZS4gSWYgdGhlIGRvY3VtZW50IGJlaW5nCi0gICAgICogb3V0cHV0IGFscmVhZHkgaGFzIHdoaXRlc3BhY2UsIGl0J3Mgd2lzZSB0byB0dXJuIG9uIFRSSU0gbW9kZSBzbyB0aGUKLSAgICAgKiBwcmUtZXhpc3Rpbmcgd2hpdGVzcGFjZSBjYW4gYmUgdHJpbW1lZCBiZWZvcmUgYWRkaW5nIG5ldyB3aGl0ZXNwYWNlLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYSBlbGVtZW50IGhhcyBhIHhtbDpzcGFjZSBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWUgb2YgInByZXNlcnZlIiwKLSAgICAgKiBhbGwgZm9ybWF0aW5nIGlzIHR1cm5lZCBvZmYgYW5kIHJldmVydHMgYmFjayB0byB0aGUgZGVmYXVsdCB1bnRpbCB0aGUKLSAgICAgKiBlbGVtZW50IGFuZCBpdHMgY29udGVudHMgaGF2ZSBiZWVuIHByaW50ZWQuIElmIGEgbmVzdGVkIGVsZW1lbnQgY29udGFpbnMKLSAgICAgKiBhbm90aGVyIHhtbDpzcGFjZSB3aXRoIHRoZSB2YWx1ZSAiZGVmYXVsdCIgZm9ybWF0dGluZyBpcyB0dXJuZWQgYmFjayBvbgotICAgICAqIGZvciB0aGUgY2hpbGQgZWxlbWVudCBhbmQgdGhlbiBvZmYgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhcmVudAotICAgICAqIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0TW9kZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBNb2RlIGZvciBsaXRlcmFsIHRleHQgcHJlc2VydmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0TW9kZSBQUkVTRVJWRSA9IG5ldyBUZXh0TW9kZSgiUFJFU0VSVkUiKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogTW9kZSBmb3IgdGV4dCB0cmltbWluZyAobGVmdCBhbmQgcmlnaHQgdHJpbSkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRleHRNb2RlIFRSSU0gPSBuZXcgVGV4dE1vZGUoIlRSSU0iKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogTW9kZSBmb3IgdGV4dCBub3JtYWxpemF0aW9uIChsZWZ0IGFuZCByaWdodCB0cmltIHBsdXMgaW50ZXJuYWwKLSAgICAgICAgICogd2hpdGVzcGFjZSBpcyBub3JtYWxpemVkIHRvIGEgc2luZ2xlIHNwYWNlLgotICAgICAgICAgKiBAc2VlIG9yZy5qZG9tLkVsZW1lbnQjZ2V0VGV4dE5vcm1hbGl6ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0TW9kZSBOT1JNQUxJWkUgPSBuZXcgVGV4dE1vZGUoIk5PUk1BTElaRSIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNb2RlIGZvciB0ZXh0IHRyaW1taW5nIG9mIGNvbnRlbnQgY29uc2lzdGluZyBvZiBub3RoaW5nIGJ1dAotICAgICAgICAgKiB3aGl0ZXNwYWNlIGJ1dCBvdGhlcndpc2Ugbm90IGNoYW5naW5nIG91dHB1dC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGV4dE1vZGUgVFJJTV9GVUxMX1dISVRFID0KLSAgICAgICAgICAgICAgICBuZXcgVGV4dE1vZGUoIlRSSU1fRlVMTF9XSElURSIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBUZXh0TW9kZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L0pET01Mb2NhdG9yLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9KRE9NTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTM4ZDYyLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L0pET01Mb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyotLSAKLQotICRJZDogSkRPTUxvY2F0b3IuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLm91dHB1dDsKLQotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTQVgge0BsaW5rIExvY2F0b3J9IGludGVyZmFjZSB0aGF0Ci0gKiBleHBvc2VzIHRoZSBKRE9NIG5vZGUgYmVpbmcgcHJvY2Vzc2VkIGJ5IFNBWE91dHB1dHRlci4KLSAqCi0gKiBAYXV0aG9yIExhdXJlbnQgQmloYW5pYwotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqLwotcHVibGljIGNsYXNzIEpET01Mb2NhdG9yIGV4dGVuZHMgTG9jYXRvckltcGwgewotICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IEpET01Mb2NhdG9yLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqIFRoZSBKRE9NIG5vZGUgYmVpbmcgcHJvY2Vzc2VkIGJ5IFNBWE91dHB1dHRlci4gKi8KLSAgICBwcml2YXRlIE9iamVjdCBub2RlOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBuby1hcmcgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgSkRPTUxvY2F0b3IoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWNrYWdlIHByb3RlY3RlZAotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgY29udHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIDxjb2RlPkxvY2F0b3I8L2NvZGU+IHRvIGNvcHkgbG9jYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tLgotICAgICAqLwotICAgIEpET01Mb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeyAgICAgICAgICAgICAgLy8gcGFja2FnZSBwcm90ZWN0ZWQKLSAgICAgICAgc3VwZXIobG9jYXRvcik7Ci0KLSAgICAgICAgaWYgKGxvY2F0b3IgaW5zdGFuY2VvZiBKRE9NTG9jYXRvcikgewotICAgICAgICAgICAgdGhpcy5zZXROb2RlKCgoSkRPTUxvY2F0b3IpbG9jYXRvcikuZ2V0Tm9kZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpET00gbm9kZSBiZWluZyBwcm9jZXNzZWQgYnkgU0FYT3V0cHV0dGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgSkRPTSBub2RlIGJlaW5nIHByb2Nlc3NlZCBieSBTQVhPdXRwdXR0ZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROb2RlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ub2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJlaW5nLXByb2Nlc3NlZCBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUgPGNvZGU+T2JqZWN0PC9jb2RlPiBub2RlIGN1cnJlbnRseSBwcm9jZXNzZWQKLSAgICAgKiAgICAgICAgICAgICBieSBTQVhPdXRwdXR0ZXIuCi0gICAgICovCi0gICAgdm9pZCBzZXROb2RlKE9iamVjdCBub2RlKSB7ICAgICAgICAgICAgICAgICAvLyBwYWNrYWdlIHByb3RlY3RlZAotICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvTmFtZXNwYWNlU3RhY2suamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L05hbWVzcGFjZVN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2NmYjEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvTmFtZXNwYWNlU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKi0tIAotCi0gJElkOiBOYW1lc3BhY2VTdGFjay5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjAgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIAotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cyAKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0gCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlIAotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MgCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5IAotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotIAotICovCi1wYWNrYWdlIG9yZy5qZG9tLm91dHB1dDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmpkb20uTmFtZXNwYWNlOwotCi0vKioKLSAqIEEgbm9uLXB1YmxpYyB1dGlsaXR5IGNsYXNzIHVzZWQgYnkgYm90aCA8Y29kZT57QGxpbmsgWE1MT3V0cHV0dGVyfTwvY29kZT4gYW5kCi0gKiA8Y29kZT57QGxpbmsgU0FYT3V0cHV0dGVyfTwvY29kZT4gdG8gbWFuYWdlIG5hbWVzcGFjZXMgaW4gYSBKRE9NIERvY3VtZW50Ci0gKiBkdXJpbmcgb3V0cHV0LgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZGUKLSAqIEBhdXRob3IgIEZyZWQgVHJpbWJsZQotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICovCi1jbGFzcyBOYW1lc3BhY2VTdGFjayB7Ci0gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9IAotICAgICAgIkAoIykgJFJDU2ZpbGU6IE5hbWVzcGFjZVN0YWNrLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgLyoqIFRoZSBwcmVmaXhlcyBhdmFpbGFibGUgKi8KLSAgICBwcml2YXRlIFN0YWNrIHByZWZpeGVzOwotCi0gICAgLyoqIFRoZSBVUklzIGF2YWlsYWJsZSAqLwotICAgIHByaXZhdGUgU3RhY2sgdXJpczsgICAgICAgIAotCi0gICAgLyoqCi0gICAgICogVGhpcyBjcmVhdGVzIHRoZSBuZWVkZWQgc3RvcmFnZS4KLSAgICAgKi8KLSAgICBOYW1lc3BhY2VTdGFjaygpIHsKLSAgICAgICAgcHJlZml4ZXMgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgdXJpcyA9IG5ldyBTdGFjaygpOwotICAgIH0KLSAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGFkZCBhIG5ldyA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4KLSAgICAgKiB0byB0aG9zZSBjdXJyZW50bHkgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBucyA8Y29kZT5OYW1lc3BhY2U8L2NvZGU+IHRvIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXNoKE5hbWVzcGFjZSBucykgewotICAgICAgICBwcmVmaXhlcy5wdXNoKG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgdXJpcy5wdXNoKG5zLmdldFVSSSgpKTsKLSAgICB9ICAgICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJlbW92ZSB0aGUgdG9wbW9zdCAobW9zdCByZWNlbnRseSBhZGRlZCkKLSAgICAgKiA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4sIGFuZCByZXR1cm4gaXRzIHByZWZpeC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIHRoZSBwb3BwZWQgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHBvcCgpIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpcHJlZml4ZXMucG9wKCk7Ci0gICAgICAgIHVyaXMucG9wKCk7Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIG5hbWVzcGFjZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmludDwvY29kZT4gLSBzaXplIG9mIHRoZSBuYW1lc3BhY2Ugc3RhY2suCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gcHJlZml4ZXMuc2l6ZSgpOyAgICAgCi0gICAgfSAgICAKLSAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBwcmVmaXgsIHRoaXMgd2lsbCByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkgbW9zdCAKLSAgICAgKiByZW5jZW50bHkgKHRvcG1vc3QpIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByZWZpeC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXggPGNvZGU+U3RyaW5nPC9jb2RlPiBuYW1lc3BhY2UgcHJlZml4LgotICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiAtIHRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGF0IHByZWZpeC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIGludCBpbmRleCA9IHByZWZpeGVzLmxhc3RJbmRleE9mKHByZWZpeCk7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpdXJpcy5lbGVtZW50QXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gdXJpOyAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHByaW50IG91dCB0aGUgc2l6ZSBhbmQgY3VycmVudCBzdGFjaywgZnJvbSB0aGUKLSAgICAgKiBtb3N0IHJlY2VudGx5IGFkZGVkIDxjb2RlPntAbGluayBOYW1lc3BhY2V9PC9jb2RlPiB0bwotICAgICAqIHRoZSAib2xkZXN0LCIgYWxsIHRvIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlN0YWNrOiAiICsgcHJlZml4ZXMuc2l6ZSgpICsgc2VwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgYnVmLmFwcGVuZChwcmVmaXhlcy5lbGVtZW50QXQoaSkgKyAiJiIgKyB1cmlzLmVsZW1lbnRBdChpKSArIHNlcCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvU0FYT3V0cHV0dGVyLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9TQVhPdXRwdXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwMmQ5ZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9TQVhPdXRwdXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjQgKzAsMCBAQAotLyotLQotCi0gJElkOiBTQVhPdXRwdXR0ZXIuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20ub3V0cHV0OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotCi0vKioKLSAqIE91dHB1dHMgYSBKRE9NIGRvY3VtZW50IGFzIGEgc3RyZWFtIG9mIFNBWDIgZXZlbnRzLgotICogPHA+Ci0gKiBNb3N0IENvbnRlbnRIYW5kbGVyIGNhbGxiYWNrcyBhcmUgc3VwcG9ydGVkLiBCb3RoCi0gKiA8Y29kZT5pZ25vcmFibGVXaGl0ZXNwYWNlKCk8L2NvZGU+IGFuZCA8Y29kZT5za2lwcGVkRW50aXR5KCk8L2NvZGU+IGhhdmUgbm90Ci0gKiBiZWVuIGltcGxlbWVudGVkLiBUaGUgPGNvZGU+e0BsaW5rIEpET01Mb2NhdG9yfTwvY29kZT4gY2xhc3MgcmV0dXJuZWQgYnkKLSAqIDxjb2RlPntAbGluayAjZ2V0TG9jYXRvcn08L2NvZGU+IGV4cG9zZXMgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBvcGVyYXRlZAotICogdXBvbi4KLSAqIDxwPgotICogQXQgdGhpcyB0aW1lLCBpdCBpcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIG5vdGF0aW9ucyBhbmQgdW5wYXJzZWQgZW50aXR5Ci0gKiByZWZlcmVuY2VzIGluIGEgRFREIGZyb20gSkRPTS4gVGhlcmVmb3JlLCA8Y29kZT5EVERIYW5kbGVyPC9jb2RlPiBjYWxsYmFja3MKLSAqIGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgotICogPHA+Ci0gKiBUaGUgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPiBjYWxsYmFja3MgaGF2ZSBub3QgYmVlbiBpbXBsZW1lbnRlZCwgc2luY2UKLSAqIHRoZXNlIGFyZSBzdXBwb3NlZCB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGRvY3VtZW50IGlzIHBhcnNlZCBhbmQgYXQgdGhpcwotICogcG9pbnQgdGhlIGRvY3VtZW50IGV4aXN0cyBpbiBtZW1vcnkgYW5kIGlzIGtub3duIHRvIGhhdmUgbm8gZXJyb3JzLiA8L3A+Ci0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJAotICogQGF1dGhvciAgQnJldHQgTWNMYXVnaGxpbgotICogQGF1dGhvciAgSmFzb24gSHVudGVyCi0gKiBAYXV0aG9yICBGcmVkIFRyaW1ibGUKLSAqIEBhdXRob3IgIEJyYWRsZXkgUy4gSHVmZm1hbgotICovCi1wdWJsaWMgY2xhc3MgU0FYT3V0cHV0dGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IFNBWE91dHB1dHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAgIC8qKiBTaG9ydGN1dCBmb3IgU0FYIG5hbWVzcGFjZXMgY29yZSBmZWF0dXJlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfU0FYX0ZFQVRVUkUgPQotICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIjsKLQotICAgIC8qKiBTaG9ydGN1dCBmb3IgU0FYIG5hbWVzcGFjZS1wcmVmaXhlcyBjb3JlIGZlYXR1cmUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYRVNfU0FYX0ZFQVRVUkUgPQotICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiOwotCi0gICAgLyoqIFNob3J0Y3V0IGZvciBTQVggdmFsaWRhdGlvbiBjb3JlIGZlYXR1cmUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9TQVhfRkVBVFVSRSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iOwotCi0gICAgLyoqIFNob3J0Y3V0IGZvciBTQVgtZXh0LiBsZXhpY2FsIGhhbmRsZXIgcHJvcGVydHkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVYSUNBTF9IQU5ETEVSX1NBWF9QUk9QRVJUWSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIjsKLQotICAgIC8qKiBTaG9ydGN1dCBmb3IgU0FYLWV4dC4gZGVjbGFyYXRpb24gaGFuZGxlciBwcm9wZXJ0eSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMX0hBTkRMRVJfU0FYX1BST1BFUlRZID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIjsKLQotICAgIC8qKgotICAgICAqIFNob3J0Y3V0IGZvciBTQVgtZXh0LiBsZXhpY2FsIGhhbmRsZXIgYWx0ZXJuYXRlIHByb3BlcnR5LgotICAgICAqIEFsdGhvdWdoIHRoaXMgcHJvcGVydHkgVVJJIGlzIG5vdCB0aGUgb25lIGRlZmluZWQgYnkgdGhlIFNBWAotICAgICAqICJzdGFuZGFyZCIsIHNvbWUgcGFyc2VycyB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgb2ZmaWNpYWwgb25lLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVhJQ0FMX0hBTkRMRVJfQUxUX1BST1BFUlRZID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvTGV4aWNhbEhhbmRsZXIiOwotCi0gICAgLyoqIFNob3J0Y3V0IGZvciBTQVgtZXh0LiBkZWNsYXJhdGlvbiBoYW5kbGVyIGFsdGVybmF0ZSBwcm9wZXJ0eSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMX0hBTkRMRVJfQUxUX1BST1BFUlRZID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvaGFuZGxlcnMvRGVjbEhhbmRsZXIiOwotCi0gICAgLyoqCi0gICAgICogQXJyYXkgdG8gbWFwIEpET00gYXR0cmlidXRlIHR5cGUgKGFzIGVudHJ5IGluZGV4KSB0byBTQVgKLSAgICAgKiBhdHRyaWJ1dGUgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhdHRyVHlwZVRvTmFtZU1hcCA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICJDREFUQSIsICAgICAgICAvLyBBdHRyaWJ1dGUuVU5ERUZJTkVEX0FUVFJJQlVURSwgYXMgcGVyIFNBWCAyLjAgc3BlYy4KLSAgICAgICAgIkNEQVRBIiwgICAgICAgIC8vIEF0dHJpYnV0ZS5DREFUQV9UWVBFCi0gICAgICAgICJJRCIsICAgICAgICAgICAvLyBBdHRyaWJ1dGUuSURfVFlQRQotICAgICAgICAiSURSRUYiLCAgICAgICAgLy8gQXR0cmlidXRlLklEUkVGX1RZUEUKLSAgICAgICAgIklEUkVGUyIsICAgICAgIC8vIEF0dHJpYnV0ZS5JRFJFRlNfVFlQRQotICAgICAgICAiRU5USVRZIiwgICAgICAgLy8gQXR0cmlidXRlLkVOVElUWV9UWVBFCi0gICAgICAgICJFTlRJVElFUyIsICAgICAvLyBBdHRyaWJ1dGUuRU5USVRJRVNfVFlQRQotICAgICAgICAiTk1UT0tFTiIsICAgICAgLy8gQXR0cmlidXRlLk5NVE9LRU5fVFlQRQotICAgICAgICAiTk1UT0tFTlMiLCAgICAgLy8gQXR0cmlidXRlLk5NVE9LRU5TX1RZUEUKLSAgICAgICAgIk5PVEFUSU9OIiwgICAgIC8vIEF0dHJpYnV0ZS5OT1RBVElPTl9UWVBFCi0gICAgICAgICJOTVRPS0VOIiwgICAgICAvLyBBdHRyaWJ1dGUuRU5VTUVSQVRFRF9UWVBFLCBhcyBwZXIgU0FYIDIuMCBzcGVjLgotICAgIH07Ci0KLSAgICAvKiogcmVnaXN0ZXJlZCA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4gKi8KLSAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyOwotCi0gICAgLyoqIHJlZ2lzdGVyZWQgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPiAqLwotICAgIHByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLQotICAgIC8qKiByZWdpc3RlcmVkIDxjb2RlPkRUREhhbmRsZXI8L2NvZGU+ICovCi0gICAgcHJpdmF0ZSBEVERIYW5kbGVyIGR0ZEhhbmRsZXI7Ci0KLSAgICAvKiogcmVnaXN0ZXJlZCA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4gKi8KLSAgICBwcml2YXRlIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotCi0gICAgLyoqIHJlZ2lzdGVyZWQgPGNvZGU+TGV4aWNhbEhhbmRsZXI8L2NvZGU+ICovCi0gICAgcHJpdmF0ZSBMZXhpY2FsSGFuZGxlciBsZXhpY2FsSGFuZGxlcjsKLQotICAgIC8qKiByZWdpc3RlcmVkIDxjb2RlPkRlY2xIYW5kbGVyPC9jb2RlPiAqLwotICAgIHByaXZhdGUgRGVjbEhhbmRsZXIgZGVjbEhhbmRsZXI7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRvIHJlcG9ydCBhdHRyaWJ1dGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcyB4bWxucyBhdHRyaWJ1dGVzLgotICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhcyBwZXIgU0FYIHNwZWNpZmljYXRpb25zLgotICAgICAqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYL0phdmEvbmFtZXNwYWNlcy5odG1sIj4KLSAgICAgKiAgU0FYIG5hbWVzcGFjZSBzcGVjaWZpY2F0aW9uczwvYT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjbGFyZU5hbWVzcGFjZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gcmVwb3J0IERURCBldmVudHMgdG8gRGVjbEhhbmRsZXJzIGFuZCBMZXhpY2FsSGFuZGxlcnMuCi0gICAgICogRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydER0ZEV2ZW50cyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBBIFNBWCBMb2NhdG9yIHRoYXQgcG9pbnRzIGF0IHRoZSBKRE9NIG5vZGUgY3VycmVudGx5IGJlaW5nCi0gICAgICogb3V0cHV0dGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSkRPTUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgPGNvZGU+U0FYT3V0cHV0dGVyPC9jb2RlPiB3aXRob3V0IGFueQotICAgICAqIHJlZ2lzdGVyZWQgaGFuZGxlci4gIFRoZSBhcHBsaWNhdGlvbiBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvcgotICAgICAqIHJlZ2lzdGVyaW5nIHRoZW0gdXNpbmcgdGhlIDxjb2RlPnNldFh4eEhhbmRsZXIoKTwvY29kZT4gbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYT3V0cHV0dGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSA8Y29kZT5TQVhPdXRwdXR0ZXI8L2NvZGU+IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SGFuZGxlciBjb250YWlucyA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4KLSAgICAgKiBjYWxsYmFjayBtZXRob2RzCi0gICAgICovCi0gICAgcHVibGljIFNBWE91dHB1dHRlcihDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlcikgewotICAgICAgICB0aGlzKGNvbnRlbnRIYW5kbGVyLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgPGNvZGU+U0FYT3V0cHV0dGVyPC9jb2RlPiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBTQVgyIGhhbmRsZXJzLiBBdCB0aGlzIHRpbWUsIG9ubHkgPGNvZGU+Q29udGVudEhhbmRsZXI8L2NvZGU+Ci0gICAgICogYW5kIDxjb2RlPkVudGl0eVJlc29sdmVyPC9jb2RlPiBhcmUgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRIYW5kbGVyIGNvbnRhaW5zIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPgotICAgICAqIGNhbGxiYWNrIG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIGNvbnRhaW5zIDxjb2RlPkVycm9ySGFuZGxlcjwvY29kZT4gY2FsbGJhY2sgbWV0aG9kcwotICAgICAqIEBwYXJhbSBkdGRIYW5kbGVyIGNvbnRhaW5zIDxjb2RlPkRUREhhbmRsZXI8L2NvZGU+IGNhbGxiYWNrIG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgY29udGFpbnMgPGNvZGU+RW50aXR5UmVzb2x2ZXI8L2NvZGU+Ci0gICAgICogY2FsbGJhY2sgbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyBTQVhPdXRwdXR0ZXIoQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvckhhbmRsZXIgICBlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEVERIYW5kbGVyICAgICBkdGRIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcyhjb250ZW50SGFuZGxlciwgZXJyb3JIYW5kbGVyLCBkdGRIYW5kbGVyLCBlbnRpdHlSZXNvbHZlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIDxjb2RlPlNBWE91dHB1dHRlcjwvY29kZT4gd2l0aCB0aGUKLSAgICAgKiBzcGVjaWZpZWQgU0FYMiBoYW5kbGVycy4gQXQgdGhpcyB0aW1lLCBvbmx5IDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPgotICAgICAqIGFuZCA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4gYXJlIHN1cHBvcnRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SGFuZGxlciBjb250YWlucyA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4KLSAgICAgKiBjYWxsYmFjayBtZXRob2RzCi0gICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBjb250YWlucyA8Y29kZT5FcnJvckhhbmRsZXI8L2NvZGU+IGNhbGxiYWNrIG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gZHRkSGFuZGxlciBjb250YWlucyA8Y29kZT5EVERIYW5kbGVyPC9jb2RlPiBjYWxsYmFjayBtZXRob2RzCi0gICAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyIGNvbnRhaW5zIDxjb2RlPkVudGl0eVJlc29sdmVyPC9jb2RlPgotICAgICAqIGNhbGxiYWNrIG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gbGV4aWNhbEhhbmRsZXIgY29udGFpbnMgPGNvZGU+TGV4aWNhbEhhbmRsZXI8L2NvZGU+IGNhbGxiYWNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FYT3V0cHV0dGVyKENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JIYW5kbGVyICAgZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRFRESGFuZGxlciAgICAgZHRkSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTGV4aWNhbEhhbmRsZXIgbGV4aWNhbEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOwotICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKLSAgICAgICAgdGhpcy5kdGRIYW5kbGVyID0gZHRkSGFuZGxlcjsKLSAgICAgICAgdGhpcy5lbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyOwotICAgICAgICB0aGlzLmxleGljYWxIYW5kbGVyID0gbGV4aWNhbEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgPGNvZGU+Q29udGVudEhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRIYW5kbGVyIGNvbnRhaW5zIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPgotICAgICAqIGNhbGxiYWNrIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5jb250ZW50SGFuZGxlciA9IGNvbnRlbnRIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgPGNvZGU+Q29udGVudEhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgY29udGFpbnMgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPiBjYWxsYmFjayBtZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCA8Y29kZT5FcnJvckhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCA8Y29kZT5FcnJvckhhbmRsZXI8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3YXMgcmVnaXN0ZXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIDxjb2RlPkRUREhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGR0ZEhhbmRsZXIgY29udGFpbnMgPGNvZGU+RFRESGFuZGxlcjwvY29kZT4gY2FsbGJhY2sgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREVERIYW5kbGVyKERUREhhbmRsZXIgZHRkSGFuZGxlcikgewotICAgICAgICB0aGlzLmR0ZEhhbmRsZXIgPSBkdGRIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCA8Y29kZT5EVERIYW5kbGVyPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgPGNvZGU+RFRESGFuZGxlcjwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBEVERIYW5kbGVyIGdldERUREhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmR0ZEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgPGNvZGU+RW50aXR5UmVzb2x2ZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyIGNvbnRhaW5zIEVudGl0eVJlc29sdmVyIGNhbGxiYWNrIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5lbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPkVudGl0eVJlc29sdmVyPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSA8Y29kZT5MZXhpY2FsSGFuZGxlcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV4aWNhbEhhbmRsZXIgY29udGFpbnMgbGV4aWNhbCBjYWxsYmFjayBtZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExleGljYWxIYW5kbGVyKExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMubGV4aWNhbEhhbmRsZXIgPSBsZXhpY2FsSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJlZ2lzdGVyZWQgPGNvZGU+TGV4aWNhbEhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCA8Y29kZT5MZXhpY2FsSGFuZGxlcjwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBMZXhpY2FsSGFuZGxlciBnZXRMZXhpY2FsSGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGV4aWNhbEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgPGNvZGU+RGVjbEhhbmRsZXI8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGRlY2xIYW5kbGVyIGNvbnRhaW5zIGRlY2xhcmF0aW9uIGNhbGxiYWNrIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVjbEhhbmRsZXIoRGVjbEhhbmRsZXIgZGVjbEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5kZWNsSGFuZGxlciA9IGRlY2xIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCA8Y29kZT5EZWNsSGFuZGxlcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPkRlY2xIYW5kbGVyPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIERlY2xIYW5kbGVyIGdldERlY2xIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kZWNsSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYXR0cmlidXRlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgc2hhbGwgYmUgcmVwb3J0ZWQgYXMKLSAgICAgKiAieG1sbnMiIGF0dHJpYnV0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYXR0cmlidXRlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgc2hhbGwgYmUgcmVwb3J0ZWQgYXMKLSAgICAgKiAieG1sbnMiIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVwb3J0TmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgewotICAgICAgICByZXR1cm4gZGVjbGFyZU5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGRlZmluZSB3aGV0aGVyIGF0dHJpYnV0ZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHNoYWxsIGJlCi0gICAgICogcmVwb3J0ZWQgYXMgInhtbG5zIiBhdHRyaWJ1dGVzLiAgVGhpcyBmbGFnIGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqIGFuZCBiZWhhdmVzIGFzIHRoZSAibmFtZXNwYWNlLXByZWZpeGVzIiBTQVggY29yZSBmZWF0dXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlY2xhcmVOYW1lc3BhY2VzIHdoZXRoZXIgYXR0cmlidXRlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKLSAgICAgKiBzaGFsbCBiZSByZXBvcnRlZCBhcyAieG1sbnMiIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVwb3J0TmFtZXNwYWNlRGVjbGFyYXRpb25zKGJvb2xlYW4gZGVjbGFyZU5hbWVzcGFjZXMpIHsKLSAgICAgICAgdGhpcy5kZWNsYXJlTmFtZXNwYWNlcyA9IGRlY2xhcmVOYW1lc3BhY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBEVEQgZXZlbnRzIHdpbGwgYmUgcmVwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgRFREIGV2ZW50cyB3aWxsIGJlIHJlcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVwb3J0RFRERXZlbnRzKCkgewotICAgICAgICByZXR1cm4gcmVwb3J0RHRkRXZlbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBkZWZpbmUgd2hldGhlciB0byByZXBvcnQgRFREIGV2ZW50cyB0byBTQVggRGVjbEhhbmRsZXJzCi0gICAgICogYW5kIExleGljYWxIYW5kbGVycyBpZiB0aGVzZSBoYW5kbGVycyBhcmUgcmVnaXN0ZXJlZCBhbmQgdGhlCi0gICAgICogZG9jdW1lbnQgdG8gb3V0cHV0IGluY2x1ZGVzIGEgRG9jVHlwZSBkZWNsYXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXBvcnREdGRFdmVudHMgd2hldGhlciB0byBub3RpZnkgRFREIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBvcnREVERFdmVudHMoYm9vbGVhbiByZXBvcnREdGRFdmVudHMpIHsKLSAgICAgICAgdGhpcy5yZXBvcnREdGRFdmVudHMgPSByZXBvcnREdGRFdmVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgc3RhdGUgb2YgYSBTQVggZmVhdHVyZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgWE1MUmVhZGVycyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBzZXR0aW5nIHRvIHRydWUgYW5kIHRvIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTQVhPdXRwdXR0ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgU0FYIGNvcmUgZmVhdHVyZXM6Ci0gICAgICogPGRsPgotICAgICAqICA8ZHQ+PGNvZGU+aHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXM8L2NvZGU+PC9kdD4KLSAgICAgKiAgIDxkZD48c3Ryb25nPmRlc2NyaXB0aW9uOjwvc3Ryb25nPiA8Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMKLSAgICAgKiAgICAgICBuYW1lc3BhY2UgVVJJcyBhbmQgdW5wcmVmaXhlZCBsb2NhbCBuYW1lcyBmb3IgZWxlbWVudCBhbmQKLSAgICAgKiAgICAgICBhdHRyaWJ1dGUgbmFtZXMgd2lsbCBiZSBhdmFpbGFibGU8L2RkPgotICAgICAqICAgPGRkPjxzdHJvbmc+YWNjZXNzOjwvc3Ryb25nPiByZWFkL3dyaXRlLCBidXQgYWx3YXlzCi0gICAgICogICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4hPC9kZD4KLSAgICAgKiAgPGR0Pjxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXM8L2NvZGU+PC9kdD4KLSAgICAgKiAgIDxkZD48c3Ryb25nPmRlc2NyaXB0aW9uOjwvc3Ryb25nPiA8Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMKLSAgICAgKiAgICAgICBYTUwgMS4wIG5hbWVzICh3aXRoIHByZWZpeGVzKSBhbmQgYXR0cmlidXRlcyAoaW5jbHVkaW5nIHhtbG5zKgotICAgICAqICAgICAgIGF0dHJpYnV0ZXMpIHdpbGwgYmUgYXZhaWxhYmxlPC9kZD4KLSAgICAgKiAgIDxkZD48c3Ryb25nPmFjY2Vzczo8L3N0cm9uZz4gcmVhZC93cml0ZTwvZGQ+Ci0gICAgICogIDxkdD48Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbjwvY29kZT48L2R0PgotICAgICAqICAgPGRkPjxzdHJvbmc+ZGVzY3JpcHRpb246PC9zdHJvbmc+IGNvbnRyb2xzIHdoZXRoZXIgU0FYT3V0cHV0dGVyCi0gICAgICogICAgICAgaXMgcmVwb3J0aW5nIERURC1yZWxhdGVkIGV2ZW50czsgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZQotICAgICAqICAgICAgIERvY1R5cGUgaW50ZXJuYWwgc3Vic2V0IHdpbGwgYmUgcGFyc2VkIHRvIGZpcmUgRFREIGV2ZW50czwvZGQ+Ci0gICAgICogICA8ZGQ+PHN0cm9uZz5hY2Nlc3M6PC9zdHJvbmc+IHJlYWQvd3JpdGUsIGRlZmF1bHRzIHRvCi0gICAgICogICAgICAgPGNvZGU+dHJ1ZTwvY29kZT48L2RkPgotICAgICAqIDwvZGw+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIDxjb2RlPlN0cmluZzwvY29kZT4gdGhlIGZlYXR1cmUgbmFtZSwgd2hpY2ggaXMgYQotICAgICAqICAgICAgICAgICAgICBmdWxseS1xdWFsaWZpZWQgVVJJLgotICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0aGUgcmVxdWVzdGVkIHN0YXRlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBmZWF0dXJlICh0cnVlIG9yIGZhbHNlKS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiB3aGVuIFNBWE91dHB1dHRlciBkb2VzIG5vdAotICAgICAqICAgICAgICAgcmVjb2duaXplIHRoZSBmZWF0dXJlIG5hbWUuCi0gICAgICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gIHdoZW4gU0FYT3V0cHV0dGVyIHJlY29nbml6ZXMKLSAgICAgKiAgICAgICAgIHRoZSBmZWF0dXJlIG5hbWUgYnV0IGNhbm5vdCBzZXQgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoTlNfUFJFRklYRVNfU0FYX0ZFQVRVUkUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBOYW1lc3BhY2UgcHJlZml4IGRlY2xhcmF0aW9ucy4KLSAgICAgICAgICAgIHRoaXMuc2V0UmVwb3J0TmFtZXNwYWNlRGVjbGFyYXRpb25zKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChOQU1FU1BBQ0VTX1NBWF9GRUFUVVJFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVzcGFjZXMgZmVhdHVyZSBhbHdheXMgc3VwcG9ydGVkIGJ5IFNBWE91dHB1dHRlci4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRWxzZTogdHJ1ZSBpcyBPSyEKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChWQUxJREFUSU9OX1NBWF9GRUFUVVJFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgRFREIGV2ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSZXBvcnREVERFdmVudHModmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IGEgc3VwcG9ydGVkIGZlYXR1cmUuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBhIFNBWCBmZWF0dXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGUgZmVhdHVyZSBuYW1lLCB3aGljaCBpcyBhCi0gICAgICogICAgICAgICAgICAgZnVsbHktcXVhbGlmaWVkIFVSSS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmZWF0dXJlCi0gICAgICogICAgICAgICAodHJ1ZSBvciBmYWxzZSkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gd2hlbiBTQVhPdXRwdXR0ZXIgZG9lcyBub3QKLSAgICAgKiAgICAgICAgIHJlY29nbml6ZSB0aGUgZmVhdHVyZSBuYW1lLgotICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uICB3aGVuIFNBWE91dHB1dHRlciByZWNvZ25pemVzCi0gICAgICogICAgICAgICB0aGUgZmVhdHVyZSBuYW1lIGJ1dCBkZXRlcm1pbmUgaXRzIHZhbHVlIGF0IHRoaXMgdGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoTlNfUFJFRklYRVNfU0FYX0ZFQVRVUkUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBOYW1lc3BhY2UgcHJlZml4IGRlY2xhcmF0aW9ucy4KLSAgICAgICAgICAgIHJldHVybiAodGhpcy5kZWNsYXJlTmFtZXNwYWNlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoTkFNRVNQQUNFU19TQVhfRkVBVFVSRS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBOYW1lc3BhY2VzIGZlYXR1cmUgYWx3YXlzIHN1cHBvcnRlZCBieSBTQVhPdXRwdXR0ZXIuCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChWQUxJREFUSU9OX1NBWF9GRUFUVVJFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgRFREIGV2ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJlcG9ydER0ZEV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYSBzdXBwb3J0ZWQgZmVhdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB0aGUgdmFsdWUgb2YgYSBTQVggcHJvcGVydHkuCi0gICAgICogVGhpcyBtZXRob2QgaXMgYWxzbyB0aGUgc3RhbmRhcmQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIGV4dGVuZGVkCi0gICAgICogaGFuZGxlcnMuCi0gICAgICogPHA+Ci0gICAgICogU0FYT3V0cHV0dGVyIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIFNBWCBwcm9wZXJ0aWVzOgotICAgICAqIDxkbD4KLSAgICAgKiAgPGR0Pjxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlcjwvY29kZT48L2R0PgotICAgICAqICAgPGRkPjxzdHJvbmc+ZGF0YSB0eXBlOjwvc3Ryb25nPgotICAgICAqICAgICAgIDxjb2RlPm9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjwvY29kZT48L2RkPgotICAgICAqICAgPGRkPjxzdHJvbmc+ZGVzY3JpcHRpb246PC9zdHJvbmc+IEFuIG9wdGlvbmFsIGV4dGVuc2lvbiBoYW5kbGVyIGZvcgotICAgICAqICAgICAgIGxleGljYWwgZXZlbnRzIGxpa2UgY29tbWVudHMuPC9kZD4KLSAgICAgKiAgIDxkZD48c3Ryb25nPmFjY2Vzczo8L3N0cm9uZz4gcmVhZC93cml0ZTwvZGQ+Ci0gICAgICogIDxkdD48Y29kZT5odHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyPC9jb2RlPjwvZHQ+Ci0gICAgICogICA8ZGQ+PHN0cm9uZz5kYXRhIHR5cGU6PC9zdHJvbmc+Ci0gICAgICogICAgICAgPGNvZGU+b3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyPC9jb2RlPjwvZGQ+Ci0gICAgICogICA8ZGQ+PHN0cm9uZz5kZXNjcmlwdGlvbjo8L3N0cm9uZz4gQW4gb3B0aW9uYWwgZXh0ZW5zaW9uIGhhbmRsZXIgZm9yCi0gICAgICogICAgICAgRFRELXJlbGF0ZWQgZXZlbnRzIG90aGVyIHRoYW4gbm90YXRpb25zIGFuZCB1bnBhcnNlZCBlbnRpdGllcy48L2RkPgotICAgICAqICAgPGRkPjxzdHJvbmc+YWNjZXNzOjwvc3Ryb25nPiByZWFkL3dyaXRlPC9kZD4KLSAgICAgKiA8L2RsPgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoZSBwcm9wZXJ0eSBuYW1lLCB3aGljaCBpcyBhCi0gICAgICogICAgICAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBVUkkuCi0gICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPk9iamVjdDwvY29kZT4gdGhlIHJlcXVlc3RlZCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHdoZW4gU0FYT3V0cHV0dGVyIGRvZXMgbm90IHJlY29nbml6ZQotICAgICAqICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gIHdoZW4gU0FYT3V0cHV0dGVyIHJlY29nbml6ZXMgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBuYW1lIGJ1dCBjYW5ub3Qgc2V0IHRoZSByZXF1ZXN0ZWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChMRVhJQ0FMX0hBTkRMRVJfU0FYX1BST1BFUlRZLmVxdWFscyhuYW1lKSkgfHwKLSAgICAgICAgICAgIChMRVhJQ0FMX0hBTkRMRVJfQUxUX1BST1BFUlRZLmVxdWFscyhuYW1lKSkpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0TGV4aWNhbEhhbmRsZXIoKExleGljYWxIYW5kbGVyKXZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoREVDTF9IQU5ETEVSX1NBWF9QUk9QRVJUWS5lcXVhbHMobmFtZSkpIHx8Ci0gICAgICAgICAgICAgICAgKERFQ0xfSEFORExFUl9BTFRfUFJPUEVSVFkuZXF1YWxzKG5hbWUpKSkgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVjbEhhbmRsZXIoKERlY2xIYW5kbGVyKXZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGxvb2sgdXAgdGhlIHZhbHVlIG9mIGEgU0FYIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGUgcHJvcGVydHkgbmFtZSwgd2hpY2ggaXMgYQotICAgICAqICAgICAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBVUkkuCi0gICAgICogQHJldHVybiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiB3aGVuIFNBWE91dHB1dHRlciBkb2VzIG5vdCByZWNvZ25pemUKLSAgICAgKiAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uICB3aGVuIFNBWE91dHB1dHRlciByZWNvZ25pemVzIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgbmFtZSBidXQgY2Fubm90IGRldGVybWluZSBpdHMgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoTEVYSUNBTF9IQU5ETEVSX1NBWF9QUk9QRVJUWS5lcXVhbHMobmFtZSkpIHx8Ci0gICAgICAgICAgICAoTEVYSUNBTF9IQU5ETEVSX0FMVF9QUk9QRVJUWS5lcXVhbHMobmFtZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMZXhpY2FsSGFuZGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChERUNMX0hBTkRMRVJfU0FYX1BST1BFUlRZLmVxdWFscyhuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAoREVDTF9IQU5ETEVSX0FMVF9QUk9QRVJUWS5lcXVhbHMobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVjbEhhbmRsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgb3V0cHV0IHRoZSA8Y29kZT5KRE9NIERvY3VtZW50PC9jb2RlPiwgZmlyaW5nIG9mZiB0aGUKLSAgICAgKiBTQVggZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgPGNvZGU+SkRPTSBEb2N1bWVudDwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnRlbnRIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcigpCi0gICAgICAgIGRvY3VtZW50TG9jYXRvcihkb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQoKTsKLQotICAgICAgICAvLyBGaXJlIERURCBldmVudHMKLSAgICAgICAgaWYgKHRoaXMucmVwb3J0RHRkRXZlbnRzKSB7Ci0gICAgICAgICAgIGR0ZEV2ZW50cyhkb2N1bWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50LCBhcyB3ZWxsIGFzIGFueSByb290IGxldmVsCi0gICAgICAgIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tZW50cwotICAgICAgICBJdGVyYXRvciBpID0gZG9jdW1lbnQuZ2V0Q29udGVudCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgbG9jYXRvcgotICAgICAgICAgICAgbG9jYXRvci5zZXROb2RlKG9iaik7Ci0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByb290IGVsZW1lbnQgYW5kIGl0cyBjb250ZW50Ci0gICAgICAgICAgICAgICAgZWxlbWVudChkb2N1bWVudC5nZXRSb290RWxlbWVudCgpLCBuZXcgTmFtZXNwYWNlU3RhY2soKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBjb250ZW50SGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKQotICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgICAgIC8vIGxleGljYWxIYW5kbGVyLmNvbW1lbnQoKQotICAgICAgICAgICAgICAgIGNvbW1lbnQoKChDb21tZW50KSBvYmopLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpCi0gICAgICAgIGVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIG91dHB1dCBhIGxpc3Qgb2YgSkRPTSBub2RlcyBhcyBhIGRvY3VtZW50LCBmaXJpbmcKLSAgICAgKiBvZmYgdGhlIFNBWCBldmVudHMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiA8c3Ryb25nPldhcm5pbmc8L3N0cm9uZz46IFRoaXMgbWV0aG9kIG1heSBvdXRwdXQgaWxsLWZvcm1lZCBYTUwKLSAgICAgKiBkb2N1bWVudHMgaWYgdGhlIGxpc3QgY29udGFpbnMgdG9wLWxldmVsIG9iamVjdHMgdGhhdCBhcmUgbm90Ci0gICAgICogbGVnYWwgYXQgdGhlIGRvY3VtZW50IGxldmVsIChlLmcuIFRleHQgb3IgQ0RBVEEgbm9kZXMsIG11bHRpcGxlCi0gICAgICogRWxlbWVudCBub2RlcywgZXRjLikuICBUaHVzLCBpdCBzaG91bGQgb25seSBiZSB1c2VkIHRvIG91dHB1dAotICAgICAqIGRvY3VtZW50IHBvcnRpb25zIHRvd2FyZHMgQ29udGVudEhhbmRsZXJzIGNhcGFibGUgb2YgYWNjZXB0aW5nCi0gICAgICogc3VjaCBpbGwtZm9ybWVkIGRvY3VtZW50cyAoc3VjaCBhcyBYU0xUIHByb2Nlc3NvcnMpLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlcyA8Y29kZT5MaXN0PC9jb2RlPiBvZiBKRE9NIG5vZGVzIHRvIG91dHB1dC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNvdXRwdXQob3JnLmpkb20uRG9jdW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0KExpc3Qgbm9kZXMpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChub2RlcyA9PSBudWxsKSB8fCAobm9kZXMuc2l6ZSgpID09IDApKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoKQotICAgICAgICBkb2N1bWVudExvY2F0b3IobnVsbCk7Ci0KLSAgICAgICAgLy8gY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpCi0gICAgICAgIHN0YXJ0RG9jdW1lbnQoKTsKLQotICAgICAgICAvLyBQcm9jZXNzIG5vZGUgbGlzdC4KLSAgICAgICAgZWxlbWVudENvbnRlbnQobm9kZXMsIG5ldyBOYW1lc3BhY2VTdGFjaygpKTsKLQotICAgICAgICAvLyBjb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpCi0gICAgICAgIGVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIG91dHB1dCBhIHNpbmdsZSBKRE9NIGVsZW1lbnQgYXMgYSBkb2N1bWVudCwgZmlyaW5nCi0gICAgICogb2ZmIHRoZSBTQVggZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gbm9kZSB0byBvdXRwdXQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gaWYgYW55IGVycm9yIG9jY3VycmVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChFbGVtZW50IG5vZGUpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29udGVudEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKCkKLSAgICAgICAgZG9jdW1lbnRMb2NhdG9yKG51bGwpOwotCi0gICAgICAgIC8vIGNvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQotICAgICAgICBzdGFydERvY3VtZW50KCk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IG5vZGUuCi0gICAgICAgIGVsZW1lbnRDb250ZW50KG5vZGUsIG5ldyBOYW1lc3BhY2VTdGFjaygpKTsKLQotICAgICAgICAvLyBjb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpCi0gICAgICAgIGVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIG91dHB1dCBhIGxpc3Qgb2YgSkRPTSBub2RlcyBhcyBhIGZyYWdtZW50IG9mIGFuIFhNTAotICAgICAqIGRvY3VtZW50LCBmaXJpbmcgb2ZmIHRoZSBTQVggZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogPHN0cm9uZz5XYXJuaW5nPC9zdHJvbmc+OiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjYWxsIHRoZQotICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3J9LAotICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNzdGFydERvY3VtZW50fSBhbmQKLSAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjZW5kRG9jdW1lbnR9IGNhbGxiYWNrcyBvbiB0aGUKLSAgICAgKiB7QGxpbmsgI3NldENvbnRlbnRIYW5kbGVyIENvbnRlbnRIYW5kbGVyfS4gIFRoZSB1c2VyIHNoYWxsCi0gICAgICogaW52b2tlIHRoZXNlIG1ldGhvZHMgZGlyZWN0bHkgcHJpb3IvYWZ0ZXIgb3V0cHV0dGluZyB0aGUKLSAgICAgKiBkb2N1bWVudCBmcmFnbWVudHMuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGVzIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIEpET00gbm9kZXMgdG8gb3V0cHV0LgotICAgICAqCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnJlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI291dHB1dEZyYWdtZW50KG9yZy5qZG9tLkNvbnRlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0RnJhZ21lbnQoTGlzdCBub2RlcykgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICBpZiAoKG5vZGVzID09IG51bGwpIHx8IChub2Rlcy5zaXplKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE91dHB1dCBub2RlIGxpc3QgYXMgYSBkb2N1bWVudCBmcmFnbWVudC4KLSAgICAgICAgZWxlbWVudENvbnRlbnQobm9kZXMsIG5ldyBOYW1lc3BhY2VTdGFjaygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgb3V0cHV0IGEgc2luZ2xlIEpET00gbm9kZXMgYXMgYSBmcmFnbWVudCBvZiBhbiBYTUwKLSAgICAgKiBkb2N1bWVudCwgZmlyaW5nIG9mZiB0aGUgU0FYIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIDxzdHJvbmc+V2FybmluZzwvc3Ryb25nPjogVGhpcyBtZXRob2QgZG9lcyBub3QgY2FsbCB0aGUKLSAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yfSwKLSAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudH0gYW5kCi0gICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI2VuZERvY3VtZW50fSBjYWxsYmFja3Mgb24gdGhlCi0gICAgICoge0BsaW5rICNzZXRDb250ZW50SGFuZGxlciBDb250ZW50SGFuZGxlcn0uICBUaGUgdXNlciBzaGFsbAotICAgICAqIGludm9rZSB0aGVzZSBtZXRob2RzIGRpcmVjdGx5IHByaW9yL2FmdGVyIG91dHB1dHRpbmcgdGhlCi0gICAgICogZG9jdW1lbnQgZnJhZ21lbnRzLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSA8Y29kZT5Db250ZW50PC9jb2RlPiBub2RlIHRvIG91dHB1dC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNvdXRwdXRGcmFnbWVudChqYXZhLnV0aWwuTGlzdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRGcmFnbWVudChDb250ZW50IG5vZGUpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3V0cHV0IHNpbmdsZSBub2RlIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQuCi0gICAgICAgIGVsZW1lbnRDb250ZW50KG5vZGUsIG5ldyBOYW1lc3BhY2VTdGFjaygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHBhcnNlcyBhIERURCBkZWNsYXJhdGlvbiB0byBmaXJlIHRoZSByZWxhdGVkIGV2ZW50cyB0b3dhcmRzCi0gICAgICogdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgPGNvZGU+SkRPTSBEb2N1bWVudDwvY29kZT4gdGhlIERvY1R5cGUgaXMgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZHRkRXZlbnRzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY1R5cGUgZG9jVHlwZSA9IGRvY3VtZW50LmdldERvY1R5cGUoKTsKLQotICAgICAgICAvLyBGaXJlIERURC1yZWxhdGVkIGV2ZW50cyBvbmx5IGlmIGhhbmRsZXJzIGhhdmUgYmVlbiByZWdpc3RlcmVkLgotICAgICAgICBpZiAoKGRvY1R5cGUgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICgoZHRkSGFuZGxlciAhPSBudWxsKSB8fCAoZGVjbEhhbmRsZXIgIT0gbnVsbCkpKSB7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIGEgZHVtbXkgWE1MIGRvY3VtZW50IHRoYXQgb25seSByZWZlcmVuY2VzIHRoZSBEVEQuLi4KLSAgICAgICAgICAgIFN0cmluZyBkdGREb2MgPSBuZXcgWE1MT3V0cHV0dGVyKCkub3V0cHV0U3RyaW5nKGRvY1R5cGUpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEFuZCBwYXJzZSBpdCB0byBmaXJlIERURCBldmVudHMuCi0gICAgICAgICAgICAgICAgY3JlYXRlRFREUGFyc2VyKCkucGFyc2UobmV3IElucHV0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihkdGREb2MpKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCBhcyB0aGUgZG9jdW1lbnQgaXMKLSAgICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkOyBpdCBkb2VzIG5vdCBoYXZlIGFueSByb290IGVsZW1lbnQuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbjogVGhlcmUncyBubyByb290IGVsZW1lbnQgaW4gZG9jdW1lbnQuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRFREIHBhcnNpbmcgZXJyb3IiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkRURCBwYXJzaW5nIGVycm9yIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB5b3UgdGhlIGxpbmUgb2YgdGhlIFhNTCBmaWxlIGJlaW5nIHBhcnNlZC4KLSAgICAgKiBGb3IgYW4gaW4tbWVtb3J5IGRvY3VtZW50LCBpdCdzIG1lYW5pbmdsZXNzLiBUaGUgbG9jYXRpb24KLSAgICAgKiBpcyBvbmx5IHZhbGlkIGZvciB0aGUgY3VycmVudCBwYXJzaW5nIGxpZmVjeWNsZSwgYnV0Ci0gICAgICogdGhlIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLiBUaGVyZWZvcmUsIGl0IHJldHVybnMKLSAgICAgKiAtMSBmb3IgYm90aCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgSkRPTSA8Y29kZT5Eb2N1bWVudDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvY3VtZW50TG9jYXRvcihEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBsb2NhdG9yID0gbmV3IEpET01Mb2NhdG9yKCk7Ci0gICAgICAgIFN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzeXN0ZW1JRCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIERvY1R5cGUgZG9jVHlwZSA9IGRvY3VtZW50LmdldERvY1R5cGUoKTsKLSAgICAgICAgICAgIGlmIChkb2NUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWNJRCA9IGRvY1R5cGUuZ2V0UHVibGljSUQoKTsKLSAgICAgICAgICAgICAgICBzeXN0ZW1JRCA9IGRvY1R5cGUuZ2V0U3lzdGVtSUQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2NhdG9yLnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLSAgICAgICAgbG9jYXRvci5zZXRTeXN0ZW1JZChzeXN0ZW1JRCk7Ci0gICAgICAgIGxvY2F0b3Iuc2V0TGluZU51bWJlcigtMSk7Ci0gICAgICAgIGxvY2F0b3Iuc2V0Q29sdW1uTnVtYmVyKC0xKTsKLQotICAgICAgICBjb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgaXMgYWx3YXlzIHRoZSBzZWNvbmQgbWV0aG9kIG9mIGFsbCBjYWxsYmFja3MgaW4KLSAgICAgKiBhbGwgaGFuZGxlcnMgdG8gYmUgaW52b2tlZCAoc2V0RG9jdW1lbnRMb2NhdG9yIGlzIGFsd2F5cyBmaXJzdCkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJFeGNlcHRpb24gaW4gc3RhcnREb2N1bWVudCIsIHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFsd2F5cyB0aGUgbGFzdCBtZXRob2Qgb2YgYWxsIGNhbGxiYWNrcyBpbiBhbGwgaGFuZGxlcnMKLSAgICAgKiB0byBiZSBpbnZva2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50SGFuZGxlci5lbmREb2N1bWVudCgpOwotCi0gICAgICAgICAgICAvLyByZXNldCBsb2NhdG9yCi0gICAgICAgICAgICBsb2NhdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXhjZXB0aW9uIGluIGVuZERvY3VtZW50Iiwgc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgPGNvZGU+Q29udGVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPgotICAgICAqIGNhbGxiYWNrIHdoZW4gYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGlzIGVuY291bnRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaSA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IGNvbnRhaW5pbmcgdGFyZ2V0IGFuZCBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICBpZiAocGkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IHBpLmdldFRhcmdldCgpOwotICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBwaS5nZXREYXRhKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGluIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiIsIHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCByZWN1cnNpdmVseSBpbnZva2UgYWxsIG9mIHRoZSBjYWxsYmFja3MgZm9yIGEgcGFydGljdWxhcgotICAgICAqIGVsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdXNlZCBpbiBjYWxsYmFja3MuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZXMgPGNvZGU+TGlzdDwvY29kZT4gc3RhY2sgb2YgTmFtZXNwYWNlcyBpbiBzY29wZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZWxlbWVudChFbGVtZW50IGVsZW1lbnQsIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHVzZWQgdG8gY2hlY2sgZW5kUHJlZml4TWFwcGluZwotICAgICAgICBpbnQgcHJldmlvdXNseURlY2xhcmVkTmFtZXNwYWNlcyA9IG5hbWVzcGFjZXMuc2l6ZSgpOwotCi0gICAgICAgIC8vIGNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZygpCi0gICAgICAgIEF0dHJpYnV0ZXMgbnNBdHRzID0gc3RhcnRQcmVmaXhNYXBwaW5nKGVsZW1lbnQsIG5hbWVzcGFjZXMpOwotCi0gICAgICAgIC8vIGNvbnRlbnRIYW5kbGVyLnN0YXJ0RWxlbWVudCgpCi0gICAgICAgIHN0YXJ0RWxlbWVudChlbGVtZW50LCBuc0F0dHMpOwotCi0gICAgICAgIC8vIGhhbmRsZSBjb250ZW50IGluIHRoZSBlbGVtZW50Ci0gICAgICAgIGVsZW1lbnRDb250ZW50KGVsZW1lbnQuZ2V0Q29udGVudCgpLCBuYW1lc3BhY2VzKTsKLQotICAgICAgICAvLyB1cGRhdGUgbG9jYXRvcgotICAgICAgICBsb2NhdG9yLnNldE5vZGUoZWxlbWVudCk7Ci0KLSAgICAgICAgLy8gY29udGVudEhhbmRsZXIuZW5kRWxlbWVudCgpCi0gICAgICAgIGVuZEVsZW1lbnQoZWxlbWVudCk7Ci0KLSAgICAgICAgLy8gY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZygpCi0gICAgICAgIGVuZFByZWZpeE1hcHBpbmcobmFtZXNwYWNlcywgcHJldmlvdXNseURlY2xhcmVkTmFtZXNwYWNlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgPGNvZGU+Q29udGVudEhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nPC9jb2RlPgotICAgICAqIGNhbGxiYWNrCi0gICAgICogd2hlbiBhIG5ldyBuYW1lc3BhY2UgaXMgZW5jb3VudGVyZWQgaW4gdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB1c2VkIGluIGNhbGxiYWNrcy4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlcyA8Y29kZT5MaXN0PC9jb2RlPiBzdGFjayBvZiBOYW1lc3BhY2VzIGluIHNjb3BlLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT5BdHRyaWJ1dGVzPC9jb2RlPiBkZWNsYXJpbmcgdGhlIG5hbWVzcGFjZXMgbG9jYWwgdG8KLSAgICAgKiA8Y29kZT5lbGVtZW50PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF0dHJpYnV0ZXMgc3RhcnRQcmVmaXhNYXBwaW5nKEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0dHJpYnV0ZXNJbXBsIG5zQXR0cyA9IG51bGw7ICAgLy8gVGhlIG5hbWVzcGFjZXMgYXMgeG1sbnMgYXR0cmlidXRlcwotCi0gICAgICAgIE5hbWVzcGFjZSBucyA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyAhPSBOYW1lc3BhY2UuWE1MX05BTUVTUEFDRSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5zLmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZXMuZ2V0VVJJKHByZWZpeCk7Ci0gICAgICAgICAgICBpZiAoIW5zLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5wdXNoKG5zKTsKLSAgICAgICAgICAgICAgICBuc0F0dHMgPSB0aGlzLmFkZE5zQXR0cmlidXRlKG5zQXR0cywgbnMpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5zLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGluIHN0YXJ0UHJlZml4TWFwcGluZyIsIHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaXJlIGFkZGl0aW9uYWwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwotICAgICAgICBMaXN0IGFkZGl0aW9uYWxOYW1lc3BhY2VzID0gZWxlbWVudC5nZXRBZGRpdGlvbmFsTmFtZXNwYWNlcygpOwotICAgICAgICBpZiAoYWRkaXRpb25hbE5hbWVzcGFjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gYWRkaXRpb25hbE5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbnMgPSAoTmFtZXNwYWNlKWl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5zLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuYW1lc3BhY2VzLmdldFVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgIGlmICghbnMuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5wdXNoKG5zKTsKLSAgICAgICAgICAgICAgICAgICAgbnNBdHRzID0gdGhpcy5hZGROc0F0dHJpYnV0ZShuc0F0dHMsIG5zKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5zLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGluIHN0YXJ0UHJlZml4TWFwcGluZyIsIHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnNBdHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBpbnZva2UgdGhlIDxjb2RlPmVuZFByZWZpeE1hcHBpbmc8L2NvZGU+IGNhbGxiYWNrIGluIHRoZQotICAgICAqIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPiB3aGVuIGEgbmFtZXNwYWNlIGlzIGdvZXMgb3V0IG9mIHNjb3BlCi0gICAgICogaW4gdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlcyA8Y29kZT5MaXN0PC9jb2RlPiBzdGFjayBvZiBOYW1lc3BhY2VzIGluIHNjb3BlLgotICAgICAqIEBwYXJhbSBwcmV2aW91c2x5RGVjbGFyZWROYW1lc3BhY2VzIG51bWJlciBvZiBwcmV2aW91c2x5IGRlY2xhcmVkCi0gICAgICogbmFtZXNwYWNlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzbHlEZWNsYXJlZE5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChuYW1lc3BhY2VzLnNpemUoKSA+IHByZXZpb3VzbHlEZWNsYXJlZE5hbWVzcGFjZXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lc3BhY2VzLnBvcCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50SGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkV4Y2VwdGlvbiBpbiBlbmRQcmVmaXhNYXBwaW5nIiwgc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgPGNvZGU+c3RhcnRFbGVtZW50PC9jb2RlPiBjYWxsYmFjawotICAgICAqIGluIHRoZSA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdXNlZCBpbiBjYWxsYmFja3MuCi0gICAgICogQHBhcmFtIG5zQXR0cyA8Y29kZT5MaXN0PC9jb2RlPiBvZiBuYW1lc3BhY2VzIHRvIGRlY2xhcmUgd2l0aAotICAgICAqIHRoZSBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydEVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBBdHRyaWJ1dGVzIG5zQXR0cykKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyByYXdOYW1lID0gZWxlbWVudC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0KLSAgICAgICAgLy8gQWxsb2NhdGUgYXR0cmlidXRlIGxpc3QuCi0gICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHMgPSAobnNBdHRzICE9IG51bGwpPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZXNJbXBsKG5zQXR0cyk6IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0gICAgICAgIExpc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhID0gKEF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBhdHRzLmFkZEF0dHJpYnV0ZShhLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZVR5cGVOYW1lKGEuZ2V0QXR0cmlidXRlVHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCByYXdOYW1lLCBhdHRzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXhjZXB0aW9uIGluIHN0YXJ0RWxlbWVudCIsIHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBpbnZva2UgdGhlIDxjb2RlPmVuZEVsZW1lbnQ8L2NvZGU+IGNhbGxiYWNrCi0gICAgICogaW4gdGhlIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB1c2VkIGluIGNhbGxiYWNrcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5kRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHJhd05hbWUgPSBlbGVtZW50LmdldFF1YWxpZmllZE5hbWUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudEhhbmRsZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcmF3TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkV4Y2VwdGlvbiBpbiBlbmRFbGVtZW50Iiwgc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2tzIGZvciB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IGVsZW1lbnQgY29udGVudCBhcyBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIG5vZGVzLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzIDxjb2RlPkxpc3Q8L2NvZGU+IHN0YWNrIG9mIE5hbWVzcGFjZXMgaW4gc2NvcGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVsZW1lbnRDb250ZW50KExpc3QgY29udGVudCwgTmFtZXNwYWNlU3RhY2sgbmFtZXNwYWNlcykKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1jb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRDb250ZW50KChDb250ZW50KW9iaiwgbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBlbGVtZW50IGNoaWxkLiBUaGlzIGNvdWxkIGhhcHBlbiB3aXRoCi0gICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24tcHJvdmlkZWQgbGlzdHMgd2hpY2ggbWF5IGNvbnRhaW4gbm9uCi0gICAgICAgICAgICAgICAgLy8gSkRPTSBvYmplY3RzLgotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKG5ldyBKRE9NRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGVsZW1lbnQgY29udGVudDogIiArIG9iaikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2tzIGZvciB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIGEgPGNvZGU+Q29udGVudDwvY29kZT4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlcyA8Y29kZT5MaXN0PC9jb2RlPiBzdGFjayBvZiBOYW1lc3BhY2VzIGluIHNjb3BlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbGVtZW50Q29udGVudChDb250ZW50IG5vZGUsIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICAvLyB1cGRhdGUgbG9jYXRvcgotICAgICAgICBsb2NhdG9yLnNldE5vZGUobm9kZSk7Ci0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBlbGVtZW50KChFbGVtZW50KSBub2RlLCBuYW1lc3BhY2VzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ0RBVEEpIHsKLSAgICAgICAgICAgIGNkYXRhKCgoQ0RBVEEpIG5vZGUpLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgIC8vIGNvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoKQotICAgICAgICAgICAgY2hhcmFjdGVycygoKFRleHQpIG5vZGUpLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotICAgICAgICAgICAgLy8gY29udGVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKCkKLSAgICAgICAgICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgLy8gbGV4aWNhbEhhbmRsZXIuY29tbWVudCgpCi0gICAgICAgICAgICBjb21tZW50KCgoQ29tbWVudCkgbm9kZSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5UmVmKSB7Ci0gICAgICAgICAgICAvLyBjb250ZW50SGFuZGxlci5za2lwcGVkRW50aXR5KCkKLSAgICAgICAgICAgIGVudGl0eVJlZigoRW50aXR5UmVmKSBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGVsZW1lbnQgY2hpbGQuIFRoaXMgY291bGQgaGFwcGVuIHdpdGgKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGxpc3RzIHdoaWNoIG1heSBjb250YWluIG5vbgotICAgICAgICAgICAgLy8gSkRPTSBvYmplY3RzLgotICAgICAgICAgICAgaGFuZGxlRXJyb3IobmV3IEpET01FeGNlcHRpb24oIkludmFsaWQgZWxlbWVudCBjb250ZW50OiAiICsgbm9kZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBjaHVuayBvZiBDREFUQSBzZWN0aW9uIGVuY291bnRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZGF0YVRleHQgYWxsIHRleHQgaW4gdGhlIENEQVRBIHNlY3Rpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjZGF0YShTdHJpbmcgY2RhdGFUZXh0KSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxleGljYWxIYW5kbGVyLnN0YXJ0Q0RBVEEoKTsKLSAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzKGNkYXRhVGV4dCk7Ci0gICAgICAgICAgICAgICAgbGV4aWNhbEhhbmRsZXIuZW5kQ0RBVEEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMoY2RhdGFUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiRXhjZXB0aW9uIGluIENEQVRBIiwgc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBjaHVuayBvZiBjaGFyYWN0ZXIgZGF0YSBlbmNvdW50ZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudFRleHQgYWxsIHRleHQgaW4gYW4gZWxlbWVudCwgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoYXJhY3RlcnMoU3RyaW5nIGVsZW1lbnRUZXh0KSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXJbXSBjID0gZWxlbWVudFRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmNoYXJhY3RlcnMoYywgMCwgYy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJFeGNlcHRpb24gaW4gY2hhcmFjdGVycyIsIHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqICBUaGlzIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGNodW5rIG9mIGNvbW1lbnQgZGF0YSBlbmNvbnRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tZW50VGV4dCBhbGwgdGV4dCBpbiBhIGNvbW1lbnQsIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb21tZW50KFN0cmluZyBjb21tZW50VGV4dCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgICBpZiAobGV4aWNhbEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhcltdIGMgPSBjb21tZW50VGV4dC50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsZXhpY2FsSGFuZGxlci5jb21tZW50KGMsIDAsIGMubGVuZ3RoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJFeGNlcHRpb24gaW4gY29tbWVudCIsIHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBpbnZva2UgdGhlIDxjb2RlPkNvbnRlbnRIYW5kbGVyLnNraXBwZWRFbnRpdHk8L2NvZGU+Ci0gICAgICogY2FsbGJhY2sgd2hlbiBhbiBlbnRpdHkgcmVmZXJlbmNlIGlzIGVuY291bnRlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkgPGNvZGU+RW50aXR5UmVmPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW50aXR5UmVmKEVudGl0eVJlZiBlbnRpdHkpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgYXBwZW5kaW5nIGEgJyUnIGNoYXJhY3RlciBhcwotICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBzdXBwb3J0IHBhcmFtZXRlciBlbnRpdGllcwotICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLnNraXBwZWRFbnRpdHkoZW50aXR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkV4Y2VwdGlvbiBpbiBlbnRpdHlSZWYiLCBzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFwcGVuZHMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaW4gdGhlIGZvcm0gb2YgYSB4bWxucyBhdHRyaWJ1dGUgdG8KLSAgICAgKiBhbiBhdHRyaWJ1dGUgbGlzdCwgY3JlcmF0aW5nIHRoaXMgbGF0dGVyIGlmIG5lZWRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cyA8Y29kZT5BdHRyaWJ1dGVJbXBsPC9jb2RlPiB3aGVyZSB0byBhZGQgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gbnMgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0aGUgbmFtZXNwYWNlIHRvIGRlY2xhcmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkF0dHJpYnV0ZUltcGw8L2NvZGU+IHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgYWRkTnNBdHRyaWJ1dGUoQXR0cmlidXRlc0ltcGwgYXR0cywgTmFtZXNwYWNlIG5zKSB7Ci0gICAgICAgIGlmICh0aGlzLmRlY2xhcmVOYW1lc3BhY2VzKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUoIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWwgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhtbG5zOiIgKyBucy5nZXRQcmVmaXgoKSwgICAvLyBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEQVRBIiwgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucy5nZXRVUkkoKSk7ICAgICAgICAgICAgICAgIC8vIHZhbHVlCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0aGUgU0FYIDIuMCBhdHRyaWJ1dGUgdHlwZSBzdHJpbmcgZnJvbSB0aGUgdHlwZSBvZgotICAgICAqIGEgSkRPTSBBdHRyaWJ1dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgPGNvZGU+aW50PC9jb2RlPiB0aGUgdHlwZSBvZiB0aGUgSkRPTSBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gdGhlIFNBWCAyLjAgYXR0cmlidXRlIHR5cGUgc3RyaW5nLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuamRvbS5BdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQXR0cmlidXRlcyNnZXRUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKGludCB0eXBlKSB7Ci0gICAgICAgIGlmICgodHlwZSA8IDApIHx8ICh0eXBlID49IGF0dHJUeXBlVG9OYW1lTWFwLmxlbmd0aCkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBBdHRyaWJ1dGUuVU5ERUNMQVJFRF9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyVHlwZVRvTmFtZU1hcFt0eXBlXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RpZmllcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgRXJyb3JIYW5kbGVyIFNBWCBlcnJvciBoYW5kbGVyfQotICAgICAqIChpZiBhbnkpIG9mIGFuIGlucHV0IHByb2Nlc3NpbmcgZXJyb3IuIFRoZSBlcnJvciBoYW5kbGVyIGNhbgotICAgICAqIGNob29zZSB0byBhYnNvcmIgdGhlIGVycm9yIGFuZCBsZXQgdGhlIHByb2Nlc3NpbmcgY29udGludWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiA8Y29kZT5KRE9NRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgZXJyb3IgaW5mb3JtYXRpb247IHdpbGwgYmUgd3JhcHBlZCBpbiBhCi0gICAgICogICAgICAgICAgICAgICAgICB7QGxpbmsgU0FYUGFyc2VFeGNlcHRpb259IHdoZW4gcmVwb3J0ZWQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBTQVggZXJyb3IgaGFuZGxlci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiBpZiBubyBlcnJvciBoYW5kbGVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIGVycm9yIGhhbmRsZXIgZmlyZWQgYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgU0FYRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSkRPTUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVycm9ySGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5lcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIG51bGwsIGV4Y2VwdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgaWYgKHNlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSkRPTUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgIHRocm93IChKRE9NRXhjZXB0aW9uKShzZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbihzZS5nZXRNZXNzYWdlKCksIHNlKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENyZWF0ZXMgYSBTQVggWE1MUmVhZGVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+WE1MUmVhZGVyPC9jb2RlPiBhIFNBWDIgcGFyc2VyLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgbm8gcGFyc2VyIGNhbiBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFJlYWRlciBwYXJzZXIgPSBudWxsOwotCi0gICAgICAgIC8vIFRyeSB1c2luZyBKQVhQLi4uCi0gICAgICAgIC8vIE5vdGUgd2UgbmVlZCBKQVhQIDEuMSwgYW5kIGlmIEpBWFAgMS4wIGlzIGFsbCB0aGF0J3MKLSAgICAgICAgLy8gYXZhaWxhYmxlIHRoZW4gdGhlIGdldFhNTFJlYWRlciBjYWxsIGZhaWxzIGFuZCB3ZSBza2lwCi0gICAgICAgIC8vIHRvIHRoZSBoYXJkIGNvZGVkIGRlZmF1bHQgcGFyc2VyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBmYWN0b3J5Q2xhc3MgPQotICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIC8vIGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBNZXRob2QgbmV3UGFyc2VySW5zdGFuY2UgPQotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MuZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG51bGwpOwotICAgICAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBuZXdQYXJzZXJJbnN0YW5jZS5pbnZva2UobnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIGpheHBQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgICAgTWV0aG9kIG5ld1NBWFBhcnNlciA9IGZhY3RvcnlDbGFzcy5nZXRNZXRob2QoIm5ld1NBWFBhcnNlciIsIG51bGwpOwotICAgICAgICAgICAgT2JqZWN0IGpheHBQYXJzZXIgICA9IG5ld1NBWFBhcnNlci5pbnZva2UoZmFjdG9yeSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIHBhcnNlciA9IGpheHBQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgICAgICBDbGFzcyBwYXJzZXJDbGFzcyA9IGpheHBQYXJzZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGhvZCBnZXRYTUxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBwYXJzZXJDbGFzcy5nZXRNZXRob2QoImdldFhNTFJlYWRlciIsIG51bGwpOwotICAgICAgICAgICAgcGFyc2VyID0gKFhNTFJlYWRlcilnZXRYTUxSZWFkZXIuaW52b2tlKGpheHBQYXJzZXIsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhIHBhcnNlciB5ZXQsIGlmIG5vdCwgdHJ5IHRvIHVzZSBhCi0gICAgICAgIC8vIGhhcmQgY29kZWQgZGVmYXVsdAotICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcnNlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBTQVggWE1MUmVhZGVyIGNhcGFibGUgb2YgcGFyc2luZyBhIERURCBhbmQKLSAgICAgKiBjb25maWd1cmUgaXQgc28gdGhhdCB0aGUgRFREIHBhcnNpbmcgZXZlbnRzIGFyZSByb3V0ZWQgdG8gdGhlCi0gICAgICogaGFuZGxlcnMgcmVnaXN0ZXJlZCBvbnRvIHRoaXMgU0FYT3V0cHV0dGVyLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+WE1MUmVhZGVyPC9jb2RlPiBhIFNBWDIgcGFyc2VyLgotICAgICAqCi0gICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uIGlmIG5vIHBhcnNlciBjYW4gYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFhNTFJlYWRlciBjcmVhdGVEVERQYXJzZXIoKSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFJlYWRlciBwYXJzZXIgPSBudWxsOwotCi0gICAgICAgIC8vIEdldCBhIHBhcnNlciBpbnN0YW5jZQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VyID0gY3JlYXRlUGFyc2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIkVycm9yIGluIFNBWCBwYXJzZXIgYWxsb2NhdGlvbiIsIGV4MSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWdpc3RlciBoYW5kbGVycwotICAgICAgICBpZiAodGhpcy5nZXREVERIYW5kbGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyc2VyLnNldERUREhhbmRsZXIodGhpcy5nZXREVERIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmdldEVudGl0eVJlc29sdmVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKHRoaXMuZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuZ2V0TGV4aWNhbEhhbmRsZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eShMRVhJQ0FMX0hBTkRMRVJfU0FYX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldExleGljYWxIYW5kbGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoTEVYSUNBTF9IQU5ETEVSX0FMVF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGV4aWNhbEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3JnZXQgaXQhCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmdldERlY2xIYW5kbGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoREVDTF9IQU5ETEVSX1NBWF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZWNsSGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldFByb3BlcnR5KERFQ0xfSEFORExFUl9BTFRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERlY2xIYW5kbGVyKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yZ2V0IGl0IQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFic29yYiBlcnJvcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgcGVyIExhdXJlbnQKLSAgICAgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgRGVmYXVsdEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcnNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgSkRPTUxvY2F0b3Igb2JqZWN0IHJlZmVyZW5jaW5nIHRoZSBub2RlIGN1cnJlbnRseQotICAgICAqIGJlaW5nIHByb2Nlc3NlZCBieSB0aGlzIG91dHB1dHRlci4gIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgYQotICAgICAqIHNuYXBzaG90IG9mIHRoZSAgbG9jYXRpb24gaW5mb3JtYXRpb24gYW5kIGNhbiB0aHVzIHNhZmVseSBiZQotICAgICAqIG1lbW9yaXplZCBmb3IgbGF0ZXIgdXNlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIG1haW50YWluZWQgYnkgU0FYT3V0cHV0dGVyIHdpdGhvdXQgcmVxdWlyaW5nIHRvIGltcGxlbWVudAotICAgICAqIDxjb2RlPlhNTEZpbHRlcjwvY29kZT4uIChJbiBTQVgsIGxvY2F0b3JzIGFyZSBvbmx5IGF2YWlsYWJsZQotICAgICAqIHRob3VnaCB0aGUgPGNvZGU+Q29udGVudEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSkuPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGlsZQotICAgICAqIFNBWE91dHB1dHRlciBpcyBvdXRwdXR0aW5nIG5vZGVzLiBIZW5jZSB0aGlzIG1ldGhvZCBzaG91bGQKLSAgICAgKiBvbmx5IGJlIHVzZWQgYnkgb2JqZWN0cyB0YWtpbmcgcGFydCBpbiB0aGUgb3V0cHV0IHByb2Nlc3NpbmcKLSAgICAgKiBzdWNoIGFzIDxjb2RlPkVycm9ySGFuZGxlcjwvY29kZT5zLgotICAgICAqCi0gICAgICogQHJldHVybiBhIEpET01Mb2NhdG9yIG9iamVjdCByZWZlcmVuY2luZyB0aGUgbm9kZSBjdXJyZW50bHkKLSAgICAgKiAgICAgICAgIGJlaW5nIHByb2Nlc3NlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvdXRwdXQKLSAgICAgKiAgICAgICAgIG9wZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgcHVibGljIEpET01Mb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiAobG9jYXRvciAhPSBudWxsKT8gbmV3IEpET01Mb2NhdG9yKGxvY2F0b3IpOiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L1hNTE91dHB1dHRlci5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvWE1MT3V0cHV0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDUzNzguLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9vdXRwdXQvWE1MT3V0cHV0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEwICswLDAgQEAKLS8qLS0KLQotICRJZDogWE1MT3V0cHV0dGVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLm91dHB1dDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotCi1pbXBvcnQgb3JnLmpkb20uKjsKLQotLyoqCi0gKiBPdXRwdXRzIGEgSkRPTSBkb2N1bWVudCBhcyBhIHN0cmVhbSBvZiBieXRlcy4gVGhlIG91dHB1dHRlciBjYW4gbWFuYWdlIG1hbnkKLSAqIHN0eWxlcyBvZiBkb2N1bWVudCBmb3JtYXR0aW5nLCBmcm9tIHVudG91Y2hlZCB0byBwcmV0dHkgcHJpbnRlZC4gVGhlIGRlZmF1bHQKLSAqIGlzIHRvIG91dHB1dCB0aGUgZG9jdW1lbnQgY29udGVudCBleGFjdGx5IGFzIGNyZWF0ZWQsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkCi0gKiBieSBzZXR0aW5nIGEgbmV3IEZvcm1hdCBvYmplY3QuIEZvciBwcmV0dHktcHJpbnQgb3V0cHV0LCB1c2UKLSAqIDxjb2RlPntAbGluayBGb3JtYXQjZ2V0UHJldHR5Rm9ybWF0KCl9PC9jb2RlPi4gRm9yIHdoaXRlc3BhY2Utbm9ybWFsaXplZAotICogb3V0cHV0LCB1c2UgPGNvZGU+e0BsaW5rIEZvcm1hdCNnZXRDb21wYWN0Rm9ybWF0KCl9PC9jb2RlPi4KLSAqIDxwPgotICogVGhlcmUgYXJlIDxjb2RlPntAbGluayAjb3V0cHV0IG91dHB1dCguLi4pfTwvY29kZT4gbWV0aG9kcyB0byBwcmludCBhbnkgb2YKLSAqIHRoZSBzdGFuZGFyZCBKRE9NIGNsYXNzZXMsIGluY2x1ZGluZyBEb2N1bWVudCBhbmQgRWxlbWVudCwgdG8gZWl0aGVyIGEgV3JpdGVyCi0gKiBvciBhbiBPdXRwdXRTdHJlYW0uIDxiPldhcm5pbmc8L2I+OiBXaGVuIG91dHB1dHRpbmcgdG8gYSBXcml0ZXIsIG1ha2Ugc3VyZQotICogdGhlIHdyaXRlcidzIGVuY29kaW5nIG1hdGNoZXMgdGhlIGVuY29kaW5nIHNldHRpbmcgaW4gdGhlIEZvcm1hdCBvYmplY3QuIFRoaXMKLSAqIGVuc3VyZXMgdGhlIGVuY29kaW5nIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIHdyaXR0ZW4gKGNvbnRyb2xsZWQgYnkgdGhlCi0gKiBXcml0ZXIgY29uZmlndXJhdGlvbikgbWF0Y2hlcyB0aGUgZW5jb2RpbmcgcGxhY2VkIGluIHRoZSBkb2N1bWVudCdzIFhNTAotICogZGVjbGFyYXRpb24gKGNvbnRyb2xsZWQgYnkgdGhlIFhNTE91dHB1dHRlcikuIEJlY2F1c2UgYSBXcml0ZXIgY2Fubm90IGJlCi0gKiBxdWVyaWVkIGZvciBpdHMgZW5jb2RpbmcsIHRoZSBpbmZvcm1hdGlvbiBtdXN0IGJlIHBhc3NlZCB0byB0aGUgRm9ybWF0Ci0gKiBtYW51YWxseSBpbiBpdHMgY29uc3RydWN0b3Igb3IgdmlhIHRoZQotICogPGNvZGU+e0BsaW5rIEZvcm1hdCNzZXRFbmNvZGluZ308L2NvZGU+IG1ldGhvZC4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMKLSAqIFVURi04LgotICogPHA+Ci0gKiBUaGUgbWV0aG9kcyA8Y29kZT57QGxpbmsgI291dHB1dFN0cmluZyBvdXRwdXRTdHJpbmcoLi4uKX08L2NvZGU+IGFyZSBmb3IKLSAqIGNvbnZlbmllbmNlIG9ubHk7IGZvciB0b3AgcGVyZm9ybWFuY2UgeW91IHNob3VsZCBjYWxsIG9uZSBvZiB0aGUgPGNvZGU+e0BsaW5rCi0gKiAjb3V0cHV0IG91dHB1dCguLi4pfTwvY29kZT4gbWV0aG9kcyBhbmQgcGFzcyBpbiB5b3VyIG93biBXcml0ZXIgb3IKLSAqIE91dHB1dFN0cmVhbSBpZiBwb3NzaWJsZS4KLSAqIDxwPgotICogWE1MIGRlY2xhcmF0aW9ucyBhcmUgYWx3YXlzIHByaW50ZWQgb24gdGhlaXIgb3duIGxpbmUgZm9sbG93ZWQgYnkgYSBsaW5lCi0gKiBzZXBlcmF0b3IgKHRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiB0aGUgZG9jdW1lbnQpLiBUbyBvbWl0Ci0gKiBwcmludGluZyBvZiB0aGUgZGVjbGFyYXRpb24gdXNlCi0gKiA8Y29kZT57QGxpbmsgRm9ybWF0I3NldE9taXREZWNsYXJhdGlvbn08L2NvZGU+LiBUbyBvbWl0IHByaW50aW5nIG9mIHRoZQotICogZW5jb2RpbmcgaW4gdGhlIGRlY2xhcmF0aW9uIHVzZSA8Y29kZT57QGxpbmsgRm9ybWF0I3NldE9taXRFbmNvZGluZ308L2NvZGU+LgotICogVW5mb3J0dW5hdGx5IHRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8ga25vdyB0aGUgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlCi0gKiBkb2N1bWVudC4KLSAqIDxwPgotICogRW1wdHkgZWxlbWVudHMgYXJlIGJ5IGRlZmF1bHQgcHJpbnRlZCBhcyAmbHQ7ZW1wdHkvJmd0OywgYnV0IHRoaXMgY2FuIGJlCi0gKiBjb25maWd1cmVkIHdpdGggPGNvZGU+e0BsaW5rIEZvcm1hdCNzZXRFeHBhbmRFbXB0eUVsZW1lbnRzfTwvY29kZT4gdG8gY2F1c2UKLSAqIHRoZW0gdG8gYmUgZXhwYW5kZWQgdG8gJmx0O2VtcHR5Jmd0OyZsdDsvZW1wdHkmZ3Q7LgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIEJyZXR0IE1jTGF1Z2hsaW4KLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICogQGF1dGhvciAgSmFzb24gUmVpZAotICogQGF1dGhvciAgV29sZmdhbmcgV2VybmVyCi0gKiBAYXV0aG9yICBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQKLSAqIEBhdXRob3IgIERhdmlkICZhbXA7IFdpbGwgKGZyb20gUG9zdCBUb29sIERlc2lnbikKLSAqIEBhdXRob3IgIERhbiBTY2hhZmZlcgotICogQGF1dGhvciAgQWxleCBDaGFmZmVlCi0gKiBAYXV0aG9yICBCcmFkbGV5IFMuIEh1ZmZtYW4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MT3V0cHV0dGVyIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVlNfSUQgPQotICAgICAgIkAoIykgJFJDU2ZpbGU6IFhNTE91dHB1dHRlci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAgIC8vIEZvciBub3JtYWwgb3V0cHV0Ci0gICAgcHJpdmF0ZSBGb3JtYXQgdXNlckZvcm1hdCA9IEZvcm1hdC5nZXRSYXdGb3JtYXQoKTsKLQotICAgIC8vIEZvciB4bWw6c3BhY2U9InByZXNlcnZlIgotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRm9ybWF0IHByZXNlcnZlRm9ybWF0ID0gRm9ybWF0LmdldFJhd0Zvcm1hdCgpOwotCi0gICAgLy8gV2hhdCdzIGN1cnJlbnRseSBpbiB1c2UKLSAgICBwcm90ZWN0ZWQgRm9ybWF0IGN1cnJlbnRGb3JtYXQgPSB1c2VyRm9ybWF0OwotCi0gICAgLyoqIFdoZXRoZXIgb3V0cHV0IGVzY2FwaW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBiZWluZyBwcm9jZXNzZWQKLSAgICAgICogRWxlbWVudCAtIGRlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZXNjYXBlT3V0cHV0ID0gdHJ1ZTsKLQotICAgIC8vICogKiAqICogKiAqICogKiAqICogQ29uc3RydWN0b3JzICogKiAqICogKiAqICogKiAqICoKLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIENvbnN0cnVjdG9ycyAqICogKiAqICogKiAqICogKiAqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGFuIDxjb2RlPlhNTE91dHB1dHRlcjwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAotICAgICAqIHtAbGluayBGb3JtYXR9IG1hdGNoaW5nIHtAbGluayBGb3JtYXQjZ2V0UmF3Rm9ybWF0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MT3V0cHV0dGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gPGNvZGU+WE1MT3V0cHV0dGVyPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBmb3JtYXQgY2hhcmFjdGVyaXN0aWNzLiAgTm90ZSB0aGUgZm9ybWF0IG9iamVjdCBpcyBjbG9uZWQgaW50ZXJuYWxseQotICAgICAqIGJlZm9yZSB1c2UuCi0gICAgICovCi0gICAgcHVibGljIFhNTE91dHB1dHRlcihGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHVzZXJGb3JtYXQgPSAoRm9ybWF0KSBmb3JtYXQuY2xvbmUoKTsKLSAgICAgICAgY3VycmVudEZvcm1hdCA9IHVzZXJGb3JtYXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhbiA8Y29kZT5YTUxPdXRwdXR0ZXI8L2NvZGU+IHdpdGggYWxsIHRoZQotICAgICAqIG9wdGlvbnMgYXMgc2V0IGluIHRoZSBnaXZlbiA8Y29kZT5YTUxPdXRwdXR0ZXI8L2NvZGU+LiAgTm90ZQotICAgICAqIHRoYXQgPGNvZGU+WE1MT3V0cHV0dGVyIHR3byA9IChYTUxPdXRwdXR0ZXIpb25lLmNsb25lKCk7PC9jb2RlPgotICAgICAqIHdvdWxkIHdvcmsgZXF1YWxseSB3ZWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoYXQgdGhlIFhNTE91dHB1dHRlciB0byBjbG9uZQotICAgICAqLwotICAgIHB1YmxpYyBYTUxPdXRwdXR0ZXIoWE1MT3V0cHV0dGVyIHRoYXQpIHsKLSAgICAgICAgdGhpcy51c2VyRm9ybWF0ID0gKEZvcm1hdCkgdGhhdC51c2VyRm9ybWF0LmNsb25lKCk7Ci0gICAgICAgIGN1cnJlbnRGb3JtYXQgPSB1c2VyRm9ybWF0OwotICAgIH0KLQotICAgIC8vICogKiAqICogKiAqICogKiAqICogU2V0IHBhcmFtZXRlcnMgbWV0aG9kcyAqICogKiAqICogKiAqICogKiAqCi0gICAgLy8gKiAqICogKiAqICogKiAqICogKiBTZXQgcGFyYW1ldGVycyBtZXRob2RzICogKiAqICogKiAqICogKiAqICoKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldyBmb3JtYXQgbG9naWMgZm9yIHRoZSBvdXRwdXR0ZXIuICBOb3RlIHRoZSBGb3JtYXQKLSAgICAgKiBvYmplY3QgaXMgY2xvbmVkIGludGVybmFsbHkgYmVmb3JlIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdGb3JtYXQgdGhlIGZvcm1hdCB0byB1c2UgZm9yIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChGb3JtYXQgbmV3Rm9ybWF0KSB7Ci0gICAgICAgIHRoaXMudXNlckZvcm1hdCA9IChGb3JtYXQpIG5ld0Zvcm1hdC5jbG9uZSgpOwotICAgICAgICB0aGlzLmN1cnJlbnRGb3JtYXQgPSB1c2VyRm9ybWF0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZm9ybWF0IGluIHVzZSBieSB0aGUgb3V0cHV0dGVyLiAgTm90ZSB0aGUgCi0gICAgICogRm9ybWF0IG9iamVjdCByZXR1cm5lZCBpcyBhIGNsb25lIG9mIHRoZSBvbmUgdXNlZCBpbnRlcm5hbGx5LgotICAgICAqLwotICAgIHB1YmxpYyBGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEZvcm1hdCkgdXNlckZvcm1hdC5jbG9uZSgpOwotICAgIH0KLQotICAgIC8vICogKiAqICogKiAqICogKiAqICogT3V0cHV0IHRvIGEgT3V0cHV0U3RyZWFtICogKiAqICogKiAqICogKiAqICoKLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIE91dHB1dCB0byBhIE91dHB1dFN0cmVhbSAqICogKiAqICogKiAqICogKiAqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcHJpbnQgdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLSAgICAgKiBUaGUgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCB1c2luZyB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZQotICAgICAqIGNvbnN0cnVjdG9yLCBvciBhIGRlZmF1bHQgb2YgVVRGLTguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHRvIHVzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSB3cml0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChEb2N1bWVudCBkb2MsIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKG91dCk7Ci0gICAgICAgIG91dHB1dChkb2MsIHdyaXRlcik7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IHRoZSA8Y29kZT57QGxpbmsgRG9jVHlwZX08L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3R5cGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0KERvY1R5cGUgZG9jdHlwZSwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG1ha2VXcml0ZXIob3V0KTsKLSAgICAgICAgb3V0cHV0KGRvY3R5cGUsIHdyaXRlcik7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IGFuIDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4sIGluY2x1ZGluZwotICAgICAqIGl0cyA8Y29kZT57QGxpbmsgQXR0cmlidXRlfTwvY29kZT5zLCBhbmQgYWxsCi0gICAgICogY29udGFpbmVkIChjaGlsZCkgZWxlbWVudHMsIGV0Yy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRvIG91dHB1dC4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChFbGVtZW50IGVsZW1lbnQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKG91dCk7Ci0gICAgICAgIG91dHB1dChlbGVtZW50LCB3cml0ZXIpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb3V0IGFuIDxjb2RlPntAbGluawotICAgICAqIEVsZW1lbnR9PC9jb2RlPidzIGNvbnRlbnQgb25seSwgbm90IGluY2x1ZGluZyBpdHMgdGFnLCBhbmQKLSAgICAgKiBhdHRyaWJ1dGVzLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBwcmludGluZyB0aGUgY29udGVudCBvZiBhbgotICAgICAqIGVsZW1lbnQgdGhhdCBjb250YWlucyBIVE1MLCBsaWtlICImbHQ7ZGVzY3JpcHRpb24mZ3Q7SkRPTSBpcwotICAgICAqICZsdDtiJmd0O2Z1biZndDshJmx0Oy9kZXNjcmlwdGlvbiZndDsiLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0RWxlbWVudENvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbWFrZVdyaXRlcihvdXQpOwotICAgICAgICBvdXRwdXRFbGVtZW50Q29udGVudChlbGVtZW50LCB3cml0ZXIpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb3V0IGEgbGlzdCBvZiBub2Rlcy4KLSAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHByaW50aW5nIHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgdGhhdAotICAgICAqIGNvbnRhaW5zIEhUTUwsIGxpa2UgIiZsdDtkZXNjcmlwdGlvbiZndDtKRE9NIGlzCi0gICAgICogJmx0O2ImZ3Q7ZnVuJmd0OyEmbHQ7L2Rlc2NyaXB0aW9uJmd0OyIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCA8Y29kZT5MaXN0PC9jb2RlPiBvZiBub2Rlcy4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChMaXN0IGxpc3QsIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKG91dCk7Ci0gICAgICAgIG91dHB1dChsaXN0LCB3cml0ZXIpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCBhIDxjb2RlPntAbGluayBDREFUQX08L2NvZGU+IG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2RhdGEgPGNvZGU+Q0RBVEE8L2NvZGU+IHRvIG91dHB1dC4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChDREFUQSBjZGF0YSwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG1ha2VXcml0ZXIob3V0KTsKLSAgICAgICAgb3V0cHV0KGNkYXRhLCB3cml0ZXIpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCBhIDxjb2RlPntAbGluayBUZXh0fTwvY29kZT4gbm9kZS4gIFBlcmZvbXMKLSAgICAgKiB0aGUgbmVjZXNzYXJ5IGVudGl0eSBlc2NhcGluZyBhbmQgd2hpdGVzcGFjZSBzdHJpcHBpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCA8Y29kZT5UZXh0PC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoVGV4dCB0ZXh0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbWFrZVdyaXRlcihvdXQpOwotICAgICAgICBvdXRwdXQodGV4dCwgd3JpdGVyKTsgIC8vIG91dHB1dCgpIGZsdXNoZXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgYSA8Y29kZT57QGxpbmsgQ29tbWVudH08L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1lbnQgPGNvZGU+Q29tbWVudDwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0KENvbW1lbnQgY29tbWVudCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG1ha2VXcml0ZXIob3V0KTsKLSAgICAgICAgb3V0cHV0KGNvbW1lbnQsIHdyaXRlcik7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IGEgPGNvZGU+e0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn08L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHBpIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0KFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSwgT3V0cHV0U3RyZWFtIG91dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKG91dCk7Ci0gICAgICAgIG91dHB1dChwaSwgd3JpdGVyKTsgIC8vIG91dHB1dCgpIGZsdXNoZXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgYSA8Y29kZT57QGxpbmsgRW50aXR5UmVmfTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50aXR5IDxjb2RlPkVudGl0eVJlZjwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0KEVudGl0eVJlZiBlbnRpdHksIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKG91dCk7Ci0gICAgICAgIG91dHB1dChlbnRpdHksIHdyaXRlcik7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIE91dHB1dFN0cmVhbVdyaXRlciwgdXNpbmcgcHJlZmVyZWQgZW5jb2RpbmcKLSAgICAgKiAoc2VlIHtAbGluayBGb3JtYXQjc2V0RW5jb2Rpbmd9KS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFdyaXRlciBtYWtlV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWtlV3JpdGVyKG91dCwgdXNlckZvcm1hdC5lbmNvZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIE91dHB1dFN0cmVhbVdyaXRlciwgdXNlIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBXcml0ZXIgbWFrZVdyaXRlcihPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgZW5jKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICAvLyAiVVRGLTgiIGlzIG5vdCByZWNvZ25pemVkIGJlZm9yZSBKREsgMS4xLjYsIHNvIHdlJ2xsIHRyYW5zbGF0ZQotICAgICAgICAvLyBpbnRvICJVVEY4IiB3aGljaCB3b3JrcyB3aXRoIGFsbCBKREtzLgotICAgICAgICBpZiAoIlVURi04Ii5lcXVhbHMoZW5jKSkgewotICAgICAgICAgICAgZW5jID0gIlVURjgiOwotICAgICAgICB9Ci0KLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dCksIGVuYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKLSAgICAgICAgcmV0dXJuIHdyaXRlcjsKLSAgICB9Ci0KLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIE91dHB1dCB0byBhIFdyaXRlciAqICogKiAqICogKiAqICogKiAqCi0gICAgLy8gKiAqICogKiAqICogKiAqICogKiBPdXRwdXQgdG8gYSBXcml0ZXIgKiAqICogKiAqICogKiAqICogKgotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHByaW50IHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gdG8gdGhlIGdpdmVuIFdyaXRlci4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFdhcm5pbmc6IHVzaW5nIHlvdXIgb3duIFdyaXRlciBtYXkgY2F1c2UgdGhlIG91dHB1dHRlcidzCi0gICAgICogcHJlZmVycmVkIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSBpZ25vcmVkLiAgSWYgeW91IHVzZQotICAgICAqIGVuY29kaW5ncyBvdGhlciB0aGFuIFVURi04LCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIG1ldGhvZCB0aGF0Ci0gICAgICogdGFrZXMgYW4gT3V0cHV0U3RyZWFtIGluc3RlYWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gdG8gZm9ybWF0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+V3JpdGVyPC9jb2RlPiB0byB1c2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gd3JpdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoRG9jdW1lbnQgZG9jLCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIHByaW50RGVjbGFyYXRpb24ob3V0LCBkb2MsIHVzZXJGb3JtYXQuZW5jb2RpbmcpOwotCi0gICAgICAgIC8vIFByaW50IG91dCByb290IGVsZW1lbnQsIGFzIHdlbGwgYXMgYW55IHJvb3QgbGV2ZWwKLSAgICAgICAgLy8gY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLAotICAgICAgICAvLyBzdGFydGluZyB3aXRoIG5vIGluZGVudGF0aW9uCi0gICAgICAgIExpc3QgY29udGVudCA9IGRvYy5nZXRDb250ZW50KCk7Ci0gICAgICAgIGludCBzaXplID0gY29udGVudC5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gY29udGVudC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFbGVtZW50KG91dCwgZG9jLmdldFJvb3RFbGVtZW50KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU5hbWVzcGFjZVN0YWNrKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tbWVudCkgewotICAgICAgICAgICAgICAgIHByaW50Q29tbWVudChvdXQsIChDb21tZW50KSBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ob3V0LCAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG9jVHlwZSkgewotICAgICAgICAgICAgICAgIHByaW50RG9jVHlwZShvdXQsIGRvYy5nZXREb2NUeXBlKCkpOwotICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwcmludCBsaW5lIHNlcGFyYXRvciBhZnRlciBkZWNsYXJhdGlvbiwgaGVscHMgdGhlCi0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IGxvb2sgYmV0dGVyIGFuZCBpcyBzZW1hbnRpY2FsbHkgaW5jb25zZXF1ZW50aWFsCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGN1cnJlbnRGb3JtYXQubGluZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggaWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSBoYXZlIGEgaWxsZWdhbCBjb250ZW50LCBmb3IKLSAgICAgICAgICAgICAgICAvLyAgICAgbm93IHdlJ2xsIGp1c3QgaWdub3JlIGl0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld2xpbmUob3V0KTsKLSAgICAgICAgICAgIGluZGVudChvdXQsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3V0cHV0IGZpbmFsIGxpbmUgc2VwYXJhdG9yCi0gICAgICAgIC8vIFdlIG91dHB1dCB0aGlzIG5vIG1hdHRlciB3aGF0IHRoZSBuZXdsaW5lIGZsYWdzIHNheQotICAgICAgICBvdXQud3JpdGUoY3VycmVudEZvcm1hdC5saW5lU2VwYXJhdG9yKTsKLQotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgdGhlIDxjb2RlPntAbGluayBEb2NUeXBlfTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdHlwZSA8Y29kZT5Eb2NUeXBlPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoRG9jVHlwZSBkb2N0eXBlLCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBwcmludERvY1R5cGUob3V0LCBkb2N0eXBlKTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IGFuIDxjb2RlPntAbGluayBFbGVtZW50fTwvY29kZT4sIGluY2x1ZGluZwotICAgICAqIGl0cyA8Y29kZT57QGxpbmsgQXR0cmlidXRlfTwvY29kZT5zLCBhbmQgYWxsCi0gICAgICogY29udGFpbmVkIChjaGlsZCkgZWxlbWVudHMsIGV0Yy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHRvIG91dHB1dC4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChFbGVtZW50IGVsZW1lbnQsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCB3ZSBjb3VsZCBwcmUtaW5pdGlhbGl6ZSB0aGUKLSAgICAgICAgLy8gbmFtZXNwYWNlIHN0YWNrIHdpdGggdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgcHJpbnRFbGVtZW50KG91dCwgZWxlbWVudCwgMCwgY3JlYXRlTmFtZXNwYWNlU3RhY2soKSk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb3V0IGFuIDxjb2RlPntAbGluawotICAgICAqIEVsZW1lbnR9PC9jb2RlPidzIGNvbnRlbnQgb25seSwgbm90IGluY2x1ZGluZyBpdHMgdGFnLCBhbmQKLSAgICAgKiBhdHRyaWJ1dGVzLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBwcmludGluZyB0aGUgY29udGVudCBvZiBhbgotICAgICAqIGVsZW1lbnQgdGhhdCBjb250YWlucyBIVE1MLCBsaWtlICImbHQ7ZGVzY3JpcHRpb24mZ3Q7SkRPTSBpcwotICAgICAqICZsdDtiJmd0O2Z1biZndDshJmx0Oy9kZXNjcmlwdGlvbiZndDsiLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdG8gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+V3JpdGVyPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0RWxlbWVudENvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBXcml0ZXIgb3V0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0IGNvbnRlbnQgPSBlbGVtZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgcHJpbnRDb250ZW50UmFuZ2Uob3V0LCBjb250ZW50LCAwLCBjb250ZW50LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY3JlYXRlTmFtZXNwYWNlU3RhY2soKSk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb3V0IGEgbGlzdCBvZiBub2Rlcy4KLSAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHByaW50aW5nIHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgdGhhdAotICAgICAqIGNvbnRhaW5zIEhUTUwsIGxpa2UgIiZsdDtkZXNjcmlwdGlvbiZndDtKRE9NIGlzCi0gICAgICogJmx0O2ImZ3Q7ZnVuJmd0OyEmbHQ7L2Rlc2NyaXB0aW9uJmd0OyIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCA8Y29kZT5MaXN0PC9jb2RlPiBvZiBub2Rlcy4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChMaXN0IGxpc3QsIFdyaXRlciBvdXQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByaW50Q29udGVudFJhbmdlKG91dCwgbGlzdCwgMCwgbGlzdC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNyZWF0ZU5hbWVzcGFjZVN0YWNrKCkpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgYSA8Y29kZT57QGxpbmsgQ0RBVEF9PC9jb2RlPiBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNkYXRhIDxjb2RlPkNEQVRBPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoQ0RBVEEgY2RhdGEsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByaW50Q0RBVEEob3V0LCBjZGF0YSk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCBhIDxjb2RlPntAbGluayBUZXh0fTwvY29kZT4gbm9kZS4gIFBlcmZvbXMKLSAgICAgKiB0aGUgbmVjZXNzYXJ5IGVudGl0eSBlc2NhcGluZyBhbmQgd2hpdGVzcGFjZSBzdHJpcHBpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCA8Y29kZT5UZXh0PC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoVGV4dCB0ZXh0LCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBwcmludFRleHQob3V0LCB0ZXh0KTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IGEgPGNvZGU+e0BsaW5rIENvbW1lbnR9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tZW50IDxjb2RlPkNvbW1lbnQ8L2NvZGU+IHRvIG91dHB1dC4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dChDb21tZW50IGNvbW1lbnQsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByaW50Q29tbWVudChvdXQsIGNvbW1lbnQpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBvdXQgYSA8Y29kZT57QGxpbmsgUHJvY2Vzc2luZ0luc3RydWN0aW9ufTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGkgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpLCBXcml0ZXIgb3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBjdXJyZW50RXNjYXBpbmdQb2xpY3kgPSBjdXJyZW50Rm9ybWF0Lmlnbm9yZVRyQVhFc2NhcGluZ1BJczsKLQotICAgICAgICAvLyBPdXRwdXQgUEkgdmVyYmF0aW0sIGRpc3JlZ2FyZGluZyBUckFYIGVzY2FwaW5nIFBJcy4KLSAgICAgICAgY3VycmVudEZvcm1hdC5zZXRJZ25vcmVUckFYRXNjYXBpbmdQSXModHJ1ZSk7Ci0gICAgICAgIHByaW50UHJvY2Vzc2luZ0luc3RydWN0aW9uKG91dCwgcGkpOwotICAgICAgICBjdXJyZW50Rm9ybWF0LnNldElnbm9yZVRyQVhFc2NhcGluZ1BJcyhjdXJyZW50RXNjYXBpbmdQb2xpY3kpOwotCi0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCBhIDxjb2RlPntAbGluayBFbnRpdHlSZWZ9PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkgPGNvZGU+RW50aXR5UmVmPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoRW50aXR5UmVmIGVudGl0eSwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcHJpbnRFbnRpdHlSZWYob3V0LCBlbnRpdHkpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIE91dHB1dCB0byBhIFN0cmluZyAqICogKiAqICogKiAqICogKiAqCi0gICAgLy8gKiAqICogKiAqICogKiAqICogKiBPdXRwdXQgdG8gYSBTdHJpbmcgKiAqICogKiAqICogKiAqICogKgotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvY3VtZW50LiAgVXNlcyBhbiBpbnRlcm5hbAotICAgICAqIFN0cmluZ1dyaXRlci4gV2FybmluZzogYSBTdHJpbmcgaXMgVW5pY29kZSwgd2hpY2ggbWF5IG5vdCBtYXRjaAotICAgICAqIHRoZSBvdXRwdXR0ZXIncyBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBvdXRwdXRTdHJpbmcoRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQoZG9jLCBvdXQpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IH0KLSAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBEb2NUeXBlLiBXYXJuaW5nOiBhIFN0cmluZyBpcwotICAgICAqIFVuaWNvZGUsIHdoaWNoIG1heSBub3QgbWF0Y2ggdGhlIG91dHB1dHRlcidzIHNwZWNpZmllZAotICAgICAqIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3R5cGUgPGNvZGU+RG9jVHlwZTwvY29kZT4gdG8gZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0U3RyaW5nKERvY1R5cGUgZG9jdHlwZSkgewotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0KGRvY3R5cGUsIG91dCk7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBlbGVtZW50LiBXYXJuaW5nOiBhIFN0cmluZyBpcwotICAgICAqIFVuaWNvZGUsIHdoaWNoIG1heSBub3QgbWF0Y2ggdGhlIG91dHB1dHRlcidzIHNwZWNpZmllZAotICAgICAqIGVuY29kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgPGNvZGU+RWxlbWVudDwvY29kZT4gdG8gZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0U3RyaW5nKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0KGVsZW1lbnQsIG91dCk7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBub2Rlcy4gIFRoZSBsaXN0IGlzCi0gICAgICogYXNzdW1lZCB0byBjb250YWluIGxlZ2FsIEpET00gbm9kZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCA8Y29kZT5MaXN0PC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBvdXRwdXRTdHJpbmcoTGlzdCBsaXN0KSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQobGlzdCwgb3V0KTsgIC8vIG91dHB1dCgpIGZsdXNoZXMKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB9Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgQ0RBVEEgbm9kZS4gV2FybmluZzogYSBTdHJpbmcgaXMKLSAgICAgKiBVbmljb2RlLCB3aGljaCBtYXkgbm90IG1hdGNoIHRoZSBvdXRwdXR0ZXIncyBzcGVjaWZpZWQKLSAgICAgKiBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZGF0YSA8Y29kZT5DREFUQTwvY29kZT4gdG8gZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0U3RyaW5nKENEQVRBIGNkYXRhKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQoY2RhdGEsIG91dCk7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFRleHQgbm9kZS4gV2FybmluZzogYSBTdHJpbmcgaXMKLSAgICAgKiBVbmljb2RlLCB3aGljaCBtYXkgbm90IG1hdGNoIHRoZSBvdXRwdXR0ZXIncyBzcGVjaWZpZWQKLSAgICAgKiBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IDxjb2RlPlRleHQ8L2NvZGU+IHRvIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG91dHB1dFN0cmluZyhUZXh0IHRleHQpIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIG91dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dHB1dCh0ZXh0LCBvdXQpOyAgLy8gb3V0cHV0KCkgZmx1c2hlcwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IH0KLSAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGNvbW1lbnQuIFdhcm5pbmc6IGEgU3RyaW5nIGlzCi0gICAgICogVW5pY29kZSwgd2hpY2ggbWF5IG5vdCBtYXRjaCB0aGUgb3V0cHV0dGVyJ3Mgc3BlY2lmaWVkCi0gICAgICogZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWVudCA8Y29kZT5Db21tZW50PC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBvdXRwdXRTdHJpbmcoQ29tbWVudCBjb21tZW50KSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQoY29tbWVudCwgb3V0KTsgIC8vIG91dHB1dCgpIGZsdXNoZXMKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB9Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgUEkuIFdhcm5pbmc6IGEgU3RyaW5nIGlzCi0gICAgICogVW5pY29kZSwgd2hpY2ggbWF5IG5vdCBtYXRjaCB0aGUgb3V0cHV0dGVyJ3Mgc3BlY2lmaWVkCi0gICAgICogZW5jb2RpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGkgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBvdXRwdXRTdHJpbmcoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQocGksIG91dCk7ICAvLyBvdXRwdXQoKSBmbHVzaGVzCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIGVudGl0eS4gV2FybmluZzogYSBTdHJpbmcgaXMKLSAgICAgKiBVbmljb2RlLCB3aGljaCBtYXkgbm90IG1hdGNoIHRoZSBvdXRwdXR0ZXIncyBzcGVjaWZpZWQKLSAgICAgKiBlbmNvZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkgPGNvZGU+RW50aXR5UmVmPC9jb2RlPiB0byBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBvdXRwdXRTdHJpbmcoRW50aXR5UmVmIGVudGl0eSkgewotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0KGVudGl0eSwgb3V0KTsgIC8vIG91dHB1dCgpIGZsdXNoZXMKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB9Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIEludGVybmFsIHByaW50aW5nIG1ldGhvZHMgKiAqICogKiAqICogKiAqICogKgotICAgIC8vICogKiAqICogKiAqICogKiAqICogSW50ZXJuYWwgcHJpbnRpbmcgbWV0aG9kcyAqICogKiAqICogKiAqICogKiAqCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIG9mIHRoZSBkZWNsYXJhdGlvbi4KLSAgICAgKiBBc3N1bWVzIFhNTCB2ZXJzaW9uIDEuMCBzaW5jZSB3ZSBkb24ndCBkaXJlY3RseSBrbm93LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gd2hvc2UgZGVjbGFyYXRpb24gdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIGFkZCB0byB0aGUgZGVjbGFyYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludERlY2xhcmF0aW9uKFdyaXRlciBvdXQsIERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBPbmx5IHByaW50IHRoZSBkZWNsYXJhdGlvbiBpZiBpdCdzIG5vdCBiZWluZyBvbWl0dGVkCi0gICAgICAgIGlmICghdXNlckZvcm1hdC5vbWl0RGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIC8vIEFzc3VtZSAxLjAgdmVyc2lvbgotICAgICAgICAgICAgb3V0LndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIiKTsKLSAgICAgICAgICAgIGlmICghdXNlckZvcm1hdC5vbWl0RW5jb2RpbmcpIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIiBlbmNvZGluZz1cIiIgKyBlbmNvZGluZyArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LndyaXRlKCI/PiIpOwotCi0gICAgICAgICAgICAvLyBQcmludCBuZXcgbGluZSBhZnRlciBkZWNsIGFsd2F5cywgZXZlbiBpZiBubyBvdGhlciBuZXcgbGluZXMKLSAgICAgICAgICAgIC8vIEhlbHBzIHRoZSBvdXRwdXQgbG9vayBiZXR0ZXIgYW5kIGlzIHNlbWFudGljYWxseQotICAgICAgICAgICAgLy8gaW5jb25zZXF1ZW50aWFsCi0gICAgICAgICAgICBvdXQud3JpdGUoY3VycmVudEZvcm1hdC5saW5lU2VwYXJhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaGFuZGxlIHByaW50aW5nIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGlmIG9uZSBleGlzdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jVHlwZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gd2hvc2UgZGVjbGFyYXRpb24gdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludERvY1R5cGUoV3JpdGVyIG91dCwgRG9jVHlwZSBkb2NUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgcHVibGljSUQgPSBkb2NUeXBlLmdldFB1YmxpY0lEKCk7Ci0gICAgICAgIFN0cmluZyBzeXN0ZW1JRCA9IGRvY1R5cGUuZ2V0U3lzdGVtSUQoKTsKLSAgICAgICAgU3RyaW5nIGludGVybmFsU3Vic2V0ID0gZG9jVHlwZS5nZXRJbnRlcm5hbFN1YnNldCgpOwotICAgICAgICBib29sZWFuIGhhc1B1YmxpYyA9IGZhbHNlOwotCi0gICAgICAgIG91dC53cml0ZSgiPCFET0NUWVBFICIpOwotICAgICAgICBvdXQud3JpdGUoZG9jVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgaWYgKHB1YmxpY0lEICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiIFBVQkxJQyBcIiIpOwotICAgICAgICAgICAgb3V0LndyaXRlKHB1YmxpY0lEKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiXCIiKTsKLSAgICAgICAgICAgIGhhc1B1YmxpYyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaGFzUHVibGljKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCIgU1lTVEVNIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQud3JpdGUoIiBcIiIpOwotICAgICAgICAgICAgb3V0LndyaXRlKHN5c3RlbUlEKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGludGVybmFsU3Vic2V0ICE9IG51bGwpICYmICghaW50ZXJuYWxTdWJzZXQuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiIFsiKTsKLSAgICAgICAgICAgIG91dC53cml0ZShjdXJyZW50Rm9ybWF0LmxpbmVTZXBhcmF0b3IpOwotICAgICAgICAgICAgb3V0LndyaXRlKGRvY1R5cGUuZ2V0SW50ZXJuYWxTdWJzZXQoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIG9mIGNvbW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1lbnQgPGNvZGU+Q29tbWVudDwvY29kZT4gdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludENvbW1lbnQoV3JpdGVyIG91dCwgQ29tbWVudCBjb21tZW50KQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGUoIjwhLS0iKTsKLSAgICAgICAgb3V0LndyaXRlKGNvbW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgb3V0LndyaXRlKCItLT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIHBpIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFByb2Nlc3NpbmdJbnN0cnVjdGlvbihXcml0ZXIgb3V0LCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXQgPSBwaS5nZXRUYXJnZXQoKTsKLSAgICAgICAgYm9vbGVhbiBwaVByb2Nlc3NlZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0Lmlnbm9yZVRyQVhFc2NhcGluZ1BJcyA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKHRhcmdldC5lcXVhbHMoUmVzdWx0LlBJX0RJU0FCTEVfT1VUUFVUX0VTQ0FQSU5HKSkgewotICAgICAgICAgICAgICAgIGVzY2FwZU91dHB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHBpUHJvY2Vzc2VkICA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0YXJnZXQuZXF1YWxzKFJlc3VsdC5QSV9FTkFCTEVfT1VUUFVUX0VTQ0FQSU5HKSkgewotICAgICAgICAgICAgICAgIGVzY2FwZU91dHB1dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcGlQcm9jZXNzZWQgID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGlQcm9jZXNzZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIFN0cmluZyByYXdEYXRhID0gcGkuZ2V0RGF0YSgpOwotCi0gICAgICAgICAgICAvLyBXcml0ZSA8P3RhcmdldCBkYXRhPz4gb3IgaWYgbm8gZGF0YSB0aGVuIGp1c3QgPD90YXJnZXQ/PgotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMocmF3RGF0YSkpIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjw/Iik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCIgIik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHJhd0RhdGEpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPz4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPD8iKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIj8+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIGEgPGNvZGU+e0BsaW5rIEVudGl0eVJlZn08L2NvZGU+LgotICAgICAqIE9ubHkgdGhlIGVudGl0eSByZWZlcmVuY2Ugc3VjaCBhcyA8Y29kZT4mYW1wO2VudGl0eTs8L2NvZGU+Ci0gICAgICogd2lsbCBiZSBwcmludGVkLiBIb3dldmVyLCBzdWJjbGFzc2VzIGFyZSBmcmVlIHRvIG92ZXJyaWRlCi0gICAgICogdGhpcyBtZXRob2QgdG8gcHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpdHkgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkgPGNvZGU+RW50aXR5UmVmPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4gICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFbnRpdHlSZWYoV3JpdGVyIG91dCwgRW50aXR5UmVmIGVudGl0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKCImIik7Ci0gICAgICAgIG91dC53cml0ZShlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgb3V0LndyaXRlKCI7Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGhhbmRsZSBwcmludGluZyBvZiA8Y29kZT57QGxpbmsgQ0RBVEF9PC9jb2RlPiB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNkYXRhIDxjb2RlPkNEQVRBPC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludENEQVRBKFdyaXRlciBvdXQsIENEQVRBIGNkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RyID0gKGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuTk9STUFMSVpFKQotICAgICAgICAgICAgICAgICAgICAgPyBjZGF0YS5nZXRUZXh0Tm9ybWFsaXplKCkKLSAgICAgICAgICAgICAgICAgICAgIDogKChjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLlRSSU0pID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RhdGEuZ2V0VGV4dCgpLnRyaW0oKSA6IGNkYXRhLmdldFRleHQoKSk7Ci0gICAgICAgIG91dC53cml0ZSgiPCFbQ0RBVEFbIik7Ci0gICAgICAgIG91dC53cml0ZShzdHIpOwotICAgICAgICBvdXQud3JpdGUoIl1dPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb2YgPGNvZGU+e0BsaW5rIFRleHR9PC9jb2RlPiBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgPGNvZGU+VGV4dDwvY29kZT4gdG8gd3JpdGUuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFRleHQoV3JpdGVyIG91dCwgVGV4dCB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RyID0gKGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuTk9STUFMSVpFKQotICAgICAgICAgICAgICAgICAgICAgPyB0ZXh0LmdldFRleHROb3JtYWxpemUoKQotICAgICAgICAgICAgICAgICAgICAgOiAoKGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuVFJJTSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmdldFRleHQoKS50cmltKCkgOiB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIG91dC53cml0ZShlc2NhcGVFbGVtZW50RW50aXRpZXMoc3RyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGhhbmRsZSBwcmludGluZyBhIHN0cmluZy4gIEVzY2FwZXMgdGhlIGVsZW1lbnQgZW50aXRpZXMsCi0gICAgICogdHJpbXMgaW50ZXJpb3Igd2hpdGVzcGFjZSwgZXRjLiBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50U3RyaW5nKFdyaXRlciBvdXQsIFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLk5PUk1BTElaRSkgewotICAgICAgICAgICAgc3RyID0gVGV4dC5ub3JtYWxpemVTdHJpbmcoc3RyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLlRSSU0pIHsKLSAgICAgICAgICAgIHN0ciA9IHN0ci50cmltKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKGVzY2FwZUVsZW1lbnRFbnRpdGllcyhzdHIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIG9mIGEgPGNvZGU+e0BsaW5rIEVsZW1lbnR9PC9jb2RlPiwKLSAgICAgKiBpdHMgPGNvZGU+e0BsaW5rIEF0dHJpYnV0ZX08L2NvZGU+cywgYW5kIGFsbCBjb250YWluZWQgKGNoaWxkKQotICAgICAqIGVsZW1lbnRzLCBldGMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCA8Y29kZT5FbGVtZW50PC9jb2RlPiB0byBvdXRwdXQuCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gbGV2ZWwgPGNvZGU+aW50PC9jb2RlPiBsZXZlbCBvZiBpbmRlbnRpb24uCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZXMgPGNvZGU+TGlzdDwvY29kZT4gc3RhY2sgb2YgTmFtZXNwYWNlcyBpbiBzY29wZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVsZW1lbnQoV3JpdGVyIG91dCwgRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIExpc3QgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudCgpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciB4bWw6c3BhY2UgYW5kIGFkanVzdCBmb3JtYXQgc2V0dGluZ3MKLSAgICAgICAgU3RyaW5nIHNwYWNlID0gbnVsbDsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKCJzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZS5YTUxfTkFNRVNQQUNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGN1cnJlbnRGb3JtYXQ7Ci0KLSAgICAgICAgaWYgKCJkZWZhdWx0Ii5lcXVhbHMoc3BhY2UpKSB7Ci0gICAgICAgICAgICBjdXJyZW50Rm9ybWF0ID0gdXNlckZvcm1hdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgicHJlc2VydmUiLmVxdWFscyhzcGFjZSkpIHsKLSAgICAgICAgICAgIGN1cnJlbnRGb3JtYXQgPSBwcmVzZXJ2ZUZvcm1hdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByaW50IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhZyBwbHVzIGF0dHJpYnV0ZXMgYW5kIGFueQotICAgICAgICAvLyBuZWNlc3NhcnkgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwotICAgICAgICBvdXQud3JpdGUoIjwiKTsKLSAgICAgICAgcHJpbnRRdWFsaWZpZWROYW1lKG91dCwgZWxlbWVudCk7Ci0KLSAgICAgICAgLy8gTWFyayBvdXIgbmFtZXNwYWNlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgIGludCBwcmV2aW91c2x5RGVjbGFyZWROYW1lc3BhY2VzID0gbmFtZXNwYWNlcy5zaXplKCk7Ci0KLSAgICAgICAgLy8gUHJpbnQgdGhlIGVsZW1lbnQncyBuYW1lc3BhY2UsIGlmIGFwcHJvcHJpYXRlCi0gICAgICAgIHByaW50RWxlbWVudE5hbWVzcGFjZShvdXQsIGVsZW1lbnQsIG5hbWVzcGFjZXMpOwotCi0gICAgICAgIC8vIFByaW50IG91dCBhZGRpdGlvbmFsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKLSAgICAgICAgcHJpbnRBZGRpdGlvbmFsTmFtZXNwYWNlcyhvdXQsIGVsZW1lbnQsIG5hbWVzcGFjZXMpOwotCi0gICAgICAgIC8vIFByaW50IG91dCBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICBwcmludEF0dHJpYnV0ZXMob3V0LCBhdHRyaWJ1dGVzLCBlbGVtZW50LCBuYW1lc3BhY2VzKTsKLQotICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHNldHRpbmdzIChuZXdsaW5lcywgdGV4dE5vcm1hbGl6ZSwgZXRjKSwgd2UgbWF5Ci0gICAgICAgIC8vIG9yIG1heSBub3Qgd2FudCB0byBwcmludCBhbGwgb2YgdGhlIGNvbnRlbnQsIHNvIGRldGVybWluZSB0aGUKLSAgICAgICAgLy8gaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50IHdlJ3JlIGludGVyZXN0ZWQKLSAgICAgICAgLy8gaW4gYmFzZWQgb24gdGhlIGN1cnJlbnQgc2V0dGluZ3MuCi0KLSAgICAgICAgaW50IHN0YXJ0ID0gc2tpcExlYWRpbmdXaGl0ZShjb250ZW50LCAwKTsKLSAgICAgICAgaW50IHNpemUgPSBjb250ZW50LnNpemUoKTsKLSAgICAgICAgaWYgKHN0YXJ0ID49IHNpemUpIHsKLSAgICAgICAgICAgIC8vIENhc2UgY29udGVudCBpcyBlbXB0eSBvciBhbGwgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlCi0gICAgICAgICAgICBpZiAoY3VycmVudEZvcm1hdC5leHBhbmRFbXB0eUVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCI+PC8iKTsKLSAgICAgICAgICAgICAgICBwcmludFF1YWxpZmllZE5hbWUob3V0LCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiIC8+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIj4iKTsKLQotICAgICAgICAgICAgLy8gRm9yIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBjb250ZW50IGlzIG9ubHkgQ0RBVEEKLSAgICAgICAgICAgIC8vIG9yIFRleHQgd2UgZG9uJ3Qgd2FudCB0byBpbmRlbnQgYWZ0ZXIgdGhlIHN0YXJ0IG9yCi0gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIGVuZCB0YWcuCi0KLSAgICAgICAgICAgIGlmIChuZXh0Tm9uVGV4dChjb250ZW50LCBzdGFydCkgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FzZSBNaXhlZCBDb250ZW50IC0gbm9ybWFsIGluZGVudGF0aW9uCi0gICAgICAgICAgICAgICAgbmV3bGluZShvdXQpOwotICAgICAgICAgICAgICAgIHByaW50Q29udGVudFJhbmdlKG91dCwgY29udGVudCwgc3RhcnQsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKyAxLCBuYW1lc3BhY2VzKTsKLSAgICAgICAgICAgICAgICBuZXdsaW5lKG91dCk7Ci0gICAgICAgICAgICAgICAgaW5kZW50KG91dCwgbGV2ZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FzZSBhbGwgQ0RBVEEgb3IgVGV4dCAtIG5vIGluZGVudGF0aW9uCi0gICAgICAgICAgICAgICAgcHJpbnRUZXh0UmFuZ2Uob3V0LCBjb250ZW50LCBzdGFydCwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjwvIik7Ci0gICAgICAgICAgICBwcmludFF1YWxpZmllZE5hbWUob3V0LCBlbGVtZW50KTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGRlY2xhcmVkIG5hbWVzcGFjZXMgZnJvbSBzdGFjawotICAgICAgICB3aGlsZSAobmFtZXNwYWNlcy5zaXplKCkgPiBwcmV2aW91c2x5RGVjbGFyZWROYW1lc3BhY2VzKSB7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzLnBvcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzdG9yZSBvdXIgZm9ybWF0IHNldHRpbmdzCi0gICAgICAgIGN1cnJlbnRGb3JtYXQgPSBwcmV2aW91c0Zvcm1hdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgaGFuZGxlIHByaW50aW5nIG9mIGNvbnRlbnQgd2l0aGluIGEgZ2l2ZW4gcmFuZ2UuCi0gICAgICogVGhlIHJhbmdlIHRvIHByaW50IGlzIHNwZWNpZmllZCBpbiB0eXBpY2FsIEphdmEgZmFzaGlvbjsgdGhlCi0gICAgICogc3RhcnRpbmcgaW5kZXggaXMgaW5jbHVzaXZlLCB3aGlsZSB0aGUgZW5kaW5nIGluZGV4IGlzCi0gICAgICogZXhjbHVzaXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnQgPGNvZGU+TGlzdDwvY29kZT4gb2YgY29udGVudCB0byBvdXRwdXQKLSAgICAgKiBAcGFyYW0gc3RhcnQgaW5kZXggb2YgZmlyc3QgY29udGVudCBub2RlIChpbmNsdXNpdmUuCi0gICAgICogQHBhcmFtIGVuZCBpbmRleCBvZiBsYXN0IGNvbnRlbnQgbm9kZSAoZXhjbHVzaXZlKS4KLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlLgotICAgICAqIEBwYXJhbSBsZXZlbCA8Y29kZT5pbnQ8L2NvZGU+IGxldmVsIG9mIGluZGVudGF0aW9uLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzIDxjb2RlPkxpc3Q8L2NvZGU+IHN0YWNrIG9mIE5hbWVzcGFjZXMgaW4gc2NvcGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50Q29udGVudFJhbmdlKFdyaXRlciBvdXQsIExpc3QgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VTdGFjayBuYW1lc3BhY2VzKQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGZpcnN0Tm9kZTsgLy8gRmxhZyBmb3IgMXN0IG5vZGUgaW4gY29udGVudAotICAgICAgICBPYmplY3QgbmV4dDsgICAgICAgLy8gTm9kZSB3ZSdyZSBhYm91dCB0byBwcmludAotICAgICAgICBpbnQgZmlyc3QsIGluZGV4OyAgLy8gSW5kZXhlcyBpbnRvIHRoZSBsaXN0IG9mIGNvbnRlbnQKLQotICAgICAgICBpbmRleCA9IHN0YXJ0OwotICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgIGZpcnN0Tm9kZSA9IChpbmRleCA9PSBzdGFydCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgICBuZXh0ID0gY29udGVudC5nZXQoaW5kZXgpOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSGFuZGxlIGNvbnNlY3V0aXZlIENEQVRBLCBUZXh0LCBhbmQgRW50aXR5UmVmIG5vZGVzIGFsbCBhdCBvbmNlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKChuZXh0IGluc3RhbmNlb2YgVGV4dCkgfHwgKG5leHQgaW5zdGFuY2VvZiBFbnRpdHlSZWYpKSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBza2lwTGVhZGluZ1doaXRlKGNvbnRlbnQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgaW5kZXggdG8gbmV4dCBub2RlIGZvciBsb29wCi0gICAgICAgICAgICAgICAgaW5kZXggPSBuZXh0Tm9uVGV4dChjb250ZW50LCBmaXJzdCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhbGwgd2hpdGVzcGFjZSAtIHByaW50IGl0IQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA8IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3ROb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZShvdXQpOwotICAgICAgICAgICAgICAgICAgICBpbmRlbnQob3V0LCBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VGV4dFJhbmdlKG91dCwgY29udGVudCwgZmlyc3QsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgbm9kZXMKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkgewotICAgICAgICAgICAgICAgIG5ld2xpbmUob3V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5kZW50KG91dCwgbGV2ZWwpOwotCi0gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLSAgICAgICAgICAgICAgICBwcmludENvbW1lbnQob3V0LCAoQ29tbWVudCluZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFbGVtZW50KG91dCwgKEVsZW1lbnQpbmV4dCwgbGV2ZWwsIG5hbWVzcGFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotICAgICAgICAgICAgICAgIHByaW50UHJvY2Vzc2luZ0luc3RydWN0aW9uKG91dCwgKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiluZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFhYWCBpZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgYSBpbGxlZ2FsIGNvbnRlbnQsIGZvcgotICAgICAgICAgICAgICAgIC8vICAgICBub3cgd2UnbGwganVzdCBpZ25vcmUgaXQgKHByb2JhYmx5IHNob3VsZCB0aHJvdwotICAgICAgICAgICAgICAgIC8vICAgICBhIGV4Y2VwdGlvbikKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfSAvKiB3aGlsZSAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb2YgYSBzZXF1ZW5jZSBvZiA8Y29kZT57QGxpbmsgQ0RBVEF9PC9jb2RlPgotICAgICAqIG9yIDxjb2RlPntAbGluayBUZXh0fTwvY29kZT4gbm9kZXMuICBJdCBpcyBhbiBlcnJvciB0byBoYXZlIGFueSBvdGhlcgotICAgICAqIHBhc3MgdGhpcyBtZXRob2QgYW55IG90aGVyIHR5cGUgb2Ygbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IDxjb2RlPkxpc3Q8L2NvZGU+IG9mIGNvbnRlbnQgdG8gb3V0cHV0Ci0gICAgICogQHBhcmFtIHN0YXJ0IGluZGV4IG9mIGZpcnN0IGNvbnRlbnQgbm9kZSAoaW5jbHVzaXZlKS4KLSAgICAgKiBAcGFyYW0gZW5kIGluZGV4IG9mIGxhc3QgY29udGVudCBub2RlIChleGNsdXNpdmUpLgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+V3JpdGVyPC9jb2RlPiB0byB1c2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VGV4dFJhbmdlKFdyaXRlciBvdXQsIExpc3QgY29udGVudCwgaW50IHN0YXJ0LCBpbnQgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJldmlvdXM7IC8vIFByZXZpb3VzIHRleHQgcHJpbnRlZAotICAgICAgICBPYmplY3Qgbm9kZTsgICAgIC8vIE5leHQgbm9kZSB0byBwcmludAotICAgICAgICBTdHJpbmcgbmV4dDsgICAgIC8vIE5leHQgdGV4dCB0byBwcmludAotCi0gICAgICAgIHByZXZpb3VzID0gbnVsbDsKLQotICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlLW9ubHkgbm9kZXMKLSAgICAgICAgc3RhcnQgPSBza2lwTGVhZGluZ1doaXRlKGNvbnRlbnQsIHN0YXJ0KTsKLQotICAgICAgICBpbnQgc2l6ZSA9IGNvbnRlbnQuc2l6ZSgpOwotICAgICAgICBpZiAoc3RhcnQgPCBzaXplKSB7Ci0gICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIHRyaWFsaW5nIHdoaXRlc3BhY2Utb25seSBub2RlcwotICAgICAgICAgICAgZW5kID0gc2tpcFRyYWlsaW5nV2hpdGUoY29udGVudCwgZW5kKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBub2RlID0gY29udGVudC5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHVubWFuZ2xlZCB2ZXJzaW9uIG9mIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgLy8gd2UgYXJlIGFib3V0IHRvIHByaW50Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgPSAoKFRleHQpIG5vZGUpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eVJlZikgewotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gIiYiICsgKChFbnRpdHlSZWYpIG5vZGUpLmdldFZhbHVlKCkgKyAiOyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTaG91bGQgc2VlIG9ubHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0RBVEEsIFRleHQsIG9yIEVudGl0eVJlZiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHNhdmUgYSBsaXR0bGUgdGltZQotICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwgfHwgIiIuZXF1YWxzKG5leHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHBhZCB0aGUgb3V0cHV0IChwYWRkaW5nIGlzCi0gICAgICAgICAgICAgICAgLy8gb25seSBuZWVkIGluIHRyaW0gb3Igbm9ybWFsaXppbmcgbW9kZSkKLSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgeyAvLyBOb3QgMXN0IG5vZGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuTk9STUFMSVpFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLlRSSU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVuZHNXaXRoV2hpdGUocHJldmlvdXMpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRzV2l0aFdoaXRlKG5leHQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIG5vZGUKLSAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENEQVRBKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50Q0RBVEEob3V0LCAoQ0RBVEEpIG5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5UmVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RW50aXR5UmVmKG91dCwgKEVudGl0eVJlZikgbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmludFN0cmluZyhvdXQsIG5leHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb2YgYW55IG5lZWRlZCA8Y29kZT57QGxpbmsgTmFtZXNwYWNlfTwvY29kZT4KLSAgICAgKiBkZWNsYXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnMgPGNvZGU+TmFtZXNwYWNlPC9jb2RlPiB0byBwcmludCBkZWZpbml0aW9uIG9mCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJpbnROYW1lc3BhY2UoV3JpdGVyIG91dCwgTmFtZXNwYWNlIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VTdGFjayBuYW1lc3BhY2VzKQotICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5zLmdldFByZWZpeCgpOwotICAgICAgICBTdHJpbmcgdXJpID0gbnMuZ2V0VVJJKCk7Ci0KLSAgICAgICAgLy8gQWxyZWFkeSBwcmludGVkIG5hbWVzcGFjZSBkZWNsPwotICAgICAgICBpZiAodXJpLmVxdWFscyhuYW1lc3BhY2VzLmdldFVSSShwcmVmaXgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LndyaXRlKCIgeG1sbnMiKTsKLSAgICAgICAgaWYgKCFwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgb3V0LndyaXRlKCI6Iik7Ci0gICAgICAgICAgICBvdXQud3JpdGUocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoIj1cIiIpOwotICAgICAgICBvdXQud3JpdGUodXJpKTsKLSAgICAgICAgb3V0LndyaXRlKCJcIiIpOwotICAgICAgICBuYW1lc3BhY2VzLnB1c2gobnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgcHJpbnRpbmcgb2YgYSA8Y29kZT57QGxpbmsgQXR0cmlidXRlfTwvY29kZT4gbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIEF0dHJpYnV0ZSBvYmpjdHMKLSAgICAgKiBAcGFyYW0gb3V0IDxjb2RlPldyaXRlcjwvY29kZT4gdG8gdXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRBdHRyaWJ1dGVzKFdyaXRlciBvdXQsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gSSBkbyBub3QgeWV0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgc2FtZSBwcmVmaXggbWFwcyB0bwotICAgICAgICAvLyB0d28gZGlmZmVyZW50IFVSSXMuIEZvciBhdHRyaWJ1dGVzIG9uIHRoZSBzYW1lIGVsZW1lbnQKLSAgICAgICAgLy8gdGhpcyBpcyBpbGxlZ2FsOyBidXQgYXMgeWV0IHdlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAvLyBpZiBzb21lb25lIHRyaWVzIHRvIGRvIHRoaXMKLSAgICAgICAgLy8gU2V0IHByZWZpeGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBOYW1lc3BhY2UgbnMgPSBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoKG5zICE9IE5hbWVzcGFjZS5OT19OQU1FU1BBQ0UpICYmCi0gICAgICAgICAgICAgICAgKG5zICE9IE5hbWVzcGFjZS5YTUxfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludE5hbWVzcGFjZShvdXQsIG5zLCBuYW1lc3BhY2VzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LndyaXRlKCIgIik7Ci0gICAgICAgICAgICBwcmludFF1YWxpZmllZE5hbWUob3V0LCBhdHRyaWJ1dGUpOwotICAgICAgICAgICAgb3V0LndyaXRlKCI9Iik7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZSgiXCIiKTsKLSAgICAgICAgICAgIG91dC53cml0ZShlc2NhcGVBdHRyaWJ1dGVFbnRpdGllcyhhdHRyaWJ1dGUuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RWxlbWVudE5hbWVzcGFjZShXcml0ZXIgb3V0LCBFbGVtZW50IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VTdGFjayBuYW1lc3BhY2VzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBBZGQgbmFtZXNwYWNlIGRlY2wgb25seSBpZiBpdCdzIG5vdCB0aGUgWE1MIG5hbWVzcGFjZSBhbmQgaXQncwotICAgICAgICAvLyBub3QgdGhlIE5PX05BTUVTUEFDRSB3aXRoIHRoZSBwcmVmaXggIiIgbm90IHlldCBtYXBwZWQKLSAgICAgICAgLy8gKHdlIGRvIG91dHB1dCB4bWxucz0iIiBpZiB0aGUgIiIgcHJlZml4IHdhcyBhbHJlYWR5IHVzZWQgYW5kIHdlCi0gICAgICAgIC8vIG5lZWQgdG8gcmVjbGFpbSBpdCBmb3IgdGhlIE5PX05BTUVTUEFDRSkKLSAgICAgICAgTmFtZXNwYWNlIG5zID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5zID09IE5hbWVzcGFjZS5YTUxfTkFNRVNQQUNFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhKChucyA9PSBOYW1lc3BhY2UuTk9fTkFNRVNQQUNFKSAmJgotICAgICAgICAgICAgICAgKG5hbWVzcGFjZXMuZ2V0VVJJKCIiKSA9PSBudWxsKSkpIHsKLSAgICAgICAgICAgIHByaW50TmFtZXNwYWNlKG91dCwgbnMsIG5hbWVzcGFjZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50QWRkaXRpb25hbE5hbWVzcGFjZXMoV3JpdGVyIG91dCwgRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVN0YWNrIG5hbWVzcGFjZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0QWRkaXRpb25hbE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIGFkZGl0aW9uYWwgPSAoTmFtZXNwYWNlKWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHByaW50TmFtZXNwYWNlKG91dCwgYWRkaXRpb25hbCwgbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAqICogKiAqICogKiAqICogKiAqIFN1cHBvcnQgbWV0aG9kcyAqICogKiAqICogKiAqICogKiAqCi0gICAgLy8gKiAqICogKiAqICogKiAqICogKiBTdXBwb3J0IG1ldGhvZHMgKiAqICogKiAqICogKiAqICogKgotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHByaW50IGEgbmV3IGxpbmUgb25seSBpZiB0aGUgbmV3bGluZXMgZmxhZyB3YXMgc2V0IHRvCi0gICAgICogdHJ1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgPGNvZGU+V3JpdGVyPC9jb2RlPiB0byB1c2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbmV3bGluZShXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoY3VycmVudEZvcm1hdC5pbmRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGN1cnJlbnRGb3JtYXQubGluZVNlcGFyYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcHJpbnQgaW5kZW50cyAob25seSBpZiB0aGUgbmV3bGluZXMgZmxhZyB3YXMKLSAgICAgKiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIGFuZCBpbmRlbnQgaXMgbm9uLW51bGwpLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHVzZQotICAgICAqIEBwYXJhbSBsZXZlbCBjdXJyZW50IGluZGVudCBsZXZlbCAobnVtYmVyIG9mIHRhYnMpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluZGVudChXcml0ZXIgb3V0LCBpbnQgbGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0LmluZGVudCA9PSBudWxsIHx8Ci0gICAgICAgICAgICBjdXJyZW50Rm9ybWF0LmluZGVudC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKLSAgICAgICAgICAgIG91dC53cml0ZShjdXJyZW50Rm9ybWF0LmluZGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLWFsbC13aGl0ZXNwYWNlIENEQVRBIG9yIFRleHQsCi0gICAgLy8gaW5kZXggPSBjb250ZW50LnNpemUoKSBpcyByZXR1cm5lZCBpZiBjb250ZW50IGNvbnRhaW5zCi0gICAgLy8gYWxsIHdoaXRlc3BhY2UuCi0gICAgLy8gQHBhcmFtIHN0YXJ0IGluZGV4IHRvIGJlZ2luIHNlYXJjaCAoaW5jbHVzaXZlKQotICAgIHByaXZhdGUgaW50IHNraXBMZWFkaW5nV2hpdGUoTGlzdCBjb250ZW50LCBpbnQgc3RhcnQpIHsKLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gc3RhcnQ7Ci0gICAgICAgIGludCBzaXplID0gY29udGVudC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLlRSSU1fRlVMTF9XSElURQotICAgICAgICAgICAgICAgIHx8IGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuTk9STUFMSVpFCi0gICAgICAgICAgICAgICAgfHwgY3VycmVudEZvcm1hdC5tb2RlID09IEZvcm1hdC5UZXh0TW9kZS5UUklNKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0FsbFdoaXRlc3BhY2UoY29udGVudC5nZXQoaW5kZXgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUgaW5kZXggKyAxIG9mIHRoZSBsYXN0IG5vbi1hbGwtd2hpdGVzcGFjZSBDREFUQSBvcgotICAgIC8vIFRleHQgbm9kZSwgIGluZGV4IDwgMCBpcyByZXR1cm5lZAotICAgIC8vIGlmIGNvbnRlbnQgY29udGFpbnMgYWxsIHdoaXRlc3BhY2UuCi0gICAgLy8gQHBhcmFtIHN0YXJ0IGluZGV4IHRvIGJlZ2luIHNlYXJjaCAoZXhjbHVzaXZlKQotICAgIHByaXZhdGUgaW50IHNraXBUcmFpbGluZ1doaXRlKExpc3QgY29udGVudCwgaW50IHN0YXJ0KSB7Ci0gICAgICAgIGludCBzaXplID0gY29udGVudC5zaXplKCk7Ci0gICAgICAgIGlmIChzdGFydCA+IHNpemUpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IHN0YXJ0OwotICAgICAgICBpZiAoY3VycmVudEZvcm1hdC5tb2RlID09IEZvcm1hdC5UZXh0TW9kZS5UUklNX0ZVTExfV0hJVEUKLSAgICAgICAgICAgICAgICB8fCBjdXJyZW50Rm9ybWF0Lm1vZGUgPT0gRm9ybWF0LlRleHRNb2RlLk5PUk1BTElaRQotICAgICAgICAgICAgICAgIHx8IGN1cnJlbnRGb3JtYXQubW9kZSA9PSBGb3JtYXQuVGV4dE1vZGUuVFJJTSkgewotICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzQWxsV2hpdGVzcGFjZShjb250ZW50LmdldChpbmRleCAtIDEpKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIHRoZSBuZXh0IG5vbi1DREFUQSwgbm9uLVRleHQsIG9yIG5vbi1FbnRpdHlSZWYgbm9kZSwKLSAgICAvLyBpbmRleCA9IGNvbnRlbnQuc2l6ZSgpIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIG1vcmUgbm9uLUNEQVRBLAotICAgIC8vIG5vbi1UZXh0LCBvciBub24tRW50aXJ5UmVmIG5vZGVzCi0gICAgLy8gQHBhcmFtIHN0YXJ0IGluZGV4IHRvIGJlZ2luIHNlYXJjaCAoaW5jbHVzaXZlKQotICAgIHByaXZhdGUgc3RhdGljIGludCBuZXh0Tm9uVGV4dChMaXN0IGNvbnRlbnQsIGludCBzdGFydCkgewotICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBzdGFydDsKLSAgICAgICAgaW50IHNpemUgPSBjb250ZW50LnNpemUoKTsKLSAgICAgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgewotICAgICAgICAgICAgT2JqZWN0IG5vZGUgPSAgY29udGVudC5nZXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKCEoKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB8fCAobm9kZSBpbnN0YW5jZW9mIEVudGl0eVJlZikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgYSBPYmplY3QgaXMgYWxsIHdoaXRlc3BhY2UKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGxXaGl0ZXNwYWNlKE9iamVjdCBvYmopIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgc3RyID0gKFN0cmluZykgb2JqOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgIHN0ciA9ICgoVGV4dCkgb2JqKS5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5UmVmKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzV2hpdGVzcGFjZShzdHIuY2hhckF0KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgWE1MIHdoaXRlc3BhY2UuCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0c1dpdGhXaGl0ZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmICgoc3RyICE9IG51bGwpICYmCi0gICAgICAgICAgICAoc3RyLmxlbmd0aCgpID4gMCkgJiYKLSAgICAgICAgICAgIGlzV2hpdGVzcGFjZShzdHIuY2hhckF0KDApKSkgewotICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIFhNTCB3aGl0ZXNwYWNlLgotICAgIHByaXZhdGUgYm9vbGVhbiBlbmRzV2l0aFdoaXRlKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKChzdHIgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChzdHIubGVuZ3RoKCkgPiAwKSAmJgotICAgICAgICAgICAgaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoc3RyLmxlbmd0aCgpIC0gMSkpKSB7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgYSBjaGFyYWN0ZXIgaXMgYSBYTUwgd2hpdGVzcGFjZS4KLSAgICAvLyBYWFggc2hvdWxkIHRoaXMgbWV0aG9kIGJlIGluIFZlcmlmaWVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoY2hhciBjKSB7Ci0gICAgICAgIGlmIChjPT0nICcgfHwgYz09J1xuJyB8fCBjPT0nXHQnIHx8IGM9PSdccicgKXsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgdGFrZSB0aGUgcHJlLWRlZmluZWQgZW50aXRpZXMgaW4gWE1MIDEuMCBhbmQKLSAgICAgKiBjb252ZXJ0IHRoZWlyIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgKiBlbnRpdHkgcmVmZXJlbmNlLCBzdWl0YWJsZSBmb3IgWE1MIGF0dHJpYnV0ZXMuICBJdCBkb2VzIG5vdCBjb252ZXJ0Ci0gICAgICogdGhlIHNpbmdsZSBxdW90ZSAoJykgYmVjYXVzZSBpdCdzIG5vdCBuZWNlc3NhcnkgYXMgdGhlIG91dHB1dHRlcgotICAgICAqIHdyaXRlcyBhdHRyaWJ1dGVzIHN1cnJvdW5kZWQgYnkgZG91YmxlLXF1b3Rlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgPGNvZGU+U3RyaW5nPC9jb2RlPiBpbnB1dCB0byBlc2NhcGUuCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IHdpdGggZXNjYXBlZCBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZXNjYXBlQXR0cmlidXRlRW50aXRpZXMoU3RyaW5nIHN0cikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwotICAgICAgICBjaGFyIGNoOwotICAgICAgICBTdHJpbmcgZW50aXR5OwotICAgICAgICBFc2NhcGVTdHJhdGVneSBzdHJhdGVneSA9IGN1cnJlbnRGb3JtYXQuZXNjYXBlU3RyYXRlZ3k7Ci0KLSAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2ggPSBzdHIuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoKGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnPCcgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJmx0OyI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJz4nIDoKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gIiZndDsiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8qCi0gICAgICAgICAgICAgICAgY2FzZSAnXCcnIDoKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gIiZhcG9zOyI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotKi8KLSAgICAgICAgICAgICAgICBjYXNlICdcIicgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJnF1b3Q7IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnJicgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJmFtcDsiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdccicgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJiN4RDsiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdcdCcgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJiN4OTsiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdcbicgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJiN4QTsiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmF0ZWd5LnNob3VsZEVzY2FwZShjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9ICImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiOyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFuIGVudGl0eSBvY2N1cnJlZCwgc28gd2UnbGwgaGF2ZSB0byB1c2UgU3RyaW5nQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIChhbGxvY2F0ZSByb29tIGZvciBpdCBwbHVzIGEgZmV3IG1vcmUgZW50aXRpZXMpLgotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKSArIDIwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBwcmV2aW91cyBza2lwcGVkIGNoYXJhY3RlcnMgYW5kIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAvLyB0byBwaWNrdXAgY3VycmVudCBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50aXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGFueSBlbnRpdGllcywgcmV0dXJuIHRoZSBlc2NhcGVkIGNoYXJhY3RlcnMKLSAgICAgICAgLy8gdGhhdCB3ZSBwdXQgaW4gdGhlIFN0cmluZ0J1ZmZlci4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybgotICAgICAgICAvLyB0aGUgdW5tb2RpZmllZCBpbnB1dCBzdHJpbmcuCi0gICAgICAgIHJldHVybiAoYnVmZmVyID09IG51bGwpID8gc3RyIDogYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgdGFrZSB0aGUgdGhyZWUgcHJlLWRlZmluZWQgZW50aXRpZXMgaW4gWE1MIDEuMAotICAgICAqICh1c2VkIHNwZWNpZmljYWxseSBpbiBYTUwgZWxlbWVudHMpIGFuZCBjb252ZXJ0IHRoZWlyIGNoYXJhY3RlcgotICAgICAqIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBlbnRpdHkgcmVmZXJlbmNlLCBzdWl0YWJsZSBmb3IKLSAgICAgKiBYTUwgZWxlbWVudCBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciA8Y29kZT5TdHJpbmc8L2NvZGU+IGlucHV0IHRvIGVzY2FwZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gd2l0aCBlc2NhcGVkIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBlc2NhcGVFbGVtZW50RW50aXRpZXMoU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoZXNjYXBlT3V0cHV0ID09IGZhbHNlKSByZXR1cm4gc3RyOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7Ci0gICAgICAgIGNoYXIgY2g7Ci0gICAgICAgIFN0cmluZyBlbnRpdHk7Ci0gICAgICAgIEVzY2FwZVN0cmF0ZWd5IHN0cmF0ZWd5ID0gY3VycmVudEZvcm1hdC5lc2NhcGVTdHJhdGVneTsKLQotICAgICAgICBidWZmZXIgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2goY2gpIHsKLSAgICAgICAgICAgICAgICBjYXNlICc8JyA6Ci0gICAgICAgICAgICAgICAgICAgIGVudGl0eSA9ICImbHQ7IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnPicgOgotICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAiJmd0OyI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJyYnIDoKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gIiZhbXA7IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInIDoKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gIiYjeEQ7IjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nIDoKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gY3VycmVudEZvcm1hdC5saW5lU2VwYXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmF0ZWd5LnNob3VsZEVzY2FwZShjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9ICImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiOyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFuIGVudGl0eSBvY2N1cnJlZCwgc28gd2UnbGwgaGF2ZSB0byB1c2UgU3RyaW5nQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIChhbGxvY2F0ZSByb29tIGZvciBpdCBwbHVzIGEgZmV3IG1vcmUgZW50aXRpZXMpLgotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKSArIDIwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBwcmV2aW91cyBza2lwcGVkIGNoYXJhY3RlcnMgYW5kIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAvLyB0byBwaWNrdXAgY3VycmVudCBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50aXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGFueSBlbnRpdGllcywgcmV0dXJuIHRoZSBlc2NhcGVkIGNoYXJhY3RlcnMKLSAgICAgICAgLy8gdGhhdCB3ZSBwdXQgaW4gdGhlIFN0cmluZ0J1ZmZlci4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybgotICAgICAgICAvLyB0aGUgdW5tb2RpZmllZCBpbnB1dCBzdHJpbmcuCi0gICAgICAgIHJldHVybiAoYnVmZmVyID09IG51bGwpID8gc3RyIDogYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBYTUxPdXRwdXR0ZXIuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6IFNpbmNlIGFsbCBzdGF0ZSBvZiBhbiBYTUxPdXRwdXR0ZXIgaXMKLSAgICAgICAgLy8gZW1ib2RpZWQgaW4gc2ltcGxlIHByaXZhdGUgaW5zdGFuY2UgdmFyaWFibGVzLCBPYmplY3QuY2xvbmUKLSAgICAgICAgLy8gY2FuIGJlIHVzZWQuICBOb3RlIHRoYXQgc2luY2UgT2JqZWN0LmNsb25lIGlzIHRvdGFsbHkKLSAgICAgICAgLy8gYnJva2VuLCB3ZSBtdXN0IGNhdGNoIGFuIGV4Y2VwdGlvbiB0aGF0IHdpbGwgbmV2ZXIgYmUKLSAgICAgICAgLy8gdGhyb3duLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEubGFuZy5DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBldmVuIHRob3VnaCB0aGlzIHNob3VsZCBuZXZlciBldmVyIGhhcHBlbiwgaXQncyBzdGlsbAotICAgICAgICAgICAgLy8gcG9zc2libGUgdG8gZm9vbCBKYXZhIGludG8gdGhyb3dpbmcgYQotICAgICAgICAgICAgLy8gQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24uICBJZiB0aGF0IGhhcHBlbnMsIHdlCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3Qgc3dhbGxvdyBpdC4KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgbGlzdGluZyBvZiB0aGUgc2V0dGluZ3MgZm9yIHRoaXMKLSAgICAgKiBYTUxPdXRwdXR0ZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGxpc3RpbmcgdGhlIHNldHRpbmdzIGZvciB0aGlzIFhNTE91dHB1dHRlciBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlckZvcm1hdC5saW5lU2VwYXJhdG9yLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB1c2VyRm9ybWF0LmxpbmVTZXBhcmF0b3IuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnXHInOiBidWZmZXIuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdcbic6IGJ1ZmZlci5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1x0JzogYnVmZmVyLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogICBidWZmZXIuYXBwZW5kKCJbIiArICgoaW50KWNoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgKLSAgICAgICAgICAgICJYTUxPdXRwdXR0ZXJbb21pdERlY2xhcmF0aW9uID0gIiArIHVzZXJGb3JtYXQub21pdERlY2xhcmF0aW9uICsgIiwgIiArCi0gICAgICAgICAgICAiZW5jb2RpbmcgPSAiICsgdXNlckZvcm1hdC5lbmNvZGluZyArICIsICIgKwotICAgICAgICAgICAgIm9taXRFbmNvZGluZyA9ICIgKyB1c2VyRm9ybWF0Lm9taXRFbmNvZGluZyArICIsICIgKwotICAgICAgICAgICAgImluZGVudCA9ICciICsgdXNlckZvcm1hdC5pbmRlbnQgKyAiJyIgKyAiLCAiICsKLSAgICAgICAgICAgICJleHBhbmRFbXB0eUVsZW1lbnRzID0gIiArIHVzZXJGb3JtYXQuZXhwYW5kRW1wdHlFbGVtZW50cyArICIsICIgKwotICAgICAgICAgICAgImxpbmVTZXBhcmF0b3IgPSAnIiArIGJ1ZmZlci50b1N0cmluZygpICsgIicsICIgKwotICAgICAgICAgICAgInRleHRNb2RlID0gIiArIHVzZXJGb3JtYXQubW9kZSArICJdIgotICAgICAgICApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgZm9yIG1ha2luZyBuZXcgTmFtZXNwYWNlU3RhY2sgb2JqZWN0cy4gIFRoZSBOYW1lc3BhY2VTdGFjawotICAgICAqIGNyZWF0ZWQgaXMgYWN0dWFsbHkgYW4gaW5uZXIgY2xhc3MgZXh0ZW5kaW5nIHRoZSBwYWNrYWdlIHByb3RlY3RlZAotICAgICAqIE5hbWVzcGFjZVN0YWNrLCBhcyBhIHdheSB0byBtYWtlIE5hbWVzcGFjZVN0YWNrICJmcmllbmRseSIgdG93YXJkCi0gICAgICogc3ViY2xhc3NlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VTdGFjayBjcmVhdGVOYW1lc3BhY2VTdGFjaygpIHsKLSAgICAgICAvLyBhY3R1YWxseSByZXR1cm5zIGEgWE1MT3V0cHV0dGVyLk5hbWVzcGFjZVN0YWNrIChzZWUgYmVsb3cpCi0gICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VTdGFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91ciBvd24gbnVsbCBzdWJjbGFzcyBvZiBOYW1lc3BhY2VTdGFjay4gIFRoaXMgcGxheXMgYSBsaXR0bGUKLSAgICAgKiB0cmljayB3aXRoIEphdmEgYWNjZXNzIHByb3RlY3Rpb24uICBXZSB3YW50IHN1YmNsYXNzZXMgb2YKLSAgICAgKiBYTUxPdXRwdXR0ZXIgdG8gYmUgYWJsZSB0byBvdmVycmlkZSBwcm90ZWN0ZWQgbWV0aG9kcyB0aGF0Ci0gICAgICogZGVjbGFyZSBhIE5hbWVzcGFjZVN0YWNrIHBhcmFtZXRlciwgYnV0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgKiBkZWNsYXJlIHRoZSBwYXJlbnQgTmFtZXNwYWNlU3RhY2sgY2xhc3MgYXMgcHVibGljLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VTdGFjawotICAgICAgICBleHRlbmRzIG9yZy5qZG9tLm91dHB1dC5OYW1lc3BhY2VTdGFjawotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBTdXBwb3J0IG1ldGhvZCB0byBwcmludCBhIG5hbWUgd2l0aG91dCB1c2luZyBlbHQuZ2V0UXVhbGlmaWVkTmFtZSgpCi0gICAgLy8gYW5kIHRodXMgYXZvaWRpbmcgYSBTdHJpbmdCdWZmZXIgY3JlYXRpb24gYW5kIG1lbW9yeSBjaHVybgotICAgIHByaXZhdGUgdm9pZCBwcmludFF1YWxpZmllZE5hbWUoV3JpdGVyIG91dCwgRWxlbWVudCBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZS5nZXROYW1lc3BhY2UoKS5nZXRQcmVmaXgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgb3V0LndyaXRlKGUuZ2V0TmFtZXNwYWNlKCkuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgb3V0LndyaXRlKCc6Jyk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU3VwcG9ydCBtZXRob2QgdG8gcHJpbnQgYSBuYW1lIHdpdGhvdXQgdXNpbmcgYXR0LmdldFF1YWxpZmllZE5hbWUoKQotICAgIC8vIGFuZCB0aHVzIGF2b2lkaW5nIGEgU3RyaW5nQnVmZmVyIGNyZWF0aW9uIGFuZCBtZW1vcnkgY2h1cm4KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRRdWFsaWZpZWROYW1lKFdyaXRlciBvdXQsIEF0dHJpYnV0ZSBhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gYS5nZXROYW1lc3BhY2UoKS5nZXRQcmVmaXgoKTsKLSAgICAgICAgaWYgKChwcmVmaXggIT0gbnVsbCkgJiYgKCFwcmVmaXguZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIG91dC53cml0ZShwcmVmaXgpOwotICAgICAgICAgICAgb3V0LndyaXRlKCc6Jyk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgb3V0LndyaXRlKGEuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICogKiAqICogKiAqICogKiAqICogRGVwcmVjYXRlZCBtZXRob2RzICogKiAqICogKiAqICogKiAqICoKLQotICAgIC8qIFRoZSBtZXRob2RzIGJlbG93IGhlcmUgYXJlIGRlcHJlY2F0aW9ucyBvZiBwcm90ZWN0ZWQgbWV0aG9kcy4gIFdlCi0gICAgICogZG9uJ3QgdXN1YWxseSBkZXByZWNhdGUgcHJvdGVjdGVkIG1ldGhvZHMsIHNvIHRoZXkncmUgY29tbWVudGVkIG91dC4KLSAgICAgKiBUaGV5J3JlIGxlZnQgaGVyZSBpbiBjYXNlIHRoaXMgbWFzcyBkZXByZWNhdGlvbiBjYXVzZXMgcGVvcGxlIHRyb3VibGUuCi0gICAgICogU2luY2Ugd2UncmUgZ2V0dGluZyBjbG9zZSB0byAxLjAgaXQncyBhY3R1YWxseSBiZXR0ZXIgZm9yIHBlb3BsZSB0bwotICAgICAqIHJhaXNlIGlzc3VlcyBlYXJseSB0aG91Z2guCi0gICAgICovCi0KLX0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vb3V0cHV0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5Y2ZkZC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL291dHB1dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08Ym9keT4KLQotQ2xhc3NlcyB0byBvdXRwdXQgSkRPTSBkb2N1bWVudHMgdG8gdmFyaW91cyBkZXN0aW5hdGlvbnMuICBUaGUgbW9zdCBjb21tb24KLW91dHB1dHRlciBjbGFzcyBpcyBYTUxPdXRwdXR0ZXIgd2hpY2ggb3V0cHV0cyBhIGRvY3VtZW50IChvciBwYXJ0IG9mIGEKLWRvY3VtZW50KSBhcyBhIHN0cmVhbSBvZiBieXRlcy4gIEZvcm1hdCBhbmQgRXNjYXBlU3RyYXRlZ3kgc3VwcG9ydCB0aGUKLVhNTE91dHB1dHRlciBpbiBsZXR0aW5nIHlvdSBjaG9vc2UgaG93IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGZvcm1hdHRlZCBhbmQgaG93Ci1zcGVjaWFsIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGVzY2FwZWQuCi0KLVNBWE91dHB1dHRlciBsZXRzIHlvdSBvdXRwdXQgYXMgYSBzdHJlYW0gb2YgU0FYIGV2ZW50cyAoaGFuZHkgZXNwZWNpYWxseSBpbgotdHJhbnNmb3JtYXRpb25zKS4gIEpET01Mb2NhdG9yIHN1cHBvcnRzIFNBWE91dHB1dHRlciBhbmQgaGVscHMgeW91IG9ic2VydmUgdGhlCi1TQVggb3V0cHV0IHByb2Nlc3MuCi0KLURPTU91dHB1dHRlciBsZXRzIHlvdSBvdXRwdXQgYSBKRE9NIGRvY3VtZW50IGFzIGEgRE9NIHRyZWUuCi0KLTwvYm9keT4KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vcGFja2FnZS5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2QwZTQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08Ym9keT4KLQotQ2xhc3NlcyB0byByZXByZXNlbnQgdGhlIGNvbXBvbmVudHMgb2YgYW4gWE1MIGRvY3VtZW50LiAgVGhlIFZlcmlmaWVyIGlzIGEKLXNwZWNpYWwgY2xhc3MgdXNlZnVsIGluIGVuc3VyaW5nIHdlbGwtZm9ybWVkbmVzcyBvZiBkb2N1bWVudHMuICBUaGUgUGFyZW50Ci1pbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgRG9jdW1lbnQgYW5kIEVsZW1lbnQgZXhwb3NpbmcgdGhlaXIgY29tbW9uYWxpdHkuCi1UaGUgQ29udGVudCBhYnN0cmFjdCBjbGFzcyBpcyBleHRlbmRlZCBieSBhbGwgdGhlIG5vZGUgdHlwZXMgb2YgYSBkb2N1bWVudAotZXhjZXB0IERvY3VtZW50IGl0c2VsZi4KLQotVGhlIEpET01GYWN0b3J5IGludGVyZmFjZSBhbmQgRGVmYXVsdEpET01GYWN0b3J5IHN0YW5kYXJkIGltcGxlbWVudGF0aW9uCi1wcm92aWRlIGFkdmFuY2VkIHVzZXJzIHdpdGggdGhlIGFiaWxpdHkgdG8gY3JlYXRlIHN1YnR5cGVzIG9mIHRoZSBvcmcuamRvbQotY2xhc3Nlcy4KLQotPC9ib2R5PgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdC5qYXZhIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTA3YmY4Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vdHJhbnNmb3JtL0pET01SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKi0tIAotCi0gJElkOiBKRE9NUmVzdWx0LmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzIAotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLSAKLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZSAKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUgCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcyAKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkgCi0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0gCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS50cmFuc2Zvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Lio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogQSBob2xkZXIgZm9yIGFuIFhTTCBUcmFuc2Zvcm1hdGlvbiByZXN1bHQsIGdlbmVyYWxseSBhIGxpc3Qgb2Ygbm9kZXMKLSAqIGFsdGhvdWdoIGl0IGNhbiBiZSBhIEpET00gRG9jdW1lbnQgYWxzby4gQXMgc3RhdGVkIGJ5IHRoZSBYU0xUIDEuMAotICogc3BlY2lmaWNhdGlvbiwgdGhlIHJlc3VsdCB0cmVlIGdlbmVyYXRlZCBieSBhbiBYU0wgdHJhbnNmb3JtYXRpb24gaXMgbm90Ci0gKiByZXF1aXJlZCB0byBiZSBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudC4gVGhlIHJlc3VsdCB0cmVlIG1heSBoYXZlICJhbnkKLSAqIHNlcXVlbmNlIG9mIG5vZGVzIGFzIGNoaWxkcmVuIHRoYXQgd291bGQgYmUgcG9zc2libGUgZm9yIGFuCi0gKiBlbGVtZW50IG5vZGUiLgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFwcGx5IGFuIFhTTCBUcmFuc2Zvcm1hdGlvbgotICogdG8gYSBKRE9NIGRvY3VtZW50IGFuZCBnZXQgdGhlIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCBpbiB0aGUgZm9ybQotICogb2YgYSBsaXN0IG9mIEpET00gbm9kZXM6Ci0gKiA8cHJlPjxjb2RlPgotICogICBwdWJsaWMgc3RhdGljIExpc3QgdHJhbnNmb3JtKERvY3VtZW50IGRvYywgU3RyaW5nIHN0eWxlc2hlZXQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gKiAgICAgdHJ5IHsKLSAqICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZShzdHlsZXNoZWV0KSk7Ci0gKiAgICAgICBKRE9NU291cmNlIGluID0gbmV3IEpET01Tb3VyY2UoZG9jKTsKLSAqICAgICAgIEpET01SZXN1bHQgb3V0ID0gbmV3IEpET01SZXN1bHQoKTsKLSAqICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShpbiwgb3V0KTsKLSAqICAgICAgIHJldHVybiBvdXQuZ2V0UmVzdWx0KCk7Ci0gKiAgICAgfQotICogICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gKiAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiWFNMVCBUcmFuc2Zvcm1hdGlvbiBmYWlsZWQiLCBlKTsKLSAqICAgICB9Ci0gKiAgIH0KLSAqIDwvY29kZT48L3ByZT4KLSAqCi0gKiBAc2VlICAgICAgb3JnLmpkb20udHJhbnNmb3JtLkpET01Tb3VyY2UKLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkCi0gKiBAYXV0aG9yICBMYXVyZW50IEJpaGFuaWMKLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTVJlc3VsdCBleHRlbmRzIFNBWFJlc3VsdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAiQCgjKSAkUkNTZmlsZTogSkRPTVJlc3VsdC5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAvKioKLSAgICogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdGhpcyB2YWx1ZSBhcyBhbgotICAgKiBhcmd1bWVudCwgdGhlIFRyYW5zZm9ybWVyIG5hdGl2ZWx5IHN1cHBvcnRzIEpET00uCi0gICAqIDxwPgotICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgb3ZlcnJpZGUKLSAgICogdGhlIHtAbGluayBTQVhSZXN1bHQjRkVBVFVSRX0gdmFsdWUgZGVmaW5lZCBieSBpdHMgc3VwZXJjbGFzcwotICAgKiB0byBiZSBjb25zaWRlcmVkIGFzIGEgU0FYUmVzdWx0IGJ5IFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9ucwotICAgKiBub3QgbmF0aXZlbHkgc3VwcG9ydGluZyBKRE9NLjwvcD4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpET01fRkVBVFVSRSA9Ci0gICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9vcmcuamRvbS50cmFuc2Zvcm0uSkRPTVJlc3VsdC9mZWF0dXJlIjsKLQotICAvKioKLSAgICogVGhlIHJlc3VsdCBvZiBhIHRyYW5zZm9ybWF0aW9uLCBhcyBzZXQgYnkgVHJhbnNmb3JtZXIKLSAgICogaW1wbGVtZW50YXRpb25zIHRoYXQgbmF0aXZlbHkgc3VwcG9ydCBKRE9NLCBhcyBhIEpET00gZG9jdW1lbnQKLSAgICogb3IgYSBsaXN0IG9mIEpET00gbm9kZXMuCi0gICAqLwotICBwcml2YXRlIE9iamVjdCByZXN1bHQgPSBudWxsOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBxdWVyaWVkIHRoZSByZXN1bHQgKGFzIGEgbGlzdCBvciBhCi0gICAqIGRvY3VtZW50KSBzaW5jZSBpdCB3YXMgbGFzdCBzZXQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcXVlcmllZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY3VzdG9tIEpET00gZmFjdG9yeSB0byB1c2Ugd2hlbiBidWlsZGluZyB0aGUgdHJhbnNmb3JtYXRpb24KLSAgICogcmVzdWx0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdCBKRE9NIGNsYXNzZXMuCi0gICAqLwotICBwcml2YXRlIEpET01GYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0gIC8qKgotICAgKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBKRE9NUmVzdWx0KCkgewotICAgIC8vIEFsbG9jYXRlIGN1c3RvbSBidWlsZGVyIG9iamVjdC4uLgotICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gbmV3IERvY3VtZW50QnVpbGRlcigpOwotCi0gICAgLy8gQW5kIHVzZSBpdCBhcyBDb250ZW50SGFuZGxlciBhbmQgTGV4aWNhbEhhbmRsZXIuCi0gICAgc3VwZXIuc2V0SGFuZGxlcihidWlsZGVyKTsKLSAgICBzdXBlci5zZXRMZXhpY2FsSGFuZGxlcihidWlsZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBvYmplY3QocykgcHJvZHVjZWQgYXMgcmVzdWx0IG9mIGFuIFhTTCBUcmFuc2Zvcm1hdGlvbi4KLSAgICogPHA+Ci0gICAqIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBtZXRob2Qgc2hhbGwgYmUgdXNlZCBieSB0aGUKLSAgICoge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJ9IGltcGxlbWVudGF0aW9ucyB0aGF0Ci0gICAqIG5hdGl2ZWx5IHN1cHBvcnQgSkRPTSB0byBkaXJlY3RseSBzZXQgdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAqIHJlc3VsdCByYXRoZXIgdGhhbiBjb25zaWRlcmluZyB0aGlzIG9iamVjdCBhcyBhCi0gICAqIHtAbGluayBTQVhSZXN1bHR9LiAgQXBwbGljYXRpb25zIHNob3VsZCA8aT5ub3Q8L2k+IHVzZSB0aGlzCi0gICAqIG1ldGhvZC48L3A+Ci0gICAqCi0gICAqIEBwYXJhbSAgcmVzdWx0ICAgdGhlIHJlc3VsdCBvZiBhIHRyYW5zZm9ybWF0aW9uIGFzIGEKLSAgICogICAgICAgICAgICAgICAgICB7QGxpbmsgamF2YS51dGlsLkxpc3QgbGlzdH0gb2YgSkRPTSBub2RlcwotICAgKiAgICAgICAgICAgICAgICAgIChFbGVtZW50cywgVGV4dHMsIENvbW1lbnRzLCBQSXMuLi4pLgotICAgKgotICAgKiBAc2VlICAgICNnZXRSZXN1bHQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc3VsdChMaXN0IHJlc3VsdCkgewotICAgIHRoaXMucmVzdWx0ICA9IHJlc3VsdDsKLSAgICB0aGlzLnF1ZXJpZWQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYW4gWFNMIFRyYW5zZm9ybWF0aW9uIGFzIGEgbGlzdCBvZiBKRE9NCi0gICAqIG5vZGVzLgotICAgKiA8cD4KLSAgICogSWYgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYSBKRE9NIGRvY3VtZW50LAotICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0cyBpdCBpbnRvIGEgbGlzdCBvZiBKRE9NIG5vZGVzOyBhbnkKLSAgICogc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjZ2V0RG9jdW1lbnR9IHdpbGwgcmV0dXJuCi0gICAqIDxjb2RlPm51bGw8L2NvZGU+LjwvcD4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IGFzIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCi0gICAqICAgICAgICAgSkRPTSBub2RlcyAoRWxlbWVudHMsIFRleHRzLCBDb21tZW50cywgUElzLi4uKS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlc3VsdCgpIHsKLSAgICBMaXN0IG5vZGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgIC8vIFJldHJpZXZlIHJlc3VsdCBmcm9tIHRoZSBkb2N1bWVudCBidWlsZGVyIGlmIG5vdCBzZXQuCi0gICAgdGhpcy5yZXRyaWV2ZVJlc3VsdCgpOwotCi0gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgIG5vZGVzID0gKExpc3QpcmVzdWx0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICgocmVzdWx0IGluc3RhbmNlb2YgRG9jdW1lbnQpICYmIChxdWVyaWVkID09IGZhbHNlKSkgewotICAgICAgICBMaXN0IGNvbnRlbnQgPSAoKERvY3VtZW50KXJlc3VsdCkuZ2V0Q29udGVudCgpOwotICAgICAgICBub2RlcyA9IG5ldyBBcnJheUxpc3QoY29udGVudC5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlIChjb250ZW50LnNpemUoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG8gPSBjb250ZW50LnJlbW92ZSgwKTsKLSAgICAgICAgICBub2Rlcy5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gbm9kZXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHF1ZXJpZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIChub2Rlcyk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYXMgcmVzdWx0IG9mIGFuIFhTTCBUcmFuc2Zvcm1hdGlvbi4KLSAgICogPHA+Ci0gICAqIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBtZXRob2Qgc2hhbGwgYmUgdXNlZCBieSB0aGUKLSAgICoge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJ9IGltcGxlbWVudGF0aW9ucyB0aGF0Ci0gICAqIG5hdGl2ZWx5IHN1cHBvcnQgSkRPTSB0byBkaXJlY3RseSBzZXQgdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAqIHJlc3VsdCByYXRoZXIgdGhhbiBjb25zaWRlcmluZyB0aGlzIG9iamVjdCBhcyBhCi0gICAqIHtAbGluayBTQVhSZXN1bHR9LiAgQXBwbGljYXRpb25zIHNob3VsZCA8aT5ub3Q8L2k+IHVzZSB0aGlzCi0gICAqIG1ldGhvZC48L3A+Ci0gICAqCi0gICAqIEBwYXJhbSAgZG9jdW1lbnQgICB0aGUgSkRPTSBkb2N1bWVudCByZXN1bHQgb2YgYSB0cmFuc2Zvcm1hdGlvbi4KLSAgICoKLSAgICogQHNlZSAgICAjc2V0UmVzdWx0Ci0gICAqIEBzZWUgICAgI2dldERvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkgewotICAgIHRoaXMucmVzdWx0ICA9IGRvY3VtZW50OwotICAgIHRoaXMucXVlcmllZCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhbiBYU0wgVHJhbnNmb3JtYXRpb24gYXMgYSBKRE9NIGRvY3VtZW50LgotICAgKiA8cD4KLSAgICogSWYgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYSBsaXN0IG9mIG5vZGVzLAotICAgKiB0aGlzIG1ldGhvZCBhdHRlbXB0cyB0byBjb252ZXJ0IGl0IGludG8gYSBKRE9NIGRvY3VtZW50LiBJZgotICAgKiBzdWNjZXNzZnVsLCBhbnkgc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsCi0gICAqIHJldHVybiBhbiBlbXB0eSBsaXN0LjwvcD4KLSAgICogPHA+Ci0gICAqIDxzdHJvbmc+V2FybmluZzwvc3Ryb25nPjogVGhlIFhTTFQgMS4wIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQKLSAgICogdGhlIG91dHB1dCBvZiBhbiBYU0wgdHJhbnNmb3JtYXRpb24gaXMgbm90IGEgd2VsbC1mb3JtZWQgWE1MCi0gICAqIGRvY3VtZW50IGJ1dCBhIGxpc3Qgb2Ygbm9kZXMuIEFwcGxpY2F0aW9ucyBzaG91bGQgdGh1cyB1c2UKLSAgICoge0BsaW5rICNnZXRSZXN1bHR9IGluc3RlYWQgb2YgdGhpcyBtZXRob2Qgb3IgYXQgbGVhc3QgZXhwZWN0Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IGRvY3VtZW50cyB0byBiZSByZXR1cm5lZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IGFzIGEgSkRPTSBkb2N1bWVudCBvcgotICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAqICAgICAgICAgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIHdlbGwtZm9ybWVkIGRvY3VtZW50LgotICAgKgotICAgKiBAc2VlICAgICNnZXRSZXN1bHQKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLSAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotCi0gICAgLy8gUmV0cmlldmUgcmVzdWx0IGZyb20gdGhlIGRvY3VtZW50IGJ1aWxkZXIgaWYgbm90IHNldC4KLSAgICB0aGlzLnJldHJpZXZlUmVzdWx0KCk7Ci0KLSAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgIGRvYyA9IChEb2N1bWVudClyZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKChyZXN1bHQgaW5zdGFuY2VvZiBMaXN0KSAmJiAocXVlcmllZCA9PSBmYWxzZSkpIHsKLSAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGRvY3VtZW50IGZyb20gdGhlIHJlc3VsdCBub2RlcwotICAgICAgICB0cnkgewotICAgICAgICAgIEpET01GYWN0b3J5IGYgPSB0aGlzLmdldEZhY3RvcnkoKTsKLSAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7IGYgPSBuZXcgRGVmYXVsdEpET01GYWN0b3J5KCk7IH0KLQotICAgICAgICAgIGRvYyA9IGYuZG9jdW1lbnQobnVsbCk7Ci0gICAgICAgICAgZG9jLnNldENvbnRlbnQoKExpc3QpcmVzdWx0KTsKLQotICAgICAgICAgIHJlc3VsdCA9IGRvYzsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgICAvLyBTb21lIG9mIHRoZSByZXN1bHQgbm9kZXMgYXJlIG5vdCB2YWxpZCBjaGlsZHJlbiBvZiBhCi0gICAgICAgICAgLy8gRG9jdW1lbnQgbm9kZS4gPT4gcmV0dXJuIG51bGwuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcXVlcmllZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gKGRvYyk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBhIGN1c3RvbSBKRE9NRmFjdG9yeSB0byB1c2Ugd2hlbiBidWlsZGluZyB0aGUKLSAgICogdHJhbnNmb3JtYXRpb24gcmVzdWx0LiBVc2UgYSBjdXN0b20gZmFjdG9yeSB0byBidWlsZCB0aGUgdHJlZQotICAgKiB3aXRoIHlvdXIgb3duIHN1YmNsYXNzZXMgb2YgdGhlIEpET00gY2xhc3Nlcy4KLSAgICoKLSAgICogQHBhcmFtICBmYWN0b3J5ICAgdGhlIGN1c3RvbSA8Y29kZT5KRE9NRmFjdG9yeTwvY29kZT4gdG8gdXNlIG9yCi0gICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdCBKRE9NCi0gICAqICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuCi0gICAqCi0gICAqIEBzZWUgICAgI2dldEZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhY3RvcnkoSkRPTUZhY3RvcnkgZmFjdG9yeSkgewotICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VzdG9tIEpET01GYWN0b3J5IHVzZWQgdG8gYnVpbGQgdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAqIHJlc3VsdC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY3VzdG9tIDxjb2RlPkpET01GYWN0b3J5PC9jb2RlPiB1c2VkIHRvIGJ1aWxkIHRoZQotICAgKiAgICAgICAgIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAgICogICAgICAgICBkZWZhdWx0IEpET00gY2xhc3NlcyBhcmUgYmVpbmcgdXNlZC4KLSAgICoKLSAgICogQHNlZSAgICAjc2V0RmFjdG9yeQotICAgKi8KLSAgcHVibGljIEpET01GYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIHRoaXMuZmFjdG9yeTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciBhIHRyYW5zZm9ybWF0aW9uIHJlc3VsdCBoYXMgYmVlbiBzZXQgYW5kLCBpZiBub3QsCi0gICAqIHJldHJpZXZlcyB0aGUgcmVzdWx0IHRyZWUgYmVpbmcgYnVpbHQgYnkgdGhlIGRvY3VtZW50IGJ1aWxkZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmV0cmlldmVSZXN1bHQoKSB7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICB0aGlzLnNldFJlc3VsdCgoKERvY3VtZW50QnVpbGRlcil0aGlzLmdldEhhbmRsZXIoKSkuZ2V0UmVzdWx0KCkpOwotICAgIH0KLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTQVhSZXN1bHQgb3ZlcndyaXR0ZW4gbWV0aG9kcwotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdGFyZ2V0IHRvIGJlIGEgU0FYMiBDb250ZW50SGFuZGxlci4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgTXVzdCBiZSBhIG5vbi1udWxsIENvbnRlbnRIYW5kbGVyIHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoQ29udGVudEhhbmRsZXIgaGFuZGxlcikgeyB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFNBWDIgTGV4aWNhbEhhbmRsZXIgZm9yIHRoZSBvdXRwdXQuCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgWE1MIGNvbW1lbnRzIGFuZCB0aGUgbGlrZS4gIElmIHRoZQotICAgKiBsZXhpY2FsIGhhbmRsZXIgaXMgbm90IHNldCwgYW4gYXR0ZW1wdCBzaG91bGQgYmUgbWFkZSBieSB0aGUKLSAgICogdHJhbnNmb3JtZXIgdG8gY2FzdCB0aGUgQ29udGVudEhhbmRsZXIgdG8gYSBMZXhpY2FsSGFuZGxlci48L3A+Ci0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIEEgbm9uLW51bGwgTGV4aWNhbEhhbmRsZXIgZm9yCi0gICAqICAgICAgICAgICAgICAgIGhhbmRsaW5nIGxleGljYWwgcGFyc2UgZXZlbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoTGV4aWNhbEhhbmRsZXIgaGFuZGxlcikgeyB9Ci0KLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gRnJhZ21lbnRIYW5kbGVyIG5lc3RlZCBjbGFzcwotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGcmFnbWVudEhhbmRsZXIgZXh0ZW5kcyBTQVhIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBBIGR1bW15IHJvb3QgZWxlbWVudCByZXF1aXJlZCBieSBTQVhIYW5kbGVyIHRoYXQgY2FuIG9ubHkKLSAgICAgKiBjb3BlIHdpdGggd2VsbC1mb3JtZWQgZG9jdW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudCBkdW1teVJvb3QgPSBuZXcgRWxlbWVudCgicm9vdCIsIG51bGwsIG51bGwpOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBGcmFnbWVudEhhbmRsZXIoSkRPTUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgc3VwZXIoZmFjdG9yeSk7Ci0KLSAgICAgIC8vIEFkZCBhIGR1bW15IHJvb3QgZWxlbWVudCB0byB0aGUgYmVpbmctYnVpbHQgZG9jdW1lbnQgYXMgWFNMCi0gICAgICAvLyB0cmFuc2Zvcm1hdGlvbiBjYW4gb3V0cHV0IG5vZGUgbGlzdHMgaW5zdGVhZCBvZiB3ZWxsLWZvcm1lZAotICAgICAgLy8gZG9jdW1lbnRzLgotICAgICAgdGhpcy5wdXNoRWxlbWVudChkdW1teVJvb3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhbiBYU0wgVHJhbnNmb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgYXMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YKLSAgICAgKiAgICAgICAgIEpET00gbm9kZXMgKEVsZW1lbnRzLCBUZXh0cywgQ29tbWVudHMsIFBJcy4uLikuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0UmVzdWx0KCkgewotICAgICAgLy8gRmx1c2ggcmVtYWluaW5nIHRleHQgY29udGVudCBpbiBjYXNlIHRoZSBsYXN0IHRleHQgc2VnbWVudCBpcwotICAgICAgLy8gb3V0c2lkZSBhbiBlbGVtZW50LgotICAgICAgdHJ5IHsKLSAgICAgICAgdGhpcy5mbHVzaENoYXJhY3RlcnMoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeyAvKiBJZ25vcmUuLi4gKi8gIH0KLSAgICAgIHJldHVybiB0aGlzLmdldERldGFjaGVkQ29udGVudChkdW1teVJvb3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSBKRE9NIEVsZW1lbnQgZGV0YWNoZWQgZnJvbSBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgZWx0ICAgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBjb250ZW50IGZyb20uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIEpET00gbm9kZXMsIGRldGFjaGVkIGZyb20KLSAgICAgKiAgICAgICAgIHRoZWlyIHBhcmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZ2V0RGV0YWNoZWRDb250ZW50KEVsZW1lbnQgZWx0KSB7Ci0gICAgICBMaXN0IGNvbnRlbnQgPSBlbHQuZ2V0Q29udGVudCgpOwotICAgICAgTGlzdCBub2RlcyAgID0gbmV3IEFycmF5TGlzdChjb250ZW50LnNpemUoKSk7Ci0KLSAgICAgIHdoaWxlIChjb250ZW50LnNpemUoKSAhPSAwKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGNvbnRlbnQucmVtb3ZlKDApOwotICAgICAgICBub2Rlcy5hZGQobyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKG5vZGVzKTsKLSAgICB9Ci0gIH0KLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gRG9jdW1lbnRCdWlsZGVyIGlubmVyIGNsYXNzCi0gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIHByaXZhdGUgY2xhc3MgRG9jdW1lbnRCdWlsZGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIExleGljYWxIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgYWN0dWFsIEpET00gZG9jdW1lbnQgYnVpbGRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZyYWdtZW50SGFuZGxlciBzYXhIYW5kbGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHN0YXJ0RG9jdW1lbnQgZXZlbnQgd2FzIHJlY2VpdmVkLiBTb21lIFhTTFQKLSAgICAgKiBwcm9jZXNzb3JzIHN1Y2ggYXMgT3JhY2xlJ3MgZG8gbm90IGZpcmUgdGhpcyBldmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnREb2N1bWVudFJlY2VpdmVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRCdWlsZGVyKCkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYW4gWFNMIFRyYW5zZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtYXRpb24gcmVzdWx0IGFzIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCi0gICAgICogICAgICAgICBKRE9NIG5vZGVzIChFbGVtZW50cywgVGV4dHMsIENvbW1lbnRzLCBQSXMuLi4pIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBuZXcgdHJhbnNmb3JtYXRpb24gb2NjdXJyZWQKLSAgICAgKiAgICAgICAgIHNpbmNlIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIG9uZSB3YXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0UmVzdWx0KCkgewotICAgICAgTGlzdCByZXN1bHQgPSBudWxsOwotCi0gICAgICBpZiAodGhpcy5zYXhIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgLy8gUmV0cmlldmUgcmVzdWx0IGZyb20gU0FYIGNvbnRlbnQgaGFuZGxlci4KLSAgICAgICAgcmVzdWx0ID0gdGhpcy5zYXhIYW5kbGVyLmdldFJlc3VsdCgpOwotCi0gICAgICAgIC8vIERldGFjaCB0aGUgKG5vbi1yZXVzYWJsZSkgU0FYSGFuZGxlciBpbnN0YW5jZS4KLSAgICAgICAgdGhpcy5zYXhIYW5kbGVyID0gbnVsbDsKLQotICAgICAgICAvLyBBbmQgZ2V0IHJlYWR5IGZvciB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbi4KLSAgICAgICAgdGhpcy5zdGFydERvY3VtZW50UmVjZWl2ZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluaXRpYWxpemF0aW9uKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAvLyBUcmlnZ2VyIGRvY3VtZW50IGluaXRpYWxpemF0aW9uIGlmIFhTTFQgcHJvY2Vzc29yIGZhaWxlZCB0bwotICAgICAgLy8gZmlyZSB0aGUgc3RhcnREb2N1bWVudCBldmVudC4KLSAgICAgIGlmICh0aGlzLnN0YXJ0RG9jdW1lbnRSZWNlaXZlZCA9PSBmYWxzZSkgewotICAgICAgICB0aGlzLnN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gWE1MRmlsdGVySW1wbCBvdmVyd3JpdHRlbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogPGk+W1NBWCBDb250ZW50SGFuZGxlciBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFByb2Nlc3NlcyBhCi0gICAgICogc3RhcnQgb2YgZG9jdW1lbnQgZXZlbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEgbmV3IEpET00gZG9jdW1lbnQgYnVpbGRlciBhbmQKLSAgICAgKiBtYXJrcyB0aGUgY3VycmVudCByZXN1bHQgYXMgInVuZGVyIGNvbnN0cnVjdGlvbiIuPC9wPgotICAgICAqCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICBpZiBhbnkgZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkb2N1bWVudCBidWlsZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuc3RhcnREb2N1bWVudFJlY2VpdmVkID0gdHJ1ZTsKLQotICAgICAgLy8gUmVzZXQgYW55IHByZXZpb3VzbHkgc2V0IHJlc3VsdC4KLSAgICAgIHNldFJlc3VsdChudWxsKTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgSkRPTSBkb2N1bWVudCBidWlsZGVyIGFuZCByZWdpc3RlciBpdCBhcwotICAgICAgLy8gQ29udGVudEhhbmRsZXIgb24gdGhlIHN1cGVyY2xhc3MgKFhNTEZpbHRlckltcGwpOiB0aGlzCi0gICAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aWxsIHRha2UgY2FyZSBvZiBwcm9wYWdhdGluZyB0aGUgTGV4aWNhbEhhbmRsZXIKLSAgICAgIC8vIGV2ZW50cy4KLSAgICAgIHRoaXMuc2F4SGFuZGxlciA9IG5ldyBGcmFnbWVudEhhbmRsZXIoZ2V0RmFjdG9yeSgpKTsKLSAgICAgIHN1cGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMuc2F4SGFuZGxlcik7Ci0KLSAgICAgIC8vIEFuZCBwcm9wYWdhdGUgZXZlbnQuCi0gICAgICBzdXBlci5zdGFydERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGk+W1NBWCBDb250ZW50SGFuZGxlciBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFJlY2VpdmVzCi0gICAgICogbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYW4gZWxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGVuc3VyZXMgdGhhdCBzdGFydERvY3VtZW50KCkgaGFzIGJlZW4KLSAgICAgKiBjYWxsZWQgcHJpb3IgcHJvY2Vzc2luZyBhbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtICBuc1VSSSAgICAgICB0aGUgTmFtZXNwYWNlIFVSSSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGVsZW1lbnQgaGFzIG5vIE5hbWVzcGFjZSBVUkkgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdCBiZWluZyBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtICBsb2NhbE5hbWUgICB0aGUgbG9jYWwgbmFtZSAod2l0aG91dCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBOYW1lc3BhY2UgcHJvY2Vzc2luZyBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgbm90IGJlaW5nIHBlcmZvcm1lZC4KLSAgICAgKiBAcGFyYW0gIHFOYW1lICAgICAgIHRoZSBxdWFsaWZpZWQgbmFtZSAod2l0aCBwcmVmaXgpLCBvciB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBxdWFsaWZpZWQgbmFtZXMgYXJlIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgotICAgICAqIEBwYXJhbSAgYXR0cyAgICAgICAgVGhlIGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQuICBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMsIGl0IHNoYWxsIGJlIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBlbXB0eSBBdHRyaWJ1dGVzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uICAgaWYgYW55IGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZG9jdW1lbnQgYnVpbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5zVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgdGhpcy5lbnN1cmVJbml0aWFsaXphdGlvbigpOwotICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5zVVJJLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8aT5bU0FYIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0XTwvaT4gQmVnaW5zIHRoZQotICAgICAqIHNjb3BlIG9mIGEgcHJlZml4LVVSSSBOYW1lc3BhY2UgbWFwcGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmVuc3VyZUluaXRpYWxpemF0aW9uKCk7Ci0gICAgICBzdXBlci5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCB1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxpPltTQVggQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlIHN1cHBvcnRdPC9pPiBSZWNlaXZlcwotICAgICAqIG5vdGlmaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgIHN1cGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxpPltTQVggQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlIHN1cHBvcnRdPC9pPiBSZWNlaXZlcwotICAgICAqIG5vdGlmaWNhdGlvbiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSBpbiBlbGVtZW50IGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmVuc3VyZUluaXRpYWxpemF0aW9uKCk7Ci0gICAgICBzdXBlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8aT5bU0FYIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0XTwvaT4gUmVjZWl2ZXMKLSAgICAgKiBub3RpZmljYXRpb24gb2YgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmVuc3VyZUluaXRpYWxpemF0aW9uKCk7Ci0gICAgICBzdXBlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8aT5bU0FYIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0XTwvaT4gUmVjZWl2ZXMKLSAgICAgKiBub3RpZmljYXRpb24gb2YgYSBza2lwcGVkIGVudGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgIHN1cGVyLnNraXBwZWRFbnRpdHkobmFtZSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIExleGljYWxIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogPGk+W1NBWCBMZXhpY2FsSGFuZGxlciBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFJlcG9ydHMgdGhlCi0gICAgICogc3RhcnQgb2YgRFREIGRlY2xhcmF0aW9ucywgaWYgYW55LgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgICAgIHRoZSBkb2N1bWVudCB0eXBlIG5hbWUuCi0gICAgICogQHBhcmFtICBwdWJsaWNJZCAgIHRoZSBkZWNsYXJlZCBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIERURCBzdWJzZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgIGlmIG5vbmUgd2FzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSAgc3lzdGVtSWQgICB0aGUgZGVjbGFyZWQgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBEVEQgc3Vic2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqICAgICAgICAgICAgICAgICAgICBpZiBub25lIHdhcyBkZWNsYXJlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgdGhpcy5lbnN1cmVJbml0aWFsaXphdGlvbigpOwotICAgICAgdGhpcy5zYXhIYW5kbGVyLnN0YXJ0RFREKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGk+W1NBWCBMZXhpY2FsSGFuZGxlciBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFJlcG9ydHMgdGhlIGVuZAotICAgICAqIG9mIERURCBkZWNsYXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgdGhpcy5zYXhIYW5kbGVyLmVuZERURCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxpPltTQVggTGV4aWNhbEhhbmRsZXIgaW50ZXJmYWNlIHN1cHBvcnRdPC9pPiBSZXBvcnRzIHRoZQotICAgICAqIGJlZ2lubmluZyBvZiBzb21lIGludGVybmFsIGFuZCBleHRlcm5hbCBYTUwgZW50aXRpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5hbWUgICB0aGUgbmFtZSBvZiB0aGUgZW50aXR5LiAgSWYgaXQgaXMgYSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICAgICAgICBlbnRpdHksIHRoZSBuYW1lIHdpbGwgYmVnaW4gd2l0aCAnJScsIGFuZCBpZiBpdAotICAgICAqICAgICAgICAgICAgICAgIGlzIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0LCBpdCB3aWxsIGJlICJbZHRkXSIuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgIHRoaXMuc2F4SGFuZGxlci5zdGFydEVudGl0eShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8aT5bU0FYIExleGljYWxIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0XTwvaT4gUmVwb3J0cyB0aGUgZW5kCi0gICAgICogb2YgYW4gZW50aXR5LgotICAgICAqCi0gICAgICogQHBhcmFtICBuYW1lICAgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGVuZGluZy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuc2F4SGFuZGxlci5lbmRFbnRpdHkobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPGk+W1NBWCBMZXhpY2FsSGFuZGxlciBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFJlcG9ydHMgdGhlCi0gICAgICogc3RhcnQgb2YgYSBDREFUQSBzZWN0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmVuc3VyZUluaXRpYWxpemF0aW9uKCk7Ci0gICAgICB0aGlzLnNheEhhbmRsZXIuc3RhcnRDREFUQSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxpPltTQVggTGV4aWNhbEhhbmRsZXIgaW50ZXJmYWNlIHN1cHBvcnRdPC9pPiBSZXBvcnRzIHRoZSBlbmQKLSAgICAgKiBvZiBhIENEQVRBIHNlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLnNheEhhbmRsZXIuZW5kQ0RBVEEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8aT5bU0FYIExleGljYWxIYW5kbGVyIGludGVyZmFjZSBzdXBwb3J0XTwvaT4gUmVwb3J0cyBhbiBYTUwKLSAgICAgKiBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgY2ggICAgIGFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0gICAgICogQHBhcmFtICBzdGFydCAgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgdGhpcy5lbnN1cmVJbml0aWFsaXphdGlvbigpOwotICAgICAgdGhpcy5zYXhIYW5kbGVyLmNvbW1lbnQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3RyYW5zZm9ybS9KRE9NU291cmNlLmphdmEgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3RyYW5zZm9ybS9KRE9NU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzY2MjQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vSkRPTVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qLS0gCi0KLSAkSWQ6IEpET01Tb3VyY2UuamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIAotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAKLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MgCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotIAotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlIAotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZSAKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zIAotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseSAKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLSAKLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLnRyYW5zZm9ybTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Lio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotaW1wb3J0IG9yZy5qZG9tLm91dHB1dC4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLS8qKgotICogQSBob2xkZXIgZm9yIGFuIFhNTCBUcmFuc2Zvcm1hdGlvbiBzb3VyY2U6IGEgRG9jdW1lbnQsIEVsZW1lbnQsIG9yIGxpc3Qgb2YKLSAqIG5vZGVzLgotICogPHA+Ci0gKiBUaGUgaXMgcHJvdmlkZXMgaW5wdXQgdG8gYQotICoge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgSkFYUCBUckFYIFRyYW5zZm9ybWVyfS4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhcHBseSBhbiBYU0wgVHJhbnNmb3JtYXRpb24KLSAqIHRvIGEgSkRPTSBkb2N1bWVudCBhbmQgZ2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgaW4gdGhlIGZvcm0KLSAqIG9mIGEgbGlzdCBvZiBKRE9NIG5vZGVzOgotICogPHByZT48Y29kZT4KLSAqICAgcHVibGljIHN0YXRpYyBMaXN0IHRyYW5zZm9ybShEb2N1bWVudCBkb2MsIFN0cmluZyBzdHlsZXNoZWV0KQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEpET01FeGNlcHRpb24gewotICogICAgIHRyeSB7Ci0gKiAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2Uoc3R5bGVzaGVldCkpOwotICogICAgICAgSkRPTVNvdXJjZSBpbiA9IG5ldyBKRE9NU291cmNlKGRvYyk7Ci0gKiAgICAgICBKRE9NUmVzdWx0IG91dCA9IG5ldyBKRE9NUmVzdWx0KCk7Ci0gKiAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oaW4sIG91dCk7Ci0gKiAgICAgICByZXR1cm4gb3V0LmdldFJlc3VsdCgpOwotICogICAgIH0KLSAqICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICogICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIlhTTFQgVHJhbnNmb3JtYXRpb24gZmFpbGVkIiwgZSk7Ci0gKiAgICAgfQotICogICB9Ci0gKiA8L2NvZGU+PC9wcmU+Ci0gKgotICogQHNlZSBvcmcuamRvbS50cmFuc2Zvcm0uSkRPTVJlc3VsdAotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgTGF1cmVudCBCaWhhbmljCi0gKiBAYXV0aG9yIEphc29uIEh1bnRlcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTVNvdXJjZSBleHRlbmRzIFNBWFNvdXJjZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAiQCgjKSAkUkNTZmlsZTogSkRPTVNvdXJjZS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAvKioKLSAgICogSWYge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5I2dldEZlYXR1cmV9Ci0gICAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiBwYXNzZWQgdGhpcyB2YWx1ZSBhcyBhbgotICAgKiBhcmd1bWVudCwgdGhlIFRyYW5zZm9ybWVyIG5hdGl2ZWx5IHN1cHBvcnRzIEpET00uCi0gICAqIDxwPgotICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgb3ZlcnJpZGUKLSAgICogdGhlIHtAbGluayBTQVhTb3VyY2UjRkVBVFVSRX0gdmFsdWUgZGVmaW5lZCBieSBpdHMgc3VwZXJjbGFzcwotICAgKiB0byBiZSBjb25zaWRlcmVkIGFzIGEgU0FYU291cmNlIGJ5IFRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9ucwotICAgKiBub3QgbmF0aXZlbHkgc3VwcG9ydGluZyBKRE9NLgotICAgKiA8L3A+Ci0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKRE9NX0ZFQVRVUkUgPQotICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vb3JnLmpkb20udHJhbnNmb3JtLkpET01Tb3VyY2UvZmVhdHVyZSI7Ci0KLSAgLyoqCi0gICAqIFRoZSBYTUxSZWFkZXIgb2JqZWN0IGFzc29jaWF0ZWQgdG8gdGhpcyBzb3VyY2Ugb3IKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gWE1MUmVhZGVyIGhhcyB5ZXQgYmVlbiByZXF1ZXN0ZWQuCi0gICAqCi0gICAqIEBzZWUgICAgI2dldFhNTFJlYWRlcgotICAgKi8KLSAgcHJpdmF0ZSBYTUxSZWFkZXIgeG1sUmVhZGVyID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIEpET00gVHJBWCBzb3VyY2Ugd3JhcHBpbmcgYSBKRE9NIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gIHNvdXJjZSAgIHRoZSBKRE9NIGRvY3VtZW50IHRvIHVzZSBhcyBzb3VyY2UgZm9yIHRoZQotICAgKiAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucwotICAgKgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgIGlmIDxjb2RlPnNvdXJjZTwvY29kZT4gaXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBKRE9NU291cmNlKERvY3VtZW50IHNvdXJjZSkgewotICAgIHNldERvY3VtZW50KHNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIEpET00gVHJBWCBzb3VyY2Ugd3JhcHBpbmcgYSBsaXN0IG9mIEpET00gbm9kZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgc291cmNlICAgdGhlIEpET00gbm9kZXMgdG8gdXNlIGFzIHNvdXJjZSBmb3IgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25zCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgaWYgPGNvZGU+c291cmNlPC9jb2RlPiBpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIEpET01Tb3VyY2UoTGlzdCBzb3VyY2UpIHsKLSAgICBzZXROb2Rlcyhzb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBKRE9NIFRyQVggc291cmNlIHdyYXBwaW5nIGEgSkRPTSBlbGVtZW50LgotICAgKgotICAgKiBAcGFyYW0gIHNvdXJjZSAgIHRoZSBKRE9NIGVsZW1lbnQgdG8gdXNlIGFzIHNvdXJjZSBmb3IgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25zCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgaWYgPGNvZGU+c291cmNlPC9jb2RlPiBpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIEpET01Tb3VyY2UoRWxlbWVudCBzb3VyY2UpIHsKLSAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIG5vZGVzLmFkZChzb3VyY2UpOwotCi0gICAgc2V0Tm9kZXMobm9kZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNvdXJjZSBkb2N1bWVudCB1c2VkIGJ5IHRoaXMgVHJBWCBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSAgc291cmNlICAgdGhlIEpET00gZG9jdW1lbnQgdG8gdXNlIGFzIHNvdXJjZSBmb3IgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25zCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgaWYgPGNvZGU+c291cmNlPC9jb2RlPiBpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKgotICAgKiBAc2VlICAgICNnZXREb2N1bWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgc291cmNlKSB7Ci0gICAgc3VwZXIuc2V0SW5wdXRTb3VyY2UobmV3IEpET01JbnB1dFNvdXJjZShzb3VyY2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgZG9jdW1lbnQgdXNlZCBieSB0aGlzIFRyQVggc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZG9jdW1lbnQgdXNlZCBieSB0aGlzIFRyQVggc291cmNlIG9yCi0gICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNvdXJjZSBpcyBhIG5vZGUgbGlzdC4KLSAgICoKLSAgICogQHNlZSAgICAjc2V0RG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLSAgICBPYmplY3QgICBzcmMgPSAoKEpET01JbnB1dFNvdXJjZSlnZXRJbnB1dFNvdXJjZSgpKS5nZXRTb3VyY2UoKTsKLSAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotCi0gICAgaWYgKHNyYyBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICBkb2MgPSAoRG9jdW1lbnQpc3JjOwotICAgIH0KLSAgICByZXR1cm4gZG9jOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNvdXJjZSBub2RlIGxpc3QgdXNlZCBieSB0aGlzIFRyQVggc291cmNlLgotICAgKgotICAgKiBAcGFyYW0gIHNvdXJjZSAgIHRoZSBKRE9NIG5vZGVzIHRvIHVzZSBhcyBzb3VyY2UgZm9yIHRoZQotICAgKiAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucwotICAgKgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgIGlmIDxjb2RlPnNvdXJjZTwvY29kZT4gaXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICoKLSAgICogQHNlZSAgICAjZ2V0Tm9kZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5vZGVzKExpc3Qgc291cmNlKSB7Ci0gICAgc3VwZXIuc2V0SW5wdXRTb3VyY2UobmV3IEpET01JbnB1dFNvdXJjZShzb3VyY2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugbm9kZSBsaXN0IHVzZWQgYnkgdGhpcyBUckFYIHNvdXJjZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgc291cmNlIG5vZGUgbGlzdCB1c2VkIGJ5IHRoaXMgVHJBWCBzb3VyY2Ugb3IKLSAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc291cmNlIGlzIGEgSkRPTSBkb2N1bWVudC4KLSAgICoKLSAgICogQHNlZSAgICAjc2V0RG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE5vZGVzKCkgewotICAgIE9iamVjdCAgIHNyYyAgID0gKChKRE9NSW5wdXRTb3VyY2UpZ2V0SW5wdXRTb3VyY2UoKSkuZ2V0U291cmNlKCk7Ci0gICAgTGlzdCAgICAgbm9kZXMgPSBudWxsOwotCi0gICAgaWYgKHNyYyBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgIG5vZGVzID0gKExpc3Qpc3JjOwotICAgIH0KLSAgICByZXR1cm4gbm9kZXM7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTQVhTb3VyY2Ugb3ZlcndyaXR0ZW4gbWV0aG9kcwotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogU2V0cyB0aGUgU0FYIElucHV0U291cmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBTb3VyY2UuCi0gICAqIDxwPgotICAgKiBBcyB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgSkRPTSBkb2N1bWVudCBhcyBkYXRhCi0gICAqIHNvdXJjZSwgdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhbgotICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgotICAgKiA8L3A+Ci0gICAqCi0gICAqIEBwYXJhbSAgaW5wdXRTb3VyY2UgICBhIHZhbGlkIElucHV0U291cmNlIHJlZmVyZW5jZS4KLSAgICoKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAgIGFsd2F5cyEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0U291cmNlKElucHV0U291cmNlIGlucHV0U291cmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBYTUxSZWFkZXIgdG8gYmUgdXNlZCBmb3IgdGhlIFNvdXJjZS4KLSAgICogPHA+Ci0gICAqIEFzIHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBKRE9NIGRvY3VtZW50IGFzIGRhdGEKLSAgICogc291cmNlLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4KLSAgICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB0aGUgcHJvdmlkZWQgcmVhZGVyCi0gICAqIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIFNBWCB7QGxpbmsgWE1MRmlsdGVyfQotICAgKiBpbnRlcmZhY2UuICBPdGhlcndpc2UsIHRoZSBKRE9NIGRvY3VtZW50IHJlYWRlciB3aWxsIGJlCi0gICAqIGF0dGFjaGVkIGFzIHBhcmVudCBvZiB0aGUgZmlsdGVyIGNoYWluLjwvcD4KLSAgICoKLSAgICogQHBhcmFtICByZWFkZXIgICBhIHZhbGlkIFhNTFJlYWRlciBvciBYTUxGaWx0ZXIgcmVmZXJlbmNlLgotICAgKgotICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uICAgaWYgPGNvZGU+cmVhZGVyPC9jb2RlPgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGEgU0FYCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgWE1MRmlsdGVyfS4KLSAgICogQHNlZSAgICAjZ2V0WE1MUmVhZGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRYTUxSZWFkZXIoWE1MUmVhZGVyIHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIFhNTEZpbHRlcikgewotICAgICAgLy8gQ29ubmVjdCB0aGUgZmlsdGVyIGNoYWluIHRvIGEgZG9jdW1lbnQgcmVhZGVyLgotICAgICAgWE1MRmlsdGVyIGZpbHRlciA9IChYTUxGaWx0ZXIpcmVhZGVyOwotICAgICAgd2hpbGUgKGZpbHRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFhNTEZpbHRlcikgewotICAgICAgICBmaWx0ZXIgPSAoWE1MRmlsdGVyKShmaWx0ZXIuZ2V0UGFyZW50KCkpOwotICAgICAgfQotICAgICAgZmlsdGVyLnNldFBhcmVudChuZXcgRG9jdW1lbnRSZWFkZXIoKSk7Ci0KLSAgICAgIC8vIFJlYWQgWE1MIGRhdGEgZnJvbSBmaWx0ZXIgY2hhaW4uCi0gICAgICB0aGlzLnhtbFJlYWRlciA9IHJlYWRlcjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgWE1MUmVhZGVyIHRvIGJlIHVzZWQgZm9yIHRoZSBTb3VyY2UuCi0gICAqIDxwPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBzcGVjaWZpYyBYTUxSZWFkZXIgcmVhZGluZwotICAgKiB0aGUgWE1MIGRhdGEgZnJvbSB0aGUgc291cmNlIEpET00gZG9jdW1lbnQuCi0gICAqIDwvcD4KLSAgICoKLSAgICogQHJldHVybiBhbiBYTUxSZWFkZXIgcmVhZGluZyB0aGUgWE1MIGRhdGEgZnJvbSB0aGUgc291cmNlCi0gICAqICAgICAgICAgSkRPTSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKCkgewotICAgIGlmICh0aGlzLnhtbFJlYWRlciA9PSBudWxsKSB7Ci0gICAgICB0aGlzLnhtbFJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcigpOwotICAgIH0KLSAgICByZXR1cm4gdGhpcy54bWxSZWFkZXI7Ci0gIH0KLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gSkRPTUlucHV0U291cmNlIG5lc3RlZCBjbGFzcwotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogQSBzdWJjbGFzcyBvZiB0aGUgU0FYIElucHV0U291cmNlIGludGVyZmFjZSB0aGF0IHdyYXBzIGEgSkRPTQotICAgKiBEb2N1bWVudC4KLSAgICogPHA+Ci0gICAqIFRoaXMgY2xhc3MgaXMgbmVzdGVkIGluIEpET01Tb3VyY2UgYXMgaXQgaXMgbm90IGludGVudGVkIHRvCi0gICAqIGJlIHVzZWQgaW5kZXBlbmRlbnRseSBvZiBpdHMgZnJpZW5kOiBEb2N1bWVudFJlYWRlci4KLSAgICogPC9wPgotICAgKgotICAgKiBAc2VlICAgIG9yZy5qZG9tLkRvY3VtZW50Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKRE9NSW5wdXRTb3VyY2UgZXh0ZW5kcyBJbnB1dFNvdXJjZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHNvdXJjZSBhcyBhIEpET00gZG9jdW1lbnQgb3IgYSBsaXN0IG9mIEpET00gbm9kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3Qgc291cmNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIElucHV0U291cmNlIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgSkRPTSBEb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgZG9jdW1lbnQgICB0aGUgc291cmNlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBKRE9NSW5wdXRTb3VyY2UoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgIHRoaXMuc291cmNlID0gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgSW5wdXRTb3VyY2Ugd3JhcHBpbmcgYSBsaXN0IG9mIEpET00gbm9kZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIG5vZGVzICAgdGhlIHNvdXJjZSBKRE9NIG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyBKRE9NSW5wdXRTb3VyY2UoTGlzdCBub2RlcykgewotICAgICAgdGhpcy5zb3VyY2UgPSBub2RlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgYXMgYSBKRE9NIGRvY3VtZW50IG9yIGEgbGlzdCBvZiBKRE9NIG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlKCkgewotICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBJbnB1dFNvdXJjZSBvdmVyd3JpdHRlbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgc3RyZWFtIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4KLSAgICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGFzIHRoZSBvbmx5IHNvdXJjZQotICAgICAqIHN0cmVhbSBzdXBwb3J0ZWQgaXMgdGhlIHNvdXJjZSBKRE9NIGRvY3VtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgY2hhcmFjdGVyU3RyZWFtICAgYSBjaGFyYWN0ZXIgc3RyZWFtIGNvbnRhaW5pbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFhNTCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gIGFsd2F5cyEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oUmVhZGVyIGNoYXJhY3RlclN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNoYXJhY3RlciBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBvbmx5IHByb3ZpZGVkIHRvIG1ha2UgdGhpcwotICAgICAqIElucHV0U291cmNlIGltcGxlbWVudGF0aW9uIGFjY2VwdGFibGUgYnkgYW55IFhNTAotICAgICAqIHBhcnNlci4gIEFzIGl0IGdlbmVyYXRlcyBhbiBpbi1tZW1vcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0gICAgICogb2YgdGhlIEpET00gZG9jdW1lbnQsIGl0IGlzIHF1aXRlIGluZWZmaWNpZW50IGZyb20gYm90aAotICAgICAqIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24gcG9pbnRzIG9mIHZpZXcuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBhIFJlYWRlciB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICAgKiAgICAgICAgIHNvdXJjZSBKRE9NIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBSZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKCkgewotICAgICAgT2JqZWN0IHNyYyAgICA9IHRoaXMuZ2V0U291cmNlKCk7Ci0gICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgIC8vIEdldCBhbiBpbi1tZW1vcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudAotICAgICAgICAvLyBhbmQgcmV0dXJuIGEgcmVhZGVyIG9uIGl0LgotICAgICAgICByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYTUxPdXRwdXR0ZXIoKS5vdXRwdXRTdHJpbmcoKERvY3VtZW50KXNyYykpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWE1MT3V0cHV0dGVyKCkub3V0cHV0U3RyaW5nKChMaXN0KXNyYykpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2U6IE5vIHNvdXJjZSwgbm8gcmVhZGVyIQotICAgICAgfQotICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICB9Ci0gIH0KLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gRG9jdW1lbnRSZWFkZXIgbmVzdGVkIGNsYXNzCi0gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0FYMiBYTUxSZWFkZXIgaW50ZXJmYWNlIHRoYXQgcHJlc2VudHMKLSAgICogYSBTQVggdmlldyBvZiBhIEpET00gRG9jdW1lbnQuICBUaGUgYWN0dWFsIGdlbmVyYXRpb24gb2YgdGhlCi0gICAqIFNBWCBldmVudHMgaXMgZGVsZWdhdGVkIHRvIEpET00ncyBTQVhPdXRwdXR0ZXIuCi0gICAqCi0gICAqIEBzZWUgICAgb3JnLmpkb20uRG9jdW1lbnQKLSAgICogQHNlZSAgICBvcmcuamRvbS5vdXRwdXQuU0FYT3V0cHV0dGVyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb2N1bWVudFJlYWRlciAgIGV4dGVuZHMgICAgU0FYT3V0cHV0dGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBYTUxSZWFkZXIgICAgewotICAgIC8qKgotICAgICAqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFJlYWRlcigpIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU0FYIFhNTFJlYWRlciBpbnRlcmZhY2Ugc3VwcG9ydAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgc3lzdGVtIGlkZW50aWZpZXIgKFVSSSkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgWE1MIGRhdGEgZnJvbQotICAgICAqIHN5c3RlbSBpZGVudGlmaWVycywgb25seSBmcm9tIEpET00gZG9jdW1lbnRzLiAgSGVuY2UsCi0gICAgICogdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIHtAbGluayBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgc3lzdGVtSWQgICB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKFVSSSkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiAgIGFsd2F5cyEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgdGhyb3cgbmV3IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgSkRPTSBEb2N1bWVudHMgYXJlIHN1cHBvcnRlZCBhcyBpbnB1dCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbiBYTUwgZG9jdW1lbnQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1ldGhvZHMgYWNjZXB0cyBvbmx5IDxjb2RlPkpET01JbnB1dFNvdXJjZTwvY29kZT5zCi0gICAgICogaW5zdGFuY2VzIGFzIGlucHV0IHNvdXJjZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtICBpbnB1dCAgIHRoZSBpbnB1dCBzb3VyY2UgZm9yIHRoZSB0b3AtbGV2ZWwgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICBYTUwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgICAgICAgICAgIGFueSBTQVggZXhjZXB0aW9uLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libHkgd3JhcHBpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgaWYgdGhlIGlucHV0IHNvdXJjZSBkb2VzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgd3JhcCBhIEpET00gZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTb3VyY2UgaW5wdXQpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSkRPTUlucHV0U291cmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgT2JqZWN0IHNvdXJjZSA9ICgoSkRPTUlucHV0U291cmNlKWlucHV0KS5nZXRTb3VyY2UoKTsKLSAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0KChEb2N1bWVudClzb3VyY2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0KChMaXN0KXNvdXJjZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChKRE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgSkRPTSBEb2N1bWVudHMgYXJlIHN1cHBvcnRlZCBhcyBpbnB1dCIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3RyYW5zZm9ybS9YU0xUcmFuc2Zvcm1FeGNlcHRpb24uamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vdHJhbnNmb3JtL1hTTFRyYW5zZm9ybUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ0YmNhLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vdHJhbnNmb3JtL1hTTFRyYW5zZm9ybUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyotLQotCi0gJElkOiBYU0xUcmFuc2Zvcm1FeGNlcHRpb24uamF2YSx2IDEuMSAyMDA5LzA1LzI3IDIxOjQ2OjIwIG1wYXJrZXIgRXhwICQKLQotIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEphc29uIEh1bnRlciAmIEJyZXR0IE1jTGF1Z2hsaW4uCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZGlzY2xhaW1lciB0aGF0IGZvbGxvd3MKLSAgICB0aGVzZSBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiSkRPTSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvcgotICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJKRE9NIiwgbm9yCi0gICAgbWF5ICJKRE9NIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAgICBmcm9tIHRoZSBKRE9NIFByb2plY3QgTWFuYWdlbWVudCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gSW4gYWRkaXRpb24sIHdlIHJlcXVlc3QgKGJ1dCBkbyBub3QgcmVxdWlyZSkgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUKLSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uIGFuZC9vciBpbiB0aGUKLSBzb2Z0d2FyZSBpdHNlbGYgYW4gYWNrbm93bGVkZ2VtZW50IGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICAgICBKRE9NIFByb2plY3QgKGh0dHA6Ly93d3cuamRvbS5vcmcvKS4iCi0gQWx0ZXJuYXRpdmVseSwgdGhlIGFja25vd2xlZGdtZW50IG1heSBiZSBncmFwaGljYWwgdXNpbmcgdGhlIGxvZ29zCi0gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuamRvbS5vcmcvaW1hZ2VzL2xvZ29zLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEpET00gQVVUSE9SUyBPUiBUSEUgUFJPSkVDVAotIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEpET00gUHJvamVjdCBhbmQgd2FzIG9yaWdpbmFsbHkKLSBjcmVhdGVkIGJ5IEphc29uIEh1bnRlciA8amh1bnRlcl9BVF9qZG9tX0RPVF9vcmc+IGFuZAotIEJyZXR0IE1jTGF1Z2hsaW4gPGJyZXR0X0FUX2pkb21fRE9UX29yZz4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbgotIG9uIHRoZSBKRE9NIFByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuamRvbS5vcmcvPi4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmpkb20udHJhbnNmb3JtOwotCi1pbXBvcnQgb3JnLmpkb20uSkRPTUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBhbiBYU0wgc3R5bGVzaGVldCBmYWlscyB0byBjb21waWxlIG9yIGFuIFhTTCB0cmFuc2Zvcm0gZmFpbHMKLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMSAkLCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMCAkCi0gKiBAYXV0aG9yICBKYXNvbiBIdW50ZXIKLSAqLwotcHVibGljIGNsYXNzIFhTTFRyYW5zZm9ybUV4Y2VwdGlvbiBleHRlbmRzIEpET01FeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgICAgICAgICAiQCgjKSAkUkNTZmlsZTogWFNMVHJhbnNmb3JtRXhjZXB0aW9uLmphdmEsdiAkICRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjAgJCAkTmFtZTogICQiOwotCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybUV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWFNMVHJhbnNmb3JtRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vWFNMVHJhbnNmb3JtZXIuamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20vdHJhbnNmb3JtL1hTTFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzgzNmIuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vWFNMVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKi0tCi0KLSAkSWQ6IFhTTFRyYW5zZm9ybWVyLmphdmEsdiAxLjEgMjAwOS8wNS8yNyAyMTo0NjoyMCBtcGFya2VyIEV4cCAkCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBKYXNvbiBIdW50ZXIgJiBCcmV0dCBNY0xhdWdobGluLgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzCi0gICAgdGhlc2UgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgIkpET00iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiSkRPTSIsIG5vcgotICAgIG1heSAiSkRPTSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gICAgZnJvbSB0aGUgSkRPTSBQcm9qZWN0IE1hbmFnZW1lbnQgPHJlcXVlc3RfQVRfamRvbV9ET1Rfb3JnPi4KLQotIEluIGFkZGl0aW9uLCB3ZSByZXF1ZXN0IChidXQgZG8gbm90IHJlcXVpcmUpIHRoYXQgeW91IGluY2x1ZGUgaW4gdGhlCi0gZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiBhbmQvb3IgaW4gdGhlCi0gc29mdHdhcmUgaXRzZWxmIGFuIGFja25vd2xlZGdlbWVudCBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICAgICAgSkRPTSBQcm9qZWN0IChodHRwOi8vd3d3Lmpkb20ub3JnLykuIgotIEFsdGVybmF0aXZlbHksIHRoZSBhY2tub3dsZWRnbWVudCBtYXkgYmUgZ3JhcGhpY2FsIHVzaW5nIHRoZSBsb2dvcwotIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lmpkb20ub3JnL2ltYWdlcy9sb2dvcy4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBKRE9NIEFVVEhPUlMgT1IgVEhFIFBST0pFQ1QKLSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSBTVUNIIERBTUFHRS4KLQotIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBKRE9NIFByb2plY3QgYW5kIHdhcyBvcmlnaW5hbGx5Ci0gY3JlYXRlZCBieSBKYXNvbiBIdW50ZXIgPGpodW50ZXJfQVRfamRvbV9ET1Rfb3JnPiBhbmQKLSBCcmV0dCBNY0xhdWdobGluIDxicmV0dF9BVF9qZG9tX0RPVF9vcmc+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KLSBvbiB0aGUgSkRPTSBQcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3Lmpkb20ub3JnLz4uCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5qZG9tLnRyYW5zZm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IG9yZy5qZG9tLio7Ci0KLS8qKgotICogQSBjb252ZW5pZW5jZSBjbGFzcyB0byBoYW5kbGUgc2ltcGxlIHRyYW5zZm9ybWF0aW9ucy4gVGhlIEpBWFAgVHJBWCBjbGFzc2VzCi0gKiBoYXZlIG1vcmUgYmVsbHMgYW5kIHdoaXN0bGVzIGFuZCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBKRE9NU291cmNlfSBhbmQKLSAqIHtAbGluayBKRE9NUmVzdWx0fSBmb3IgYWR2YW5jZWQgdXNlcy4gVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBjb21tb24gY2FzZSBhbmQKLSAqIHByZXNlbnRzIGEgc2ltcGxlIGludGVyZmFjZS4gIFhTTFRyYW5zZm9ybWVyIGlzIHRocmVhZCBzYWZlIGFuZCBtYXkgYmUKLSAqIHVzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgotICoKLSAqIDxwcmU+PGNvZGU+Ci0gKiBYU0xUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBYU0xUcmFuc2Zvcm1lcigiZmlsZS54c2wiKTsKLSAqCi0gKiBEb2N1bWVudCB4MiA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4KTsgIC8vIHggaXMgYSBEb2N1bWVudAotICogRG9jdW1lbnQgeTIgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeSk7ICAvLyB5IGlzIGEgRG9jdW1lbnQKLSAqIDwvY29kZT48L3ByZT4KLSAqCi0gKiAgSkRPTSByZWxpZXMgb24gVHJBWCB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbi4KLSAqICBUaGUgPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk8L2NvZGU+IEphdmEgc3lzdGVtIHByb3BlcnR5Ci0gKiAgZGV0ZXJtaW5lcyB3aGljaCBYU0xUIGVuZ2luZSBUckFYIHVzZXMuIEl0cyB2YWx1ZSBzaG91bGQgYmUKLSAqICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdAotICogIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PC9jb2RlPiBjbGFzcy4KLSAqICBWYWx1ZXMgb2YgdGhpcyBwcm9wZXJ0eSBmb3IgcG9wdWxhciBYU0xUIHByb2Nlc3NvcnMgaW5jbHVkZToKLSAqICA8L3A+Ci0gKiAgPHVsPjxsaT5TYXhvbiA2Lng6IDxjb2RlPmNvbS5pY2wuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvY29kZT48L2xpPgotICogIDxsaT5TYXhvbiA3Lng6IDxjb2RlPm5ldC5zZi5zYXhvbi5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsPC9jb2RlPjwvbGk+Ci0gKiAgPGxpPlhhbGFuOiA8Y29kZT5vcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsPC9jb2RlPjwvbGk+Ci0gKiAgPGxpPmpkLnhzbHQ6IDxjb2RlPmpkLnhtbC54c2x0LnRyYXguVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvY29kZT48L2xpPgotICogIDxsaT5PcmFjbGU6IDxjb2RlPm9yYWNsZS54bWwuamF4cC5KWFNBWFRyYW5zZm9ybWVyRmFjdG9yeTwvY29kZT48L2xpPgotICogIDwvdWw+Ci0gKiAgPHA+Ci0gKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCBpbiBhbGwgdGhlIHVzdWFsIHdheXMgYSBKYXZhIHN5c3RlbSBwcm9wZXJ0eQotICogICBjYW4gYmUgc2V0LiBUckFYIHBpY2tzIGZyb20gdGhlbSBpbiB0aGlzIG9yZGVyOjwvcD4KLSAqICAgPG9sPgotICogICA8bGk+IEludm9raW5nIDxjb2RlPlN5c3RlbS5zZXRQcm9wZXJ0eSggImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiwKLSAqICAgICAiPGk+PGNvZGU+Y2xhc3NuYW1lPC9jb2RlPjwvaT4iKTwvY29kZT48L2xpPgotICogICA8bGk+VGhlIHZhbHVlIHNwZWNpZmllZCBhdCB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIHRoZQotICogICAgICA8dHQ+LURqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeT08aT48Y29kZT5jbGFzc25hbWU8L2NvZGU+PC9pPjwvdHQ+Ci0gKiAgICAgIG9wdGlvbiB0byB0aGUgPGI+amF2YTwvYj4gaW50ZXJwcmV0ZXI8L2xpPgotICogICAgPGxpPlRoZSBjbGFzcyBuYW1lZCBpbiB0aGUgIDxjb2RlPmxpYi9qYXhwLnByb3BlcnRpZXM8L2NvZGU+IHByb3BlcnRpZXMgZmlsZQotICogICAgICAgICBpbiB0aGUgSlJFIGRpcmVjdG9yeSwgaW4gYSBsaW5lIGxpa2UgdGhpcyBvbmU6Ci0gKiAgICAgIDxwcmU+amF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeT08aT48Y29kZT5jbGFzc25hbWU8L2NvZGU+PC9pPjwvcHJlPjwvbGk+Ci0gKiAgICA8bGk+VGhlIGNsYXNzIG5hbWVkIGluIHRoZQotICogICA8Y29kZT5NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTwvY29kZT4gZmlsZQotICogICBpbiB0aGUgSkFSIGFyY2hpdmVzIGF2YWlsYWJsZSB0byB0aGUgcnVudGltZTwvbGk+Ci0gKiAgIDxsaT5GaW5hbGx5LCBpZiBhbGwgb2YgdGhlIGFib3ZlIG9wdGlvbnMgZmFpbCwKLSAqICAgIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBjaG9zZW4uIEluIFN1bidzIEpESyAxLjQsIHRoaXMgaXMKLSAqICAgICAgIFhhbGFuIDIuMmQxMC4gPC9saT4KLSAqICAgIDwvb2w+Ci0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQKLSAqIEBhdXRob3IgIEphc29uIEh1bnRlcgotICogQGF1dGhvciAgRWxsaW90dGUgUnVzdHkgSGFyb2xkCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUcmFuc2Zvcm1lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAgICAgICAgICJAKCMpICRSQ1NmaWxlOiBYU0xUcmFuc2Zvcm1lci5qYXZhLHYgJCAkUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIwICQgJE5hbWU6ICAkIjsKLQotICAgIHByaXZhdGUgVGVtcGxhdGVzIHRlbXBsYXRlczsKLQotICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIHRvIHN1cHBvcnQgdGhlIG90aGVyIGNvbnN0cnVjdG9ycwotICAgIHByaXZhdGUgWFNMVHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIHRocm93cyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVtcGxhdGVzID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLm5ld1RlbXBsYXRlcyhzdHlsZXNoZWV0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhTTFRyYW5zZm9ybUV4Y2VwdGlvbigiQ291bGQgbm90IGNvbnN0cnVjdCBYU0xUcmFuc2Zvcm1lciIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIHN0eWxlc2hlZXQgc3lzdGVtIGlkLgotICAgICAqCi0gICAgICogQHBhcmFtICBzdHlsZXNoZWV0U3lzdGVtSWQgIHNvdXJjZSBzdHlsZXNoZWV0IGFzIGEgU291cmNlIG9iamVjdAotICAgICAqIEB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uICAgICAgIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGluIHRoZSBUckFYIGJhY2stZW5kCi0gICAgICovCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybWVyKFN0cmluZyBzdHlsZXNoZWV0U3lzdGVtSWQpIHRocm93cyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24gewotICAgICAgICB0aGlzKG5ldyBTdHJlYW1Tb3VyY2Uoc3R5bGVzaGVldFN5c3RlbUlkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5YU0xUcmFuc2Zvcm1lcjwvY29kZT4gYnkKLSAgICAgKiAgcmVhZGluZyB0aGUgc3R5bGVzaGVldCBmcm9tIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGVzaGVldCA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gZnJvbSB3aGljaCB0aGUgc3R5bGVzaGVldCBpcyByZWFkLgotICAgICAqIEB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uIHdoZW4gYW4gSU9FeGNlcHRpb24sIGZvcm1hdCBlcnJvciwgb3IKLSAgICAgKiBzb21ldGhpbmcgZWxzZSBwcmV2ZW50cyB0aGUgc3R5bGVzaGVldCBmcm9tIGJlaW5nIGNvbXBpbGVkCi0gICAgICovCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybWVyKElucHV0U3RyZWFtIHN0eWxlc2hlZXQpIHRocm93cyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24gewotICAgICAgICB0aGlzKG5ldyBTdHJlYW1Tb3VyY2Uoc3R5bGVzaGVldCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgPGNvZGU+WFNMVHJhbnNmb3JtZXI8L2NvZGU+IGJ5Ci0gICAgICogIHJlYWRpbmcgdGhlIHN0eWxlc2hlZXQgZnJvbSB0aGUgc3BlY2lmaWVkCi0gICAgICogICA8Y29kZT5SZWFkZXI8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IDxjb2RlPlJlYWRlcjwvY29kZT4gZnJvbSB3aGljaCB0aGUgc3R5bGVzaGVldCBpcyByZWFkLgotICAgICAqIEB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uIHdoZW4gYW4gSU9FeGNlcHRpb24sIGZvcm1hdCBlcnJvciwgb3IKLSAgICAgKiBzb21ldGhpbmcgZWxzZSBwcmV2ZW50cyB0aGUgc3R5bGVzaGVldCBmcm9tIGJlaW5nIGNvbXBpbGVkCi0gICAgICovCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybWVyKFJlYWRlciBzdHlsZXNoZWV0KSB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhuZXcgU3RyZWFtU291cmNlKHN0eWxlc2hlZXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IDxjb2RlPlhTTFRyYW5zZm9ybWVyPC9jb2RlPiBieQotICAgICAqICByZWFkaW5nIHRoZSBzdHlsZXNoZWV0IGZyb20gdGhlIHNwZWNpZmllZAotICAgICAqICAgPGNvZGU+RmlsZTwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0eWxlc2hlZXQgPGNvZGU+RmlsZTwvY29kZT4gZnJvbSB3aGljaCB0aGUgc3R5bGVzaGVldCBpcyByZWFkLgotICAgICAqIEB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uIHdoZW4gYW4gSU9FeGNlcHRpb24sIGZvcm1hdCBlcnJvciwgb3IKLSAgICAgKiBzb21ldGhpbmcgZWxzZSBwcmV2ZW50cyB0aGUgc3R5bGVzaGVldCBmcm9tIGJlaW5nIGNvbXBpbGVkCi0gICAgICovCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybWVyKEZpbGUgc3R5bGVzaGVldCkgdGhyb3dzIFhTTFRyYW5zZm9ybUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IFN0cmVhbVNvdXJjZShzdHlsZXNoZWV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyA8Y29kZT5YU0xUcmFuc2Zvcm1lcjwvY29kZT4gYnkKLSAgICAgKiAgcmVhZGluZyB0aGUgc3R5bGVzaGVldCBmcm9tIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgIDxjb2RlPkRvY3VtZW50PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGVzaGVldCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gY29udGFpbmluZyB0aGUgc3R5bGVzaGVldC4KLSAgICAgKiBAdGhyb3dzIFhTTFRyYW5zZm9ybUV4Y2VwdGlvbiB3aGVuIHRoZSBzdXBwbGllZCA8Y29kZT5Eb2N1bWVudDwvY29kZT4KLSAgICAgKiAgaXMgbm90IHN5bnRhY3RpY2FsbHkgY29ycmVjdCBYU0xUCi0gICAgICovCi0gICAgcHVibGljIFhTTFRyYW5zZm9ybWVyKERvY3VtZW50IHN0eWxlc2hlZXQpIHRocm93cyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24gewotICAgICAgICB0aGlzKG5ldyBKRE9NU291cmNlKHN0eWxlc2hlZXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBpbnB1dCBub2RlcyB0byBhIGxpc3Qgb2Ygb3V0cHV0IG5vZGVzLgotICAgICAqCi0gICAgICogQHBhcmFtICBpbnB1dE5vZGVzICAgICAgICAgIGlucHV0IG5vZGVzCi0gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIG91dHB1dCBub2RlcwotICAgICAqIEB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uICAgICAgIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGluIHRoZSB0cmFuc2Zvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHRyYW5zZm9ybShMaXN0IGlucHV0Tm9kZXMpIHRocm93cyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24gewotICAgICAgICBKRE9NU291cmNlIHNvdXJjZSA9IG5ldyBKRE9NU291cmNlKGlucHV0Tm9kZXMpOwotICAgICAgICBKRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBKRE9NUmVzdWx0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZXMubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRSZXN1bHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhTTFRyYW5zZm9ybUV4Y2VwdGlvbigiQ291bGQgbm90IHBlcmZvcm0gdHJhbnNmb3JtYXRpb24iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIGRvY3VtZW50IHRvIGFuIG91dHB1dCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgaW5wdXREb2MgICAgICAgICAgICBpbnB1dCBkb2N1bWVudAotICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBvdXRwdXQgZG9jdW1lbnQKLSAgICAgKiBAdGhyb3dzIFhTTFRyYW5zZm9ybUV4Y2VwdGlvbiAgICAgICBpZiB0aGVyZSdzIGEgcHJvYmxlbSBpbiB0aGUgdHJhbnNmb3JtYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgdHJhbnNmb3JtKERvY3VtZW50IGlucHV0RG9jKSB0aHJvd3MgWFNMVHJhbnNmb3JtRXhjZXB0aW9uIHsKLSAgICAgICAgSkRPTVNvdXJjZSBzb3VyY2UgPSBuZXcgSkRPTVNvdXJjZShpbnB1dERvYyk7Ci0gICAgICAgIEpET01SZXN1bHQgcmVzdWx0ID0gbmV3IEpET01SZXN1bHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYU0xUcmFuc2Zvcm1FeGNlcHRpb24oIkNvdWxkIG5vdCBwZXJmb3JtIHRyYW5zZm9ybWF0aW9uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3RyYW5zZm9ybS9wYWNrYWdlLmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3RyYW5zZm9ybS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGI1MGUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9vcmcvamRvbS90cmFuc2Zvcm0vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08Ym9keT4KLQotQ2xhc3NlcyB0byBoZWxwIHdpdGggdHJhbnNmb3JtYXRpb25zLCBiYXNlZCBvbiB0aGUgSkFYUCBUckFYIGNsYXNzZXMuCi1KRE9NVHJhbnNmb3JtZXIgc3VwcG9ydHMgc2ltcGxlIHRyYW5zZm9ybWF0aW9ucyB3aXRoIG9uZSBsaW5lIG9mIGNvZGUuCi1BZHZhbmNlZCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlIEpET01Tb3VyY2UgYW5kIEpET01SZXN1bHQgY2xhc3NlcwotdGhhdCBpbnRlcmZhY2Ugd2l0aCBUckFYLgotCi08L2JvZHk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3hwYXRoL0pheGVuWFBhdGguamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvSmF4ZW5YUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg1MTU5Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvSmF4ZW5YUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qLS0KLQotICRJZDogSmF4ZW5YUGF0aC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjEgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS54cGF0aDsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuamF4ZW4uKjsKLWltcG9ydCBvcmcuamF4ZW4uamRvbS4qOwotaW1wb3J0IG9yZy5qZG9tLio7Ci0KLQotLyoqCi0gKiBBIG5vbi1wdWJsaWMgY29uY3JldGUgWFBhdGggaW1wbGVtZW50YXRpb24gZm9yIEpheGVuLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xICQsICREYXRlOiAyMDA5LzA1LzI3IDIxOjQ2OjIxICQKLSAqIEBhdXRob3IgIExhdXJlbnQgQmloYW5pYwotICovCi1jbGFzcyBKYXhlblhQYXRoIGV4dGVuZHMgICAgWFBhdGggeyAgICAgICAgICAgICAvLyBwYWNrYWdlIHByb3RlY3RlZAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19JRCA9Ci0gICAgIkAoIykgJFJDU2ZpbGU6IEpheGVuWFBhdGguamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMSAkICROYW1lOiAgJCI7Ci0KLSAgIC8qKgotICAgICogVGhlIGNvbXBpbGVkIFhQYXRoIG9iamVjdCB0byBzZWxlY3Qgbm9kZXMuICBUaGlzIGF0dHJpYnV0ZSBjYW4KLSAgICAqIG5vdCBiZSBtYWRlIGZpbmFsIGFzIGl0IG5lZWRzIHRvIGJlIHNldCB1cG9uIG9iamVjdAotICAgICogZGVzZXJpYWxpemF0aW9uLgotICAgICovCi0gICBwcml2YXRlIHRyYW5zaWVudCBKRE9NWFBhdGggeFBhdGg7Ci0KLSAgIC8qKgotICAgICogVGhlIGN1cnJlbnQgY29udGV4dCBmb3IgWFBhdGggZXhwcmVzc2lvbiBldmFsdWF0aW9uLgotICAgICovCi0gICBwcml2YXRlICAgICAgICAgICBPYmplY3QgICAgY3VycmVudENvbnRleHQ7Ci0KLSAgIC8qKgotICAgICogQ3JlYXRlcyBhIG5ldyBYUGF0aCB3cmFwcGVyIG9iamVjdCwgY29tcGlsaW5nIHRoZSBzcGVjaWZpZWQKLSAgICAqIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgKgotICAgICogQHBhcmFtICBleHByICAgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gd3JhcC4KLSAgICAqCi0gICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gICBpZiB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgotICAgICovCi0gICBwdWJsaWMgSmF4ZW5YUGF0aChTdHJpbmcgZXhwcikgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgc2V0WFBhdGgoZXhwcik7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogRXZhbHVhdGVzIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIGxpc3QKLSAgICAqIG9mIHNlbGVjdGVkIGl0ZW1zLgotICAgICoKLSAgICAqIEBwYXJhbSAgY29udGV4dCAgIHRoZSBub2RlIHRvIHVzZSBhcyBjb250ZXh0IGZvciBldmFsdWF0aW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHNlbGVjdGVkIGl0ZW1zLCB3aGljaCBtYXkgYmUgb2YgdHlwZXM6IHtAbGluayBFbGVtZW50fSwKLSAgICAqICAgICAgICAge0BsaW5rIEF0dHJpYnV0ZX0sIHtAbGluayBUZXh0fSwge0BsaW5rIENEQVRBfSwKLSAgICAqICAgICAgICAge0BsaW5rIENvbW1lbnR9LCB7QGxpbmsgUHJvY2Vzc2luZ0luc3RydWN0aW9ufSwgQm9vbGVhbiwKLSAgICAqICAgICAgICAgRG91YmxlLCBvciBTdHJpbmcuCi0gICAgKgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgaWYgdGhlIGV2YWx1YXRpb24gb2YgdGhlIFhQYXRoCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uIG9uIHRoZSBzcGVjaWZpZWQgY29udGV4dAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICAgICovCi0gICBwdWJsaWMgTGlzdCBzZWxlY3ROb2RlcyhPYmplY3QgY29udGV4dCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAgcmV0dXJuIHhQYXRoLnNlbGVjdE5vZGVzKGNvbnRleHQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGV4MSkgewotICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIlhQYXRoIGVycm9yIHdoaWxlIGV2YWx1YXRpbmcgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhQYXRoLnRvU3RyaW5nKCkgKyAiXCI6ICIgKyBleDEuZ2V0TWVzc2FnZSgpLCBleDEpOwotICAgICAgfQotICAgICAgZmluYWxseSB7Ci0gICAgICAgICBjdXJyZW50Q29udGV4dCA9IG51bGw7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogRXZhbHVhdGVzIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIGZpcnN0Ci0gICAgKiBlbnRyeSBpbiB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyAob3IgYXRvbWljcykuCi0gICAgKgotICAgICogQHBhcmFtICBjb250ZXh0ICAgdGhlIG5vZGUgdG8gdXNlIGFzIGNvbnRleHQgZm9yIGV2YWx1YXRpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBYUGF0aCBleHByZXNzaW9uLgotICAgICoKLSAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIGl0ZW0sIHdoaWNoIG1heSBiZSBvZiB0eXBlczoge0BsaW5rIEVsZW1lbnR9LAotICAgICogICAgICAgICB7QGxpbmsgQXR0cmlidXRlfSwge0BsaW5rIFRleHR9LCB7QGxpbmsgQ0RBVEF9LAotICAgICogICAgICAgICB7QGxpbmsgQ29tbWVudH0sIHtAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259LCBCb29sZWFuLAotICAgICogICAgICAgICBEb3VibGUsIFN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaXRlbSB3YXMgc2VsZWN0ZWQuCi0gICAgKgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgaWYgdGhlIGV2YWx1YXRpb24gb2YgdGhlIFhQYXRoCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uIG9uIHRoZSBzcGVjaWZpZWQgY29udGV4dAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICAgICovCi0gICBwdWJsaWMgT2JqZWN0IHNlbGVjdFNpbmdsZU5vZGUoT2JqZWN0IGNvbnRleHQpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgIHJldHVybiB4UGF0aC5zZWxlY3RTaW5nbGVOb2RlKGNvbnRleHQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGV4MSkgewotICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oIlhQYXRoIGVycm9yIHdoaWxlIGV2YWx1YXRpbmcgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhQYXRoLnRvU3RyaW5nKCkgKyAiXCI6ICIgKyBleDEuZ2V0TWVzc2FnZSgpLCBleDEpOwotICAgICAgfQotICAgICAgZmluYWxseSB7Ci0gICAgICAgICBjdXJyZW50Q29udGV4dCA9IG51bGw7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaXJzdCBub2RlIHNlbGVjdGVkIGJ5IGFwcGx5aW5nCi0gICAgKiB0aGUgd3JhcHBlZCBYUGF0aCBleHByZXNzaW9uIHRvIHRoZSBnaXZlbiBjb250ZXh0LgotICAgICoKLSAgICAqIEBwYXJhbSAgY29udGV4dCAgIHRoZSBlbGVtZW50IHRvIHVzZSBhcyBjb250ZXh0IGZvciBldmFsdWF0aW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpcnN0IG5vZGUgc2VsZWN0ZWQgYnkgYXBwbHlpbmcKLSAgICAqICAgICAgICAgdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gY29udGV4dC4KLSAgICAqCi0gICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gICBpZiB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBpbnZhbGlkIG9yCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgZXZhbHVhdGlvbiBvbiB0aGUgc3BlY2lmaWVkIGNvbnRleHQKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC4KLSAgICAqLwotICAgcHVibGljIFN0cmluZyB2YWx1ZU9mKE9iamVjdCBjb250ZXh0KSB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICAgY3VycmVudENvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgICByZXR1cm4geFBhdGguc3RyaW5nVmFsdWVPZihjb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgIHRocm93IG5ldyBKRE9NRXhjZXB0aW9uKCJYUGF0aCBlcnJvciB3aGlsZSBldmFsdWF0aW5nIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB4UGF0aC50b1N0cmluZygpICsgIlwiOiAiICsgZXgxLmdldE1lc3NhZ2UoKSwgZXgxKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkgewotICAgICAgICAgY3VycmVudENvbnRleHQgPSBudWxsOwotICAgICAgfQotICAgfQotCi0gICAvKioKLSAgICAqIFJldHVybnMgdGhlIG51bWJlciB2YWx1ZSBvZiB0aGUgZmlyc3QgaXRlbSBzZWxlY3RlZCBieSBhcHBseWluZwotICAgICogdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gY29udGV4dC4KLSAgICAqCi0gICAgKiBAcGFyYW0gIGNvbnRleHQgICB0aGUgZWxlbWVudCB0byB1c2UgYXMgY29udGV4dCBmb3IgZXZhbHVhdGluZwotICAgICogICAgICAgICAgICAgICAgICAgdGhlIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgKgotICAgICogQHJldHVybiB0aGUgbnVtYmVyIHZhbHVlIG9mIHRoZSBmaXJzdCBpdGVtIHNlbGVjdGVkIGJ5IGFwcGx5aW5nCi0gICAgKiAgICAgICAgIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIGNvbnRleHQsCi0gICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG5vZGUgd2FzIHNlbGVjdGVkIG9yIHRoZQotICAgICogICAgICAgICBzcGVjaWFsIHZhbHVlIHtAbGluayBqYXZhLmxhbmcuRG91YmxlI05hTn0KLSAgICAqICAgICAgICAgKE5vdC1hLU51bWJlcikgaWYgdGhlIHNlbGVjdGVkIHZhbHVlIGNhbiBub3QgYmUKLSAgICAqICAgICAgICAgY29udmVydGVkIGludG8gYSBudW1iZXIgdmFsdWUuCi0gICAgKgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgaWYgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgaW52YWxpZCBvcgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaXRzIGV2YWx1YXRpb24gb24gdGhlIHNwZWNpZmllZCBjb250ZXh0Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQuCi0gICAgKi8KLSAgIHB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWVPZihPYmplY3QgY29udGV4dCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAgcmV0dXJuIHhQYXRoLm51bWJlclZhbHVlT2YoY29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigiWFBhdGggZXJyb3Igd2hpbGUgZXZhbHVhdGluZyBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgeFBhdGgudG9TdHJpbmcoKSArICJcIjogIiArIGV4MS5nZXRNZXNzYWdlKCksIGV4MSk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IHsKLSAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbnVsbDsKLSAgICAgIH0KLSAgIH0KLQotICAgLyoqCi0gICAgKiBEZWZpbmVzIGFuIFhQYXRoIHZhcmlhYmxlIGFuZCBzZXRzIGl0cyB2YWx1ZS4KLSAgICAqCi0gICAgKiBAcGFyYW0gIG5hbWUgICAgdGhlIHZhcmlhYmxlIG5hbWUuCi0gICAgKiBAcGFyYW0gIHZhbHVlICAgdGhlIHZhcmlhYmxlIHZhbHVlLgotICAgICoKLSAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgbm90Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmFsaWQgWFBhdGggdmFyaWFibGUgbmFtZQotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgdmFsdWUgdHlwZSBpcyBub3QKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICBPYmplY3QgbyA9IHhQYXRoLmdldFZhcmlhYmxlQ29udGV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTaW1wbGVWYXJpYWJsZUNvbnRleHQpIHsKLSAgICAgICAgICAgKChTaW1wbGVWYXJpYWJsZUNvbnRleHQpbykuc2V0VmFyaWFibGVWYWx1ZShudWxsLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogQWRkcyBhIG5hbWVzcGFjZSBkZWZpbml0aW9uIHRvIHRoZSBsaXN0IG9mIG5hbWVzcGFjZXMga25vd24gb2YKLSAgICAqIHRoaXMgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqIDxwPgotICAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJbiBYUGF0aCwgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhCi0gICAgKiAnZGVmYXVsdCBuYW1lc3BhY2UnLiAgVGhlIGVtcHR5IHByZWZpeCA8Yj5hbHdheXM8L2I+IHJlc29sdmVzCi0gICAgKiB0byB0aGUgZW1wdHkgbmFtZXNwYWNlIFVSSS48L3A+Ci0gICAgKgotICAgICogQHBhcmFtICBuYW1lc3BhY2UgICB0aGUgbmFtZXNwYWNlLgotICAgICovCi0gICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoTmFtZXNwYWNlIG5hbWVzcGFjZSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgIHhQYXRoLmFkZE5hbWVzcGFjZShuYW1lc3BhY2UuZ2V0UHJlZml4KCksIG5hbWVzcGFjZS5nZXRVUkkoKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZXgxKSB7IC8qIENhbid0IGhhcHBlbiBoZXJlLiAqLyB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyB0aGUgd3JhcHBlZCBYUGF0aCBleHByZXNzaW9uIGFzIGEgc3RyaW5nLgotICAgICoKLSAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiBhcyBhIHN0cmluZy4KLSAgICAqLwotICAgcHVibGljIFN0cmluZyBnZXRYUGF0aCgpIHsKLSAgICAgIHJldHVybiAoeFBhdGgudG9TdHJpbmcoKSk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogQ29tcGlsZXMgYW5kIHNldHMgdGhlIFhQYXRoIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KLSAgICAqCi0gICAgKiBAcGFyYW0gIGV4cHIgICB0aGUgWFBhdGggZXhwcmVzc2lvbiB0byB3cmFwLgotICAgICoKLSAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiAgIGlmIHRoZSBYUGF0aCBleHByZXNzaW9uIGlzIGludmFsaWQuCi0gICAgKi8KLSAgIHByaXZhdGUgdm9pZCBzZXRYUGF0aChTdHJpbmcgZXhwcikgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgIHhQYXRoID0gbmV3IEpET01YUGF0aChleHByKTsKLSAgICAgICAgIHhQYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IE5TQ29udGV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFhQYXRoIGV4cHJlc3Npb246IFwiIiArIGV4cHIgKyAiXCIiLCBleDEpOwotICAgICAgfQotICAgfQotCi0gICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuICh4UGF0aC50b1N0cmluZygpKTsKLSAgIH0KLQotICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEpheGVuWFBhdGgpIHsKLSAgICAgICAgIEpheGVuWFBhdGggeCA9IChKYXhlblhQYXRoKW87Ci0KLSAgICAgICAgIHJldHVybiAoc3VwZXIuZXF1YWxzKG8pICYmCi0gICAgICAgICAgICAgICAgIHhQYXRoLnRvU3RyaW5nKCkuZXF1YWxzKHgueFBhdGgudG9TdHJpbmcoKSkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotCi0gICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIHhQYXRoLmhhc2hDb2RlKCk7Ci0gICB9Ci0KLSAgIHByaXZhdGUgY2xhc3MgTlNDb250ZXh0IGV4dGVuZHMgU2ltcGxlTmFtZXNwYWNlQ29udGV4dCB7Ci0gICAgICBwdWJsaWMgTlNDb250ZXh0KCkgewotICAgICAgICAgc3VwZXIoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiA8aT5bSmF4ZW4gTmFtZXNwYWNlQ29udGV4dCBpbnRlcmZhY2Ugc3VwcG9ydF08L2k+IFRyYW5zbGF0ZXMKLSAgICAgICAqIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcHJlZml4IGludG8gdGhlIG1hdGNoaW5nIGJvdW5kCi0gICAgICAgKiBuYW1lc3BhY2UgVVJJLgotICAgICAgICoKLSAgICAgICAqIEBwYXJhbSAgcHJlZml4ICAgdGhlIG5hbWVzcGFjZSBwcmVmaXggdG8gcmVzb2x2ZS4KLSAgICAgICAqCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJIG1hdGNoaW5nIHRoZSBwcmVmaXguCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNsYXRlTmFtZXNwYWNlUHJlZml4VG9VcmkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIFN0cmluZyB1cmkgPSBzdXBlci50cmFuc2xhdGVOYW1lc3BhY2VQcmVmaXhUb1VyaShwcmVmaXgpOwotICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3R4ID0gY3VycmVudENvbnRleHQ7Ci0gICAgICAgICAgICBpZiAoY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIEVsZW1lbnQgZWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgLy8gR2V0IGNsb3NlciBlbGVtZW50IG5vZGUKLSAgICAgICAgICAgICAgIGlmIChjdHggaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICBlbHQgPSAoRWxlbWVudCljdHg7Ci0gICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotICAgICAgICAgICAgICAgICAgZWx0ID0gKChBdHRyaWJ1dGUpY3R4KS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4IGluc3RhbmNlb2YgQ29udGVudCkgewotICAgICAgICAgICAgICAgICAgZWx0ID0gKChDb250ZW50KSBjdHgpLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgIGVsdCA9ICgoRG9jdW1lbnQpY3R4KS5nZXRSb290RWxlbWVudCgpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoZWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBucyA9IGVsdC5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgIGlmIChucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICB1cmkgPSBucy5nZXRVUkkoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvWFBhdGguamF2YSBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvWFBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYTAxYy4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3hwYXRoL1hQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyotLQotCi0gJElkOiBYUGF0aC5qYXZhLHYgMS4xIDIwMDkvMDUvMjcgMjE6NDY6MjEgbXBhcmtlciBFeHAgJAotCi0gQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgSmFzb24gSHVudGVyICYgQnJldHQgTWNMYXVnaGxpbi4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cwotICAgIHRoZXNlIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJKRE9NIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yCi0gICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8cmVxdWVzdF9BVF9qZG9tX0RPVF9vcmc+LgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkpET00iLCBub3IKLSAgICBtYXkgIkpET00iIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICAgIGZyb20gdGhlIEpET00gUHJvamVjdCBNYW5hZ2VtZW50IDxyZXF1ZXN0X0FUX2pkb21fRE9UX29yZz4uCi0KLSBJbiBhZGRpdGlvbiwgd2UgcmVxdWVzdCAoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGF0IHlvdSBpbmNsdWRlIGluIHRoZQotIGVuZC11c2VyIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24gYW5kL29yIGluIHRoZQotIHNvZnR3YXJlIGl0c2VsZiBhbiBhY2tub3dsZWRnZW1lbnQgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAgICAgIEpET00gUHJvamVjdCAoaHR0cDovL3d3dy5qZG9tLm9yZy8pLiIKLSBBbHRlcm5hdGl2ZWx5LCB0aGUgYWNrbm93bGVkZ21lbnQgbWF5IGJlIGdyYXBoaWNhbCB1c2luZyB0aGUgbG9nb3MKLSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5qZG9tLm9yZy9pbWFnZXMvbG9nb3MuCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSkRPTSBBVVRIT1JTIE9SIFRIRSBQUk9KRUNUCi0gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gU1VDSCBEQU1BR0UuCi0KLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgSkRPTSBQcm9qZWN0IGFuZCB3YXMgb3JpZ2luYWxseQotIGNyZWF0ZWQgYnkgSmFzb24gSHVudGVyIDxqaHVudGVyX0FUX2pkb21fRE9UX29yZz4gYW5kCi0gQnJldHQgTWNMYXVnaGxpbiA8YnJldHRfQVRfamRvbV9ET1Rfb3JnPi4gIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gb24gdGhlIEpET00gUHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5qZG9tLm9yZy8+LgotCi0gKi8KLQotcGFja2FnZSBvcmcuamRvbS54cGF0aDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuamRvbS4qOwotCi0KLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIGZvciBwZXJmb3JtaW5nIFhQYXRoIGNhbGxzIG9uIEpET00gbm9kZXMsIHdpdGggYSBmYWN0b3J5Ci0gKiBpbnRlcmZhY2UgZm9yIG9idGFpbmluZyBhIGZpcnN0IFhQYXRoIGluc3RhbmNlLiBVc2VycyBvcGVyYXRlIGFnYWluc3QgdGhpcwotICogY2xhc3Mgd2hpbGUgWFBhdGggdmVuZG9ycyBjYW4gcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbnMgdW5kZXJuZWF0aC4gIFVzZXJzCi0gKiBjYW4gY2hvb3NlIGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIGVpdGhlciB7QGxpbmsgI3NldFhQYXRoQ2xhc3N9IG9yCi0gKiB0aGUgc3lzdGVtIHByb3BlcnR5ICJvcmcuamRvbS54cGF0aC5jbGFzcyIuCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEgJCwgJERhdGU6IDIwMDkvMDUvMjcgMjE6NDY6MjEgJAotICogQGF1dGhvciAgTGF1cmVudCBCaWhhbmljCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYUGF0aCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0lEID0KLSAgICAiQCgjKSAkUkNTZmlsZTogWFBhdGguamF2YSx2ICQgJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwOS8wNS8yNyAyMTo0NjoyMSAkICROYW1lOiAgJCI7Ci0KLSAgIC8qKgotICAgICogVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0eSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZQotICAgICogbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gdXNlLgotICAgICogPHA+Ci0gICAgKiBUaGUgcHJvcGVydHkgbmFtZSBpczoKLSAgICAqICI8Y29kZT5vcmcuamRvbS54cGF0aC5jbGFzczwvY29kZT4iLjwvcD4KLSAgICAqLwotICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nICBYUEFUSF9DTEFTU19QUk9QRVJUWSA9ICJvcmcuamRvbS54cGF0aC5jbGFzcyI7Ci0KLSAgIC8qKgotICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gdXNlIGlmIG5vbmUgd2FzIGNvbmZpZ3VyZWQuCi0gICAgKi8KLSAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyAgREVGQVVMVF9YUEFUSF9DTEFTUyAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qZG9tLnhwYXRoLkpheGVuWFBhdGgiOwotCi0gICAvKioKLSAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBpbnN0YW5jaWF0ZSBhIG5ldyBYUGF0aCBjb25jcmV0ZQotICAgICogaW1wbGVtZW50YXRpb24uCi0gICAgKgotICAgICogQHNlZSAgICAjbmV3SW5zdGFuY2UKLSAgICAqLwotICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBudWxsOwotCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgWFBhdGggd3JhcHBlciBvYmplY3QsIGNvbXBpbGluZyB0aGUgc3BlY2lmaWVkCi0gICAgKiBYUGF0aCBleHByZXNzaW9uLgotICAgICoKLSAgICAqIEBwYXJhbSAgcGF0aCAgIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIHdyYXAuCi0gICAgKgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgaWYgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgaW52YWxpZC4KLSAgICAqLwotICAgcHVibGljIHN0YXRpYyBYUGF0aCBuZXdJbnN0YW5jZShTdHJpbmcgcGF0aCkgdGhyb3dzIEpET01FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBjYWxsID0+IERldGVybWluZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KFhQQVRIX0NMQVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfWFBBVEhfQ0xBU1MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4MSkgewotICAgICAgICAgICAgICAgLy8gQWNjZXNzIHRvIHN5c3RlbSBwcm9wZXJ0eSBkZW5pZWQuID0+IFVzZSBkZWZhdWx0IGltcGwuCi0gICAgICAgICAgICAgICBjbGFzc05hbWUgPSBERUZBVUxUX1hQQVRIX0NMQVNTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0WFBhdGhDbGFzcyhDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkpOwotICAgICAgICAgfQotICAgICAgICAgLy8gQWxsb2NhdGUgYW5kIHJldHVybiBuZXcgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuCi0gICAgICAgICByZXR1cm4gKFhQYXRoKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHBhdGggfSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgIHRocm93IGV4MTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4MikgewotICAgICAgICAgLy8gQ29uc3RydWN0b3IgdGhyZXcgYW4gZXJyb3Igb24gaW52b2NhdGlvbi4KLSAgICAgICAgIFRocm93YWJsZSB0ID0gZXgyLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCi0gICAgICAgICB0aHJvdyAodCBpbnN0YW5jZW9mIEpET01FeGNlcHRpb24pPyAoSkRPTUV4Y2VwdGlvbil0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKRE9NRXhjZXB0aW9uKHQudG9TdHJpbmcoKSwgdCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MykgewotICAgICAgICAgLy8gQW55IHJlZmxlY3Rpb24gZXJyb3IgKHByb2JhYmx5IGR1ZSB0byBhIGNvbmZpZ3VyYXRpb24gbWlzdGFrZSkuCi0gICAgICAgICB0aHJvdyBuZXcgSkRPTUV4Y2VwdGlvbihleDMudG9TdHJpbmcoKSwgZXgzKTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyoqCi0gICAgKiBTZXRzIHRoZSBjb25jcmV0ZSBYUGF0aCBzdWJjbGFzcyB0byB1c2Ugd2hlbiBhbGxvY2F0aW5nIFhQYXRoCi0gICAgKiBpbnN0YW5jZXMuCi0gICAgKgotICAgICogQHBhcmFtICBhQ2xhc3MgICB0aGUgY29uY3JldGUgc3ViY2xhc3Mgb2YgWFBhdGguCi0gICAgKgotICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gICBpZiA8Y29kZT5hQ2xhc3M8L2NvZGU+IGlzCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgICAgICAgICAgICBpZiA8Y29kZT5hQ2xhc3M8L2NvZGU+IGlzCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIGNvbmNyZXRlIHN1YmNsYXNzCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFhQYXRoLgotICAgICovCi0gICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0WFBhdGhDbGFzcyhDbGFzcyBhQ2xhc3MpIHRocm93cyBKRE9NRXhjZXB0aW9uIHsKLSAgICAgIGlmIChhQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYUNsYXNzIik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgICBpZiAoKFhQYXRoLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYUNsYXNzKSkgJiYKLSAgICAgICAgICAgICAoTW9kaWZpZXIuaXNBYnN0cmFjdChhQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpID09IGZhbHNlKSkgewotICAgICAgICAgICAgLy8gQ29uY3JldGUgc3ViY2xhc3Mgb2YgWFBhdGggPT4gR2V0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBjb25zdHJ1Y3RvciA9IGFDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oYUNsYXNzLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIGNvbmNyZXRlIEpET00gWFBhdGggaW1wbGVtZW50YXRpb24iKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChKRE9NRXhjZXB0aW9uIGV4MSkgewotICAgICAgICAgdGhyb3cgZXgxOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgIC8vIEFueSByZWZsZWN0aW9uIGVycm9yIChwcm9iYWJseSBkdWUgdG8gYSBjb25maWd1cmF0aW9uIG1pc3Rha2UpLgotICAgICAgICAgdGhyb3cgbmV3IEpET01FeGNlcHRpb24oZXgyLnRvU3RyaW5nKCksIGV4Mik7Ci0gICAgICB9Ci0gICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiBhbmQgcmV0dXJucyB0aGUgbGlzdAotICAgICAqIG9mIHNlbGVjdGVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtICBjb250ZXh0ICAgdGhlIG5vZGUgdG8gdXNlIGFzIGNvbnRleHQgZm9yIGV2YWx1YXRpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgaXRlbXMsIHdoaWNoIG1heSBiZSBvZiB0eXBlczoge0BsaW5rIEVsZW1lbnR9LAotICAgICAqICAgICAgICAge0BsaW5rIEF0dHJpYnV0ZX0sIHtAbGluayBUZXh0fSwge0BsaW5rIENEQVRBfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBDb21tZW50fSwge0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn0sIEJvb2xlYW4sCi0gICAgICogICAgICAgICBEb3VibGUsIG9yIFN0cmluZy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiAgIGlmIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBYUGF0aAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gb24gdGhlIHNwZWNpZmllZCBjb250ZXh0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICAgICAqLwotICAgYWJzdHJhY3QgcHVibGljIExpc3Qgc2VsZWN0Tm9kZXMoT2JqZWN0IGNvbnRleHQpIHRocm93cyBKRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIGZpcnN0Ci0gICAgICogZW50cnkgaW4gdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgbm9kZXMgKG9yIGF0b21pY3MpLgotICAgICAqCi0gICAgICogQHBhcmFtICBjb250ZXh0ICAgdGhlIG5vZGUgdG8gdXNlIGFzIGNvbnRleHQgZm9yIGV2YWx1YXRpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIGl0ZW0sIHdoaWNoIG1heSBiZSBvZiB0eXBlczoge0BsaW5rIEVsZW1lbnR9LAotICAgICAqICAgICAgICAge0BsaW5rIEF0dHJpYnV0ZX0sIHtAbGluayBUZXh0fSwge0BsaW5rIENEQVRBfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBDb21tZW50fSwge0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn0sIEJvb2xlYW4sCi0gICAgICogICAgICAgICBEb3VibGUsIFN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaXRlbSB3YXMgc2VsZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gICBpZiB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgWFBhdGgKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uIG9uIHRoZSBzcGVjaWZpZWQgY29udGV4dAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC4KLSAgICAgKi8KLSAgIGFic3RyYWN0IHB1YmxpYyBPYmplY3Qgc2VsZWN0U2luZ2xlTm9kZShPYmplY3QgY29udGV4dCkgdGhyb3dzIEpET01FeGNlcHRpb247Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaXJzdCBub2RlIHNlbGVjdGVkIGJ5IGFwcGx5aW5nCi0gICAgKiB0aGUgd3JhcHBlZCBYUGF0aCBleHByZXNzaW9uIHRvIHRoZSBnaXZlbiBjb250ZXh0LgotICAgICoKLSAgICAqIEBwYXJhbSAgY29udGV4dCAgIHRoZSBlbGVtZW50IHRvIHVzZSBhcyBjb250ZXh0IGZvciBldmFsdWF0aW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpcnN0IG5vZGUgc2VsZWN0ZWQgYnkgYXBwbHlpbmcKLSAgICAqICAgICAgICAgdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gY29udGV4dC4KLSAgICAqCi0gICAgKiBAdGhyb3dzIEpET01FeGNlcHRpb24gICBpZiB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBpbnZhbGlkIG9yCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgZXZhbHVhdGlvbiBvbiB0aGUgc3BlY2lmaWVkIGNvbnRleHQKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC4KLSAgICAqLwotICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyB2YWx1ZU9mKE9iamVjdCBjb250ZXh0KSB0aHJvd3MgSkRPTUV4Y2VwdGlvbjsKLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgdmFsdWUgb2YgdGhlIGZpcnN0IG5vZGUgc2VsZWN0ZWQgYnkgYXBwbHlpbmcKLSAgICAqIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIGNvbnRleHQuCi0gICAgKgotICAgICogQHBhcmFtICBjb250ZXh0ICAgdGhlIGVsZW1lbnQgdG8gdXNlIGFzIGNvbnRleHQgZm9yIGV2YWx1YXRpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBYUGF0aCBleHByZXNzaW9uLgotICAgICoKLSAgICAqIEByZXR1cm4gdGhlIG51bWJlciB2YWx1ZSBvZiB0aGUgZmlyc3Qgbm9kZSBzZWxlY3RlZCBieSBhcHBseWluZwotICAgICogICAgICAgICB0aGUgd3JhcHBlZCBYUGF0aCBleHByZXNzaW9uIHRvIHRoZSBnaXZlbiBjb250ZXh0LAotICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBub2RlIHdhcyBzZWxlY3RlZCBvciB0aGUKLSAgICAqICAgICAgICAgc3BlY2lhbCB2YWx1ZSB7QGxpbmsgamF2YS5sYW5nLkRvdWJsZSNOYU59Ci0gICAgKiAgICAgICAgIChOb3QtYS1OdW1iZXIpIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBjYW4gbm90IGJlCi0gICAgKiAgICAgICAgIGNvbnZlcnRlZCBpbnRvIGEgbnVtYmVyIHZhbHVlLgotICAgICoKLSAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiAgIGlmIHRoZSBYUGF0aCBleHByZXNzaW9uIGlzIGludmFsaWQgb3IKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBldmFsdWF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgY29udGV4dAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICAgICovCi0gICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlT2YoT2JqZWN0IGNvbnRleHQpIHRocm93cyBKRE9NRXhjZXB0aW9uOwotCi0gICAvKioKLSAgICAqIERlZmluZXMgYW4gWFBhdGggdmFyaWFibGUgYW5kIHNldHMgaXRzIHZhbHVlLgotICAgICoKLSAgICAqIEBwYXJhbSAgbmFtZSAgICB0aGUgdmFyaWFibGUgbmFtZS4KLSAgICAqIEBwYXJhbSAgdmFsdWUgICB0aGUgdmFyaWFibGUgdmFsdWUuCi0gICAgKgotICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gICBpZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyBub3QKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB2YWxpZCBYUGF0aCB2YXJpYWJsZSBuYW1lCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSB2YWx1ZSB0eXBlIGlzIG5vdAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24KLSAgICAqLwotICAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2V0VmFyaWFibGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0KLSAgIC8qKgotICAgICogQWRkcyBhIG5hbWVzcGFjZSBkZWZpbml0aW9uIHRvIHRoZSBsaXN0IG9mIG5hbWVzcGFjZXMga25vd24gb2YKLSAgICAqIHRoaXMgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqIDxwPgotICAgICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJbiBYUGF0aCwgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhCi0gICAgKiAnZGVmYXVsdCBuYW1lc3BhY2UnLiAgVGhlIGVtcHR5IHByZWZpeCA8Yj5hbHdheXM8L2I+IHJlc29sdmVzCi0gICAgKiB0byB0aGUgZW1wdHkgbmFtZXNwYWNlIFVSSS48L3A+Ci0gICAgKgotICAgICogQHBhcmFtICBuYW1lc3BhY2UgICB0aGUgbmFtZXNwYWNlLgotICAgICovCi0gICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoTmFtZXNwYWNlIG5hbWVzcGFjZSk7Ci0KLSAgIC8qKgotICAgICogQWRkcyBhIG5hbWVzcGFjZSBkZWZpbml0aW9uIChwcmVmaXggYW5kIFVSSSkgdG8gdGhlIGxpc3Qgb2YKLSAgICAqIG5hbWVzcGFjZXMga25vd24gb2YgdGhpcyBYUGF0aCBleHByZXNzaW9uLgotICAgICogPHA+Ci0gICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IEluIFhQYXRoLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGEKLSAgICAqICdkZWZhdWx0IG5hbWVzcGFjZScuICBUaGUgZW1wdHkgcHJlZml4IDxiPmFsd2F5czwvYj4gcmVzb2x2ZXMKLSAgICAqIHRvIHRoZSBlbXB0eSBuYW1lc3BhY2UgVVJJLjwvcD4KLSAgICAqCi0gICAgKiBAcGFyYW0gIHByZWZpeCAgIHRoZSBuYW1lc3BhY2UgcHJlZml4LgotICAgICogQHBhcmFtICB1cmkgICAgICB0aGUgbmFtZXNwYWNlIFVSSS4KLSAgICAqCi0gICAgKiBAdGhyb3dzIElsbGVnYWxOYW1lRXhjZXB0aW9uICAgaWYgdGhlIHByZWZpeCBvciB1cmkgYXJlIG51bGwgb3IKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmdzIG9yIGlmIHRoZXkgY29udGFpbgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVycy4KLSAgICAqLwotICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgIGFkZE5hbWVzcGFjZShOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKHByZWZpeCwgdXJpKSk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyB0aGUgd3JhcHBlZCBYUGF0aCBleHByZXNzaW9uIGFzIGEgc3RyaW5nLgotICAgICoKLSAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgWFBhdGggZXhwcmVzc2lvbiBhcyBhIHN0cmluZy4KLSAgICAqLwotICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRYUGF0aCgpOwotCi0KLSAgIC8qKgotICAgICogRXZhbHVhdGVzIGFuIFhQYXRoIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQKLSAgICAqIGl0ZW1zLgotICAgICogPHA+Ci0gICAgKiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIHRoZQotICAgICogc2FtZSBYUGF0aCBleHByZXNzaW9uIG5lZWRzIHRvIGJlIGFwcGxpZWQgc2V2ZXJhbCB0aW1lcyAob24gdGhlCi0gICAgKiBzYW1lIG9yIGRpZmZlcmVudCBjb250ZXh0cykgYXMgaXQgcmVxdWlyZXMgdGhlIGV4cHJlc3Npb24gdG8gYmUKLSAgICAqIGNvbXBpbGVkIGJlZm9yZSBiZWluZyBldmFsdWF0ZWQuICBJbiBzdWNoIGNhc2VzLAotICAgICoge0BsaW5rICNuZXdJbnN0YW5jZSBhbGxvY2F0aW5nfSBhbiBYUGF0aCB3cmFwcGVyIGluc3RhbmNlIGFuZAotICAgICoge0BsaW5rICNzZWxlY3ROb2RlcyhqYXZhLmxhbmcuT2JqZWN0KSBldmFsdWF0aW5nfSBpdCBzZXZlcmFsCi0gICAgKiB0aW1lcyBpcyB3YXkgbW9yZSBlZmZpY2llbnQuCi0gICAgKiA8L3A+Ci0gICAgKgotICAgICogQHBhcmFtICBjb250ZXh0ICAgdGhlIG5vZGUgdG8gdXNlIGFzIGNvbnRleHQgZm9yIGV2YWx1YXRpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBYUGF0aCBleHByZXNzaW9uLgotICAgICogQHBhcmFtICBwYXRoICAgICAgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuCi0gICAgKgotICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzZWxlY3RlZCBpdGVtcywgd2hpY2ggbWF5IGJlIG9mIHR5cGVzOiB7QGxpbmsgRWxlbWVudH0sCi0gICAgKiAgICAgICAgIHtAbGluayBBdHRyaWJ1dGV9LCB7QGxpbmsgVGV4dH0sIHtAbGluayBDREFUQX0sCi0gICAgKiAgICAgICAgIHtAbGluayBDb21tZW50fSwge0BsaW5rIFByb2Nlc3NpbmdJbnN0cnVjdGlvbn0sIEJvb2xlYW4sCi0gICAgKiAgICAgICAgIERvdWJsZSwgb3IgU3RyaW5nLgotICAgICoKLSAgICAqIEB0aHJvd3MgSkRPTUV4Y2VwdGlvbiAgIGlmIHRoZSBYUGF0aCBleHByZXNzaW9uIGlzIGludmFsaWQgb3IKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBldmFsdWF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgY29udGV4dAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICAgICovCi0gICBwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0Tm9kZXMoT2JqZWN0IGNvbnRleHQsIFN0cmluZyBwYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbmV3SW5zdGFuY2UocGF0aCkuc2VsZWN0Tm9kZXMoY29udGV4dCk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogRXZhbHVhdGVzIHRoZSB3cmFwcGVkIFhQYXRoIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIGZpcnN0Ci0gICAgKiBlbnRyeSBpbiB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyAob3IgYXRvbWljcykuCi0gICAgKiA8cD4KLSAgICAqIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgKiBzYW1lIFhQYXRoIGV4cHJlc3Npb24gbmVlZHMgdG8gYmUgYXBwbGllZCBzZXZlcmFsIHRpbWVzIChvbiB0aGUKLSAgICAqIHNhbWUgb3IgZGlmZmVyZW50IGNvbnRleHRzKSBhcyBpdCByZXF1aXJlcyB0aGUgZXhwcmVzc2lvbiB0byBiZQotICAgICogY29tcGlsZWQgYmVmb3JlIGJlaW5nIGV2YWx1YXRlZC4gIEluIHN1Y2ggY2FzZXMsCi0gICAgKiB7QGxpbmsgI25ld0luc3RhbmNlIGFsbG9jYXRpbmd9IGFuIFhQYXRoIHdyYXBwZXIgaW5zdGFuY2UgYW5kCi0gICAgKiB7QGxpbmsgI3NlbGVjdFNpbmdsZU5vZGUoamF2YS5sYW5nLk9iamVjdCkgZXZhbHVhdGluZ30gaXQKLSAgICAqIHNldmVyYWwgdGltZXMgaXMgd2F5IG1vcmUgZWZmaWNpZW50LgotICAgICogPC9wPgotICAgICoKLSAgICAqIEBwYXJhbSAgY29udGV4dCAgIHRoZSBlbGVtZW50IHRvIHVzZSBhcyBjb250ZXh0IGZvciBldmFsdWF0aW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAqIEBwYXJhbSAgcGF0aCAgICAgIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLgotICAgICoKLSAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIGl0ZW0sIHdoaWNoIG1heSBiZSBvZiB0eXBlczoge0BsaW5rIEVsZW1lbnR9LAotICAgICogICAgICAgICB7QGxpbmsgQXR0cmlidXRlfSwge0BsaW5rIFRleHR9LCB7QGxpbmsgQ0RBVEF9LAotICAgICogICAgICAgICB7QGxpbmsgQ29tbWVudH0sIHtAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259LCBCb29sZWFuLAotICAgICogICAgICAgICBEb3VibGUsIFN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaXRlbSB3YXMgc2VsZWN0ZWQuCi0gICAgKgotICAgICogQHRocm93cyBKRE9NRXhjZXB0aW9uICAgaWYgdGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgaW52YWxpZCBvcgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaXRzIGV2YWx1YXRpb24gb24gdGhlIHNwZWNpZmllZCBjb250ZXh0Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQuCi0gICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHNlbGVjdFNpbmdsZU5vZGUoT2JqZWN0IGNvbnRleHQsIFN0cmluZyBwYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSkRPTUV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbmV3SW5zdGFuY2UocGF0aCkuc2VsZWN0U2luZ2xlTm9kZShjb250ZXh0KTsKLSAgIH0KLQotCi0gICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC8vIFNlcmlhbGl6YXRpb24gc3VwcG9ydAotICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIC8qKgotICAgICogPGk+W1NlcmlhbGl6YXRpb24gc3VwcG9ydF08L2k+IFJldHVybnMgdGhlIGFsdGVybmF0aXZlIG9iamVjdAotICAgICogdG8gd3JpdGUgdG8gdGhlIHN0cmVhbSB3aGVuIHNlcmlhbGl6aW5nIHRoaXMgb2JqZWN0LiAgVGhpcwotICAgICogbWV0aG9kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBkZWRpY2F0ZWQgbmVzdGVkIGNsYXNzIHRvCi0gICAgKiBzZXJpYWxpemUgWFBhdGggZXhwcmVzc2lvbnMgaW5kZXBlbmRlbnRseSBvZiB0aGUgY29uY3JldGUKLSAgICAqIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQuCi0gICAgKiA8cD4KLSAgICAqIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogU3ViY2xhc3NlcyBhcmUgbm90IGFsbG93ZWQgdG8gb3ZlcnJpZGUKLSAgICAqIHRoaXMgbWV0aG9kIHRvIGVuc3VyZSB2YWxpZCBzZXJpYWxpemF0aW9uIG9mIGFsbAotICAgICogaW1wbGVtZW50YXRpb25zLjwvcD4KLSAgICAqCi0gICAgKiBAcmV0dXJuIGFuIFhQYXRoU3RyaW5nIGluc3RhbmNlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgd3JhcHBlZAotICAgICogICAgICAgICBYUGF0aCBleHByZXNzaW9uLgotICAgICoKLSAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uICAgbmV2ZXIuCi0gICAgKi8KLSAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbmV3IFhQYXRoU3RyaW5nKHRoaXMuZ2V0WFBhdGgoKSk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogVGhlIFhQYXRoU3RyaW5nIGlzIGRlZGljYXRlZCB0byBzZXJpYWxpemUgaW5zdGFuY2VzIG9mCi0gICAgKiBYUGF0aCBzdWJjbGFzc2VzIGluIGEgaW1wbGVtZW50YXRpb24taW5kZXBlbmRlbnQgbWFubmVyLgotICAgICogPHA+Ci0gICAgKiBYUGF0aFN0cmluZyBlbnN1cmVzIHRoYXQgb25seSBzdHJpbmcgZGF0YSBhcmUgc2VyaWFsaXplZC4gIFVwb24KLSAgICAqIGRlc2VyaWFsaXphdGlvbiwgWFBhdGhTdHJpbmcgcmVsaWVzIG9uIFhQYXRoIGZhY3RvcnkgbWV0aG9kIHRvCi0gICAgKiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBjb25jcmV0ZSBYUGF0aCB3cmFwcGVyIGN1cnJlbnRseQotICAgICogY29uZmlndXJlZC48L3A+Ci0gICAgKi8KLSAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIFhQYXRoU3RyaW5nIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAgIC8qKgotICAgICAgICogVGhlIFhQYXRoIGV4cHJlc3Npb24gYXMgYSBzdHJpbmcuCi0gICAgICAgKi8KLSAgICAgIHByaXZhdGUgU3RyaW5nIHhQYXRoID0gbnVsbDsKLQotICAgICAgLyoqCi0gICAgICAgKiBDcmVhdGVzIGEgbmV3IFhQYXRoU3RyaW5nIGluc3RhbmNlIGZyb20gdGhlIHNwZWNpZmllZAotICAgICAgICogWFBhdGggZXhwcmVzc2lvbi4KLSAgICAgICAqCi0gICAgICAgKiBAcGFyYW0gIHhwYXRoICAgdGhlIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBYUGF0aFN0cmluZyhTdHJpbmcgeHBhdGgpIHsKLSAgICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgIHRoaXMueFBhdGggPSB4cGF0aDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiA8aT5bU2VyaWFsaXphdGlvbiBzdXBwb3J0XTwvaT4gUmVzb2x2ZXMgdGhlIHJlYWQgWFBhdGhTdHJpbmcKLSAgICAgICAqIG9iamVjdHMgaW50byBYUGF0aCBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgKgotICAgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgKiAgICAgICAgIFhQYXRoLgotICAgICAgICoKLSAgICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uICAgaWYgbm8gWFBhdGggY291bGQgYmUgYnVpbHQKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVhZCBvYmplY3QuCi0gICAgICAgKi8KLSAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFhQYXRoLm5ld0luc3RhbmNlKHRoaXMueFBhdGgpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2ggKEpET01FeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9iamVjdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBjcmVhdGUgWFBhdGggb2JqZWN0IGZvciBleHByZXNzaW9uIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhQYXRoICsgIlwiOiAiICsgZXgxLnRvU3RyaW5nKCkpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL29yZy9qZG9tL3hwYXRoL3BhY2thZ2UuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI3ZTFkLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qZG9tL3NvdXJjZS1idW5kbGUvb3JnL2pkb20veHBhdGgvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08Ym9keT4KLQotU3VwcG9ydCBmb3IgWFBhdGggZnJvbSB3aXRoaW4gSkRPTS4gIFhQYXRoIHByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSB3aXRoIGEKLXBsdWdnYWJsZSBiYWNrLWVuZC4gIFRoZSBkZWZhdWx0IGJhY2sgZW5kIGlzIEpheGVuLgotCi08L2JvZHk+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmpkb20vc291cmNlLWJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNDk2Yi4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuamRvbS9zb3VyY2UtYnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKLSMgCi0jIENvbnRyaWJ1dG9yczogCi0jIENocmlzIEFuaXN6Y3p5ayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUpET00gU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvLmNsYXNzcGF0aCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmVjOWY3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ianVuaXQuamFyIiBzb3VyY2VwYXRoPSIvb3JnLmp1bml0L2p1bml0c3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSIiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0Ly5wcm9qZWN0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWEwNmU3Li4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5qdW5pdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMGYzZGEuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qdW5pdAotQnVuZGxlLVZlcnNpb246IDMuOC4yLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDoganVuaXQuamFyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAKLSBqdW5pdC5hd3R1aTt2ZXJzaW9uPSIzLjguMiIsCi0ganVuaXQuZXh0ZW5zaW9uczt2ZXJzaW9uPSIzLjguMiIsCi0ganVuaXQuZnJhbWV3b3JrO3ZlcnNpb249IjMuOC4yIiwKLSBqdW5pdC5ydW5uZXI7dmVyc2lvbj0iMy44LjIiLAotIGp1bml0LnN3aW5ndWk7dmVyc2lvbj0iMy44LjIiLAotIGp1bml0LnN3aW5ndWkuaWNvbnM7dmVyc2lvbj0iMy44LjIiLAotIGp1bml0LnRleHR1aTt2ZXJzaW9uPSIzLjguMiIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2Fib3V0Lmh0bWwgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA5MTNlZS4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMjgsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBmb2xsb3dzOjwvcD4KLQotPGg0PkpVbml0IDMuOC4yPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEpVbml0Lm9yZy4gIFRoZSBKVW5pdCAzLjguMiBjb2RlIGluY2x1ZGVkIHdpdGggdGhlIHBsdWctaW4gaW5jbHVkZXMgbm8gbW9kaWZpY2F0aW9ucy4KLVlvdXIgdXNlIG9mIEpVbml0IDMuOC4yIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkgY29kZSBmb3JtIGNvbnRhaW5lZCBpbiB0aGUgcGx1Zy1pbiBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLVRoZSBiaW5hcnkgY29kZSBpcyBsb2NhdGVkIGluIGp1bml0LmphciBhbmQgdGhlIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gc3JjLmphci48L3A+Ci0KLTxwPmkpIElCTSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHA+aWkpIElCTSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwPmlpaSkgSUJNIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBDUEwgYXJlIG9mZmVyZWQgYnkgdGhhdCBJQk0gYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHkuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2Fib3V0X2ZpbGVzL2NwbC12MTAuaHRtbCBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9hYm91dF9maWxlcy9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1NWU3YjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2Fib3V0X2ZpbGVzL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9idWlsZC5wcm9wZXJ0aWVzIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhZjA5NWUuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqdW5pdC5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKLXNyYy5pbmNsdWRlcyA9ICouemlwLGFib3V0Lmh0bWwKLQotCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvY3BsLXYxMC5odG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU1ZTdiMC4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2p1bml0LmphciBiL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4ZjcxMWQuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9qdW5pdHNyYy56aXAgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvanVuaXRzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOGVhNWZjLi4wMDAwMDAwCi0tLSBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9qdW5pdHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvcGx1Z2luLnByb3BlcnRpZXMgYi9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1ODgxNjAuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUpVbml0IFRlc3RpbmcgRnJhbWV3b3JrCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RlcGVuZGVuY2llcy9wbHVnaW5zL29yZy5qdW5pdC9yZWFkbWUudHh0IGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNTY2M2QuLjAwMDAwMDAKLS0tIGEvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVdvcmsgaW4gdGhpcyBwcm9qZWN0IGhhcHBlbnMgaW4gdmFyaW91cyBicmFuY2hlcyBhY2NvcmRpbmcgdG8gdGhlIHZlcnNpb24gb2YgCi10aGUgbGlicmFyeSBiZWluZyBtYWludGFpbmVkLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgbG9va2luZyBmb3IgamF2YXguc2VydmxldAotdmVyc2lvbiAyLjMsIGNoZWNrIG91dCB0aGUgdjJfMyBicmFuY2ggb2YgdGhlIGphdmF4LnNlcnZsZXQgcHJvamVjdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIGIvZGVwZW5kZW5jaWVzL3BsdWdpbnMvb3JnLmp1bml0L3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODgzOTg3Ni4uMDAwMDAwMAotLS0gYS9kZXBlbmRlbmNpZXMvcGx1Z2lucy9vcmcuanVuaXQvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLSBidWlsZCBzY3JpcHQgdG8gY3JlYXRlIEpVbml0IFBsdWdpbiAtLT4KLTxwcm9qZWN0IG5hbWU9Im9yZy5qdW5pdCIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgIHZhbHVlPSJvcmcuanVuaXQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiAgdmFsdWU9IiR7ZGVzdGRpcn0vJHtwbHVnaW59IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgCTxlY2xpcHNlLmluY3JlbWVudGFsQnVpbGQgcHJvamVjdD0iJHtwbHVnaW59IiBraW5kPSJpbmNyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iYnVpbGQiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KLQotCQk8Y29weSBmaWxlPSJqdW5pdC5qYXIiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9Imp1bml0c3JjLnppcCIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnhtbCIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0iYWJvdXQuaHRtbCIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IHRvZGlyPSAiJHtkZXN0fS9NRVRBLUlORiI+Ci0JCQk8ZmlsZXNldCBkaXI9Ik1FVEEtSU5GIi8+Ci0JCTwvY29weT4JCQotCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmFtcC5hZ2YudGVzdC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTNlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwYmFkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hZ2YudGVzdC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3Q8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFnZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzFlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogVGVzdHMgZm9yIEFnZW50IEdyYXBoaWNzIGZ1bmN0aW9uYWxpdHkKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFtcC5hZ2YudGVzdAorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLVZlbmRvcjogZWNsaXBzZS5vcmcKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUsCisgb3JnLmVjbGlwc2Uuc3d0Ym90LmVjbGlwc2UuZmluZGVyLAorIG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAorIG9yZy5lY2xpcHNlLmFtcC5heGYuY29yZSwKKyBvcmcuZWNsaXBzZS5hbXAuYXhmLnZpZXdzLAorIG9yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQsCisgb3JnLmVjbGlwc2UuYW1wLmFnZi5jb3JlLAorIG9yZy5lY2xpcHNlLmFtcC5hZ2YuaWRlLAorIG9yZy5lY2xpcHNlLmFtcC5lc2NhcGUuaWRlLAorIG9yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlLAorIG9yZy5hc2NhcGUuY29yZSwKKyBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjQuOC4xIgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFnZi50ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5hbXAuYWdmLnRlc3QvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQyZTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi50ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hZ2YudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2FnZi9jaGFydC90ZXN0L1Jlc291cmNlTWFuYWdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hZ2YudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2FnZi9jaGFydC90ZXN0L1Jlc291cmNlTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc2NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYWdmL2NoYXJ0L3Rlc3QvUmVzb3VyY2VNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFnZi5jaGFydC50ZXN0OworCisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0LkNoYXJ0RWRpdFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFnZi5jaGFydC5DaGFydEVkaXRQYXJ0LlJlc291cmNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlclRlc3QgeworCQorCXByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIGNsYXNzVG9UZXN0OworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQljbGFzc1RvVGVzdCA9IG5ldyBDaGFydEVkaXRQYXJ0KCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7CisJfQorCS8qKgorCSAqIFdvdWxkIG9sZCBnYyBiZSBkZXNwb3NlZD8KKwkgKiBDYW4gd2Ugc2V0IG51bGwgdG8gZGlzcG9zZSB0aGUgZ2MKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXRHYygpeworCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOworCQlHQyBnYyA9IG5ldyBHQyhzaGVsbCk7CisJCWFzc2VydEZhbHNlKGdjLmlzRGlzcG9zZWQoKSk7CisJCQorCQljbGFzc1RvVGVzdC5zZXRHYyhnYyk7CisJCWFzc2VydEZhbHNlKGdjLmlzRGlzcG9zZWQoKSk7CisJCQorCQlHQyBnYzIgPSBuZXcgR0Moc2hlbGwpOworCQljbGFzc1RvVGVzdC5zZXRHYyhnYzIpOworCQlhc3NlcnRUcnVlKGdjLmlzRGlzcG9zZWQoKSk7CisJCWFzc2VydEZhbHNlKGdjMi5pc0Rpc3Bvc2VkKCkpOworCQkKKwkJdHJ5eworCQkJY2xhc3NUb1Rlc3Quc2V0R2MobnVsbCk7CisJCQlhc3NlcnRUcnVlKGdjMi5pc0Rpc3Bvc2VkKCkpOworCQl9Y2F0Y2goRXhjZXB0aW9uIGUpeworCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJc2hlbGwuZGlzcG9zZSgpOworCX0KKwkvKioKKwkgKiBXb3VsZCBvbGQgaW1hZ2UgYmUgZGVzcG9zZWQ/CisJICogQ2FuIHdlIHNldCBudWxsIHRvIGRpc3Bvc2UgdGhlIGltYWdlCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKXsKKwkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKKwkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIDEwLCAxMCk7CisJCWFzc2VydEZhbHNlKGltYWdlLmlzRGlzcG9zZWQoKSk7CisJCQorCQljbGFzc1RvVGVzdC5zZXRJbWFnZShpbWFnZSk7CisJCWFzc2VydEZhbHNlKGltYWdlLmlzRGlzcG9zZWQoKSk7CisJCQorCQlJbWFnZSBpbWFnZTIgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIDEwLCAxMCk7CisJCWNsYXNzVG9UZXN0LnNldEltYWdlKGltYWdlMik7CisJCWFzc2VydFRydWUoaW1hZ2UuaXNEaXNwb3NlZCgpKTsKKwkJYXNzZXJ0RmFsc2UoaW1hZ2UyLmlzRGlzcG9zZWQoKSk7CisJCQorCQl0cnl7CisJCQljbGFzc1RvVGVzdC5zZXRJbWFnZShudWxsKTsKKwkJCWFzc2VydFRydWUoaW1hZ2UyLmlzRGlzcG9zZWQoKSk7CisJCX1jYXRjaChFeGNlcHRpb24gZSl7CisJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlzaGVsbC5kaXNwb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFnZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYWdmLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBhYjJmYTgyLi44ZjE3OWYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTksMTAgKzE5LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgdmVyc2lvbj0iMy41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFnZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0LWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAwYmE3Mzk5Li5lY2VlN2Q4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTksMTAgKzE5LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YuemVzdC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYWdmLnplc3QtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBmMmU4MDdlLi43MjNhYzlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YuemVzdC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hZ2YvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFnZi56ZXN0LWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE5LDEwICsxOSw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJUFNUFVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgIDwvdXJsPgotCiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFnZjNkLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hZ2YzZC1mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDlkNTdhNDEuLmFjOWQ5NmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFnZjNkLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYWdmM2QtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFnZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQvc3JjL29yZy9lY2xpcHNlL2FtcC9hZ2YvY2hhcnQvQ2hhcnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQvc3JjL29yZy9lY2xpcHNlL2FtcC9hZ2YvY2hhcnQvQ2hhcnRFZGl0UGFydC5qYXZhCmluZGV4IDBiNWIxMzcuLjRhYjkyMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYWdmL2NoYXJ0L0NoYXJ0RWRpdFBhcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYWdmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFnZi5jaGFydC9zcmMvb3JnL2VjbGlwc2UvYW1wL2FnZi9jaGFydC9DaGFydEVkaXRQYXJ0LmphdmEKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlyZXR1cm4gc2VyaWVzQ29sb3JQcm92aWRlcjsNCiAJfQ0KIA0KLQlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgew0KKwlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsNCiAJCXJldHVybiByZXNvdXJjZU1hbmFnZXI7DQogCX0NCiANCkBAIC00OTIsNyArNDkyLDcgQEAKIAkgKiANCiAJICogQGF1dGhvciBmZWkNCiAJICovDQotCWNsYXNzIFJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIERpc3Bvc2VMaXN0ZW5lciB7DQorCXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXIgaW1wbGVtZW50cyBEaXNwb3NlTGlzdGVuZXIgew0KIAkJcHJpdmF0ZSBHQyBnYzsNCiANCiAJCXByaXZhdGUgSW1hZ2UgaW1hZ2U7DQpAQCAtNTAzLDcgKzUwMyw3IEBACiAJCQkvLw0KIAkJfQ0KIA0KLQkJdm9pZCBzZXRHYyhHQyBnYykgew0KKwkJcHVibGljIHZvaWQgc2V0R2MoR0MgZ2MpIHsNCiAJCQlpZiAodGhpcy5nYyAhPSBudWxsICYmICF0aGlzLmdjLmlzRGlzcG9zZWQoKSkgew0KIAkJCQl0aGlzLmdjLmRpc3Bvc2UoKTsNCiAJCQl9DQpAQCAtNTQwLDcgKzU0MCw3IEBACiAJCQlyZXR1cm4gaW1hZ2U7DQogCQl9DQogDQotCQl2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7DQorCQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgew0KIAkJCWlmICh0aGlzLmltYWdlICE9IG51bGwgJiYgIXRoaXMuaW1hZ2UuaXNEaXNwb3NlZCgpKSB7DQogCQkJCXRoaXMuaW1hZ2UuZGlzcG9zZSgpOw0KIAkJCX0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYWdmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFnZi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYW1wLmFnZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hZ2YuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmNDQyMzBmLi5kYzkxMDQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYWdmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFnZi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hZ2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYWdmLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTExLDkgKzExLDcgQEAKICBvcmcuZWNsaXBzZS5nZWY7dmlzaWJpbGl0eTo9cmVleHBvcnQsCiAgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLAogIG9yZy5lY2xpcHNlLmFtcC5heGYudmlld3MsCi0gb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGU7YnVuZGxlLXZlcnNpb249IjAuOS4wIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjQuOC4xIiwKLSBvcmcuanVuaXQ0O2J1bmRsZS12ZXJzaW9uPSI0LjguMSIKKyBvcmcuZWNsaXBzZS5hbXAuYXhmLmlkZTtidW5kbGUtdmVyc2lvbj0iMC45LjAiCiBFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYW1wLmFnZiwKICBvcmcuZWNsaXBzZS5hbXAuYWdmLmdlZiwKICBvcmcuZWNsaXBzZS5hbXAuYWdmLnRyZWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL2RvYy9FcGlkZW1pYy5tZWRpYXdpa2kgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL2RvYy9FcGlkZW1pYy5tZWRpYXdpa2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlYmE2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvZG9jL0VwaWRlbWljLm1lZGlhd2lraQpAQCAtMCwwICsxIEBACisJCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL2RvYy9FcGlkZW1pYy50eHQgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL2RvYy9FcGlkZW1pYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4Njk3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvZG9jL0VwaWRlbWljLnR4dApAQCAtMCwwICsxLDUxIEBACitFcGlkZW1pYworQSBzaW1wbGUgbW9kZWwgb2YgZXBpZGVtaWMgZHluYW1pY3MuIFdlIGRlZmluZSBpbmRpdmlkdWFsIGFnZW50cyB3aXRoIGRpZmZlcmVudCBkaXNlYXNlIHN0YXRlcy4gVGhlIHByb2dyZXNzaW9uIG9mIGRpc2Vhc2UgbW92ZXMgZnJvbSBzdWNjZXB0aWJsZSB0byBleHBvc2VkIHRvIGluZmVjdGlvdXMgKGVpdGhlciBzeW1wdG9tYXRpYyBvciBhc3ltcHRvbWF0aWMpIHRvIHNvbWUgb3V0Y29tZSBzdGF0ZS4gQWdlbnRzIGNhbiB0cmFuc21pdCBpbmZlY3Rpb24gdG8gdGhlaXIgaW1tZWRpYXRlIG5laWdoYm9ycy4KKworRm9yIHNvbWUgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgc2VlIEpvc2h1YSBNLiBFcHN0ZWluLiAiR2VuZXJhdGl2ZSBTb2NpYWwgU2NpZW5jZSIuIDIwMDYuIFByaW5jZXRvbi4gCisKK0NvcHlyaWdodCAyMDA5LCBNaWxlcyBQYXJrZXIuIFJlbGVhc2VkIHVuZGVyIEVjbGlwc2UgUHVibGljIExpY2Vuc2UuIEFsbCB1c2VzIHNob3VsZCBiZSBhdHRyaWJ1dGVkLgorCitQYXJhbWV0ZXJzCitFcGlkZW1pYwlJbmRpdmlkdWFsIENvdW50CVRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgdG8gY3JlYXRlLglpbnQJMTUwMAorRXBpZGVtaWMJSW5pdGlhbCBJbmZlY3Rpb24gUHJvYmFiaWxpdHkJVGhlIHByb2JhYmlsaXR5IHRoYXQgYW55IGdpdmVuIGluZGl2aWR1YWwgd2lsbCBiZSBpbmZlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb2RlbCBydW4uIEZvciBleGFtcGxlLCBpZiB0aGlzIHZhbHVlIGlzIC4xNSwgYW5kIHRoZWlyIGFyZSAxMDAgaW5kaXZpZHVhbHMgaW4gdGhlIG1vZGVsLCByb3VnaGx5IDE1IG9mIHRob3NlIGluZGl2aWR1YWxzIHdpbGwgYmUgaW5mZWN0ZWQgYXQgdGltZSAwLglkb3VibGUJLjA1CitFcGlkZW1pYwlNaW4gQ29udGFjdCBUcmFuc21pc3Npb24gUHJvYmFiaWxpdHkJVGhlIG1pbmltdW0gcHJvYmFiaWxpdHkgdGhhdCBwcm94aW1pdHkgdG8gYSBzaW5nbGUgbmVpZ2hib3IgZm9yIGEgc2luZ2xlIHBlcmlvZCB3aWxsIHJlc3VsdCBpbiB0cmFuc21pc3Npb24gb2YgaW5mZWN0aW9uLiBBdCB0aGUgc3RhcnQgb2YgZWFjaCBtb2RlbCBydW4sIGVhY2ggaW5kaXZpZHVhbCBpcyBhc3NpZ25lZCBhIGNvbnRhY3QgdHJhbnNtaXNzaW9uIHByb2JhYmlsaXR5IGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuIEZvciBleGFtcGxlLCBpZiB0aGlzIHZhbHVlIHdhcyAuMDggYW5kIHRoZSBtYXhpbXVtIHZhbHVlIHdhcyAwLjEyIGEgZ2l2ZW4gaW5kaXZpZHVhbCBjb3VsZCBoYXZlIGFueSB2YWx1ZSBiZXR3ZWVuIHRob3NlIHR3bywgYnV0IHRoZSBhdmVyYWdlIHRyYW5zbWlzc2lvbiBwcm9iYWJpbGl0eSB3b3VsZCBiZSBhcm91bmQgLjEuIElmIG1pbml1bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHRoZSBzYW1lLCB0aGVuIGFsbCBpbmRpdmlkdWFscyB3aWxsIGhhdmUgdGhlIHNhbWUgY2hhbmNlIG9mIHBhc3NpbmcgYWxvbmcgaW5mZWN0aW9uIHRvIGEgZ2l2ZW4gbmVpZ2hib3IuIFRoaXMgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTWF4IENvbnRhY3QgdHJhbnNtaXNzaW9uIFByb2JhYmlsaXR5Lglkb3VibGUJLjA4CitFcGlkZW1pYwlNYXggQ29udGFjdCBUcmFuc21pc3Npb24gUHJvYmFiaWxpdHkJVGhlIG1heGltdW0gcHJvYmFiaWxpdHkgdGhhdCBwcm94aW1pdHkgdG8gYSBzaW5nbGUgbmVpZ2hib3IgZm9yIGEgc2luZ2xlIHBlcmlvZCB3aWxsIHJlc3VsdCBpbiB0cmFuc21pc3Npb24gb2YgaW5mZWN0aW9uLiBTZWUgTWluIENvbnRhY3QgUHJvYmFiaWxpdHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uIE11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIGFuZCBncmVhdGVyIG9yIGVxdWFsIHRvIE1pbiBDb250YWN0IFRyYW5zbWlzc2lvbiBQcm9iYWJpbGl0eS4JZG91YmxlCS4xNgorRXBpZGVtaWMJQ2FzZSBNb3J0YWxpdHkgUmF0ZQlUaGUgY3VycmVudCBwcm9iYWJpbGl0eSB0aGF0IGRlYXRoIHdpbGwgb2NjdXIgZm9yIGEgZ2l2ZW4gaW5kaXZpZHVhbCBhcyBhIHJlc3VsdCBvZiBpbmZlY3Rpb24uIFNvbWUgbnVtYmVyIGJldHdlZW4gMC4wIGFuZCAxLjAuCWRvdWJsZQkuMDUKK0VwaWRlbWljCVBlcmlvZHMgcGVyIERheQkJaW50CTI0CitFcGlkZW1pYwlNaW4gUGVyaW9kIEV4cG9zdXJlCVRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIGZyb20gaW5pdGlhbCBleHBvc3VyZSB0byBpbmZlY3Rpb3VzIGFzeW1wdG9tYXRpYyBvciBzeW1wdG9tYXRpYyBzdGF0ZS4gMCBvciBncmVhdGVyLglpbnQJMjQKK0VwaWRlbWljCU1heCBQZXJpb2QgRXhwb3N1cmUJTWF4aW11bSB0aW1lIGZyb20gaW5pdGlhbCBleHBvc3VyZSB0byBpbmZlY3Rpb3VzIGFzeW1wdG9tYXRpYyBvciBzeW1wdG9tYXRpYyBzdGF0ZS4gMCBvciBncmVhdGVyLglpbnQJNzIKK0VwaWRlbWljCU1pbiBQZXJpb2QgQXN5bXB0b20gSW5mZWN0aW9uCU1heGltdW0gdGltZSBzcGVudCBpbmZlY3RlZCB3aXRob3V0IHNob3dpbmcgc3ltcHRvbXMuIDAgb3IgZ3JlYXRlci4JaW50CTI0CitFcGlkZW1pYwlNYXggUGVyaW9kIEFzeW1wdG9tIEluZmVjdGlvbglNYXhpbXVtIHRpbWUgc3BlbnQgaW5mZWN0ZWQgd2l0aG91dCBzaG93aW5nIHN5bXB0b21zLiBNYXkgYmUgemVybyEJaW50CTk2CitFcGlkZW1pYwlNaW4gUGVyaW9kIFN5bXB0b20gSW5mZWN0aW9uCU1pbmltdW0gdGltZSBzcGVudCBpbmZlY3RlZCB3aXRoIG9idmlvdXMgc3ltcHRvbXMuIDAgb3IgZ3JlYXRlci4JaW50CTI0CitFcGlkZW1pYwlNYXggUGVyaW9kIFN5bXB0b20gSW5mZWN0aW9uCU1heGltdW0gdGltZSBzcGVudCBpbmZlY3RlZCB3aXRoIG9idmlvdXMgc3ltcHRvbXMuIDEgb3IgZ3JlYXRlci4JaW50CTE2OAorRXBpZGVtaWMJTW92ZW1lbnQgUHJvYmFiaWxpdHkJVGhlIGNoYW5jZSB0aGF0IGFuIGFnZW50IHdpbGwgbW92ZSB3aXRoaW4gYSBnaXZlbiBwZXJpb2QuIE1heSBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwLjAgYW5kIDEuMC4JZG91YmxlCS41CitBZ2VudHMKK0luZGl2aWR1YWwJCisgICAgCisKK0F0dHJpYnV0ZXMKK0FnZW50CU5hbWUJRGVzY3JpcHRpb24gVHlwZQlEZWZhdWx0IFZhbHVlCitJbmRpdmlkdWFsCVN0YXR1cwkJU3RhdHVzRW51bQlTdXNjZXB0aWJsZQorSW5kaXZpZHVhbAlFeHBvc3VyZSBFbmQgUGVyaW9kCQlpbnQJCitJbmRpdmlkdWFsCUFzeW1wdG9tYXRpYyBFbmQgUGVyaW9kCQlpbnQJCitJbmRpdmlkdWFsCU91dGNvbWUgUGVyaW9kCQlpbnQJCitJbmRpdmlkdWFsCUNvbnRhY3QgVHJhbnNtaXNzaW9uIFByb2JhYmlsaXR5CQlkb3VibGUJCisgICAgCisKK0FjdGl2aXRpZXMKK0FnZW50CU5hbWUJRGVzY3JpcHRpb24KKyAgICAgICAgCitJbmRpdmlkdWFsCUluaXRpYWxpemUgTG9jYXRpb24JSW5pdGlhbGl6ZSBMb2NhdGlvbiBJbml0aWFsaXphdGlvbi4gRXhlY3V0ZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbW9kZWwgcnVuLgorSW5kaXZpZHVhbAlNb3ZlbWVudAlNb3ZlbWVudCBSdWxlLiBFeGVjdXRlZCBldmVyeSBwZXJpb2QuCitJbmRpdmlkdWFsCUluaXRpYWxpemUgU3RhdGUJSW5pdGlhbGl6ZSBTdGF0ZSBJbml0aWFsaXphdGlvbi4gRXhlY3V0ZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbW9kZWwgcnVuLgorSW5kaXZpZHVhbAlUcmFuc21pc3Npb24JVHJhbnNtaXNzaW9uIFJ1bGUuIEV4ZWN1dGVkIGV2ZXJ5IHBlcmlvZC4KK0luZGl2aWR1YWwJUHJvZ3Jlc3Npb24JUHJvZ3Jlc3Npb24gUnVsZS4gRXhlY3V0ZWQgZXZlcnkgcGVyaW9kLgorSW5kaXZpZHVhbAlFeHBvc3VyZQlXYXRjaCBmb3IgY2hhbmdlcyBpbiBTdGF0dXMuCisgICAgCisKK1NwYWNlcworICAgIAorTmFtZQlEZXNjcmlwdGlvbglUeXBlCitDaXR5CQkyLURpbWVuc2lvbmFsIEdyaWQKK0dlbmVyYXRlZCBieSBtZXRhYWJtIHN5c3RlbTogSnVuIDI1LCAyMDExIDY6MTY6NDkgUE0gUERULgorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9EZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9EZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEuamF2YQppbmRleCAwYjgxODc4Li4wMzI3NDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9lZHUvYnJvb2svRGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vZWR1L2Jyb29rL0RlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYS5qYXZhCkBAIC0xLDQxICsxLDUgQEAKIHBhY2thZ2UgZWR1LmJyb29rOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hZ2YuSUdyYXBoaWNzQWRhcHRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYWdmLklHcmFwaGljc0FkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQWdlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5DZWxsOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbE9jY3VwYW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuSG9zdENlbGw7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5Mb2NhdGVkQWdlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5TY2FwZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLmV2ZW50LlNjYXBlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ydWxlLlJ1bGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ydWxlLkV4ZWN1dGVUaGVuVXBkYXRlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuQ29sbGVjdGlvblNwYWNlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuQ29vcmRpbmF0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGUyRERpc2NyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuR3JhcGg7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLlNpbmdsZXRvbjsKLWltcG9ydCBvcmcuYXNjYXBlLnJ1bnRpbWUuTm9uR3JhcGhpY1J1bm5lcjsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwuQ29uZGl0aW9uYWw7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLmRhdGEuRGF0YVBvaW50OwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC5kYXRhLkRhdGFQb2ludENvbmNyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC52aXMuQ29sb3JGZWF0dXJlOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC52aXMuQ29sb3JGZWF0dXJlQ29uY3JldGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS52aWV3LnZpcy5DaGFydFZpZXc7Ci1pbXBvcnQgb3JnLmFzY2FwZS52aWV3LnZpcy5HRUZWaWV3OwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuR3JhcGhWaWV3OwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5ydW50aW1lLmV4dGVuc2lvbi5JQWdlbnRDaGlsZDsKIAogLyoqCkBAIC00Niw5ICsxMCw3IEBACiAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSBleHRlbmRzIFNjYXBlCi0JCWltcGxlbWVudHMKLQkJCUlHcmFwaGljc0FkYXB0ZWQgeworcHVibGljIGNsYXNzIERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSB7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTc1LDcgKzEzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgU2NhcGUgZ2FtZVNwYWNlID0gbnVsbDsKKwlwcml2YXRlIE9iamVjdCBnYW1lU3BhY2UgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIwNiw3ICsxNjgsNiBAQAogCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SUFnZW50Q2hpbGQ+KCk7CiAKIAl9Ci0KIAkvL3RvZG8sIG1ha2UgdGhpcyBhIHVzZWZ1bCB2YWx1ZSBmb3IgZXZhbHVhdGluZyBjb21wYXRpYmlsaXR5IG9mIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBnZW5lcmF0ZWQgY2xhc3NlcwogCiAJLyoqCkBAIC0yNjMsNjA3ICsyMjQsNiBAQAogCQl9CiAJfQogCi0Jb3JnLmFzY2FwZS5tb2RlbC5TY2FwZSBwbGF5ZXJTY2FwZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFBsYXllciB0aGF0IHdpbGwgYmUgdXNlZCB0byBwb3B1bGF0ZSB0aGUgcGxheWVyU2NhcGUuCi0JICogT3ZlcmlkZSB0byBjdXN0b21pemUgdGhlIHByb3RvdHlwZSwgZm9yIGV4YW1wbGUgdG8gY2hhbmdlIHRoZSB2aWV3cyBjcmVhdGVkIGZvciBhIG1lbWJlciBzY2FwZS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYXllciBjcmVhdGVQbGF5ZXJQcm90b3R5cGUoKSB7Ci0JCVBsYXllciBwbGF5ZXIgPSBuZXcgUGxheWVyKCk7Ci0JCXBsYXllci5zZXRDb29yZGluYXRlKG5ldyBDb29yZGluYXRlMkREaXNjcmV0ZSgwLCAwKSk7Ci0JCXJldHVybiBwbGF5ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIGludCBuZXh0X3ZtX2lkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IHZtX3VuaXF1ZV9pZDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQ3JlYXRlcyB0aGUgbWVtYmVycyBvZiBEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTY2FwZSgpIHsKLQkJc3VwZXIuY3JlYXRlU2NhcGUoKTsKLQotCQlzZXROYW1lKCJEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEiKTsKLQkJUGxheWVyIHBsYXllclByb3RvID0gY3JlYXRlUGxheWVyUHJvdG90eXBlKCk7Ci0JCXBsYXllclNjYXBlID0gbmV3IFNjYXBlKCk7Ci0JCXBsYXllclNjYXBlLnNldE5hbWUoIlBsYXllcnMiKTsKLQkJcGxheWVyU2NhcGUuc2V0UHJvdG90eXBlQWdlbnQocGxheWVyUHJvdG8pOwotCQlwbGF5ZXJTY2FwZS5zZXRFeGVjdXRpb25PcmRlcihTY2FwZS5SVUxFX09SREVSKTsKLQotCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IHBsYXllclByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCXBsYXllclNjYXBlLnNldFNpemUoZ2V0UGxheWVyQ291bnQoKSk7Ci0JCWdhbWVTcGFjZSA9IG5ldyBTY2FwZShuZXcgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5BcnJheTJEVm9uTmV1bWFubigpKTsKLQkJZ2FtZVNwYWNlLnNldEV4ZWN1dGlvbk9yZGVyKFNjYXBlLlJVTEVfT1JERVIpOwotCQlQbGF5Q2VsbCBwcm90b1BsYXlDZWxsID0gbmV3IFBsYXlDZWxsKCk7Ci0JCWdhbWVTcGFjZS5zZXRQcm90b3R5cGVBZ2VudChwcm90b1BsYXlDZWxsKTsKLQkJZ2FtZVNwYWNlLnNldEV4dGVudChuZXcgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db29yZGluYXRlMkREaXNjcmV0ZSgKLQkJCQlnZXRHYW1lU3BhY2VXaWR0aCgpLCBnZXRHYW1lU3BhY2VIZWlnaHQoKSkpOwotCi0JCWdhbWVTcGFjZS5zZXROYW1lKCJHYW1lIFNwYWNlcyIpOwotCQkoKENvbGxlY3Rpb25TcGFjZSkgZ2FtZVNwYWNlLmdldFNwYWNlKCkpLnNldFBlcmlvZGljKHRydWUpOwotCQlhZGQoZ2FtZVNwYWNlKTsKLQkJb3JnLmFzY2FwZS5tb2RlbC5TY2FwZSBwbGF5Q2VsbFNjYXBlID0gZ2FtZVNwYWNlOwotCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IHByb3RvUGxheUNlbGwuZ2V0Q2hpbGRyZW4oKSkgewotCQkJdG1wLmFkZERhdGFDb2xsZWN0b3JzKHRoaXMpOwotCQl9Ci0KLQkJYWRkKHBsYXllclNjYXBlKTsKLQotCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IHBsYXllclByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCXBsYXllclByb3RvLnNldEhvc3RTY2FwZShnYW1lU3BhY2UpOwotCQlnYW1lU3BhY2UuZ2V0UnVsZXMoKS5jbGVhcigpOwotCi0JCXBsYXllclNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJcGxheWVyU2NhcGUuZ2V0TmFtZSgpICsgIiBQb3B1bGF0aW9uIikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5M0w7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JCQkJCXB1YmxpYyBmaW5hbCBib29sZWFuIG1lZXRzQ29uZGl0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJcGxheWVyU2NhcGUKLQkJCQkuYWRkU3RhdENvbGxlY3RvcihuZXcgb3JnLmFzY2FwZS51dGlsLmRhdGEuU3RhdENvbGxlY3RvckNvbmQoCi0JCQkJCQkiUGxheWVyIGlzIENvb3BlcmF0ZSIpIHsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTg1TDsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBtZWV0c0NvbmRpdGlvbihPYmplY3QgcGxheWVyKSB7Ci0JCQkJCQlyZXR1cm4gKChQbGF5ZXIpIHBsYXllcikuaXNDb29wZXJhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXBsYXllclNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJIlBsYXllciBpcyBub3QgQ29vcGVyYXRlIikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBmaW5hbCBib29sZWFuIG1lZXRzQ29uZGl0aW9uKE9iamVjdCBwbGF5ZXIpIHsKLQkJCQkJCXJldHVybiAhKChQbGF5ZXIpIHBsYXllcikuaXNDb29wZXJhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXBsYXllclNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDU0FNTSgKLQkJCQkJCSJQbGF5ZXIgQWdlIikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0VmFsdWUoT2JqZWN0IHBsYXllcikgewotCQkJCQkJcmV0dXJuICgoUGxheWVyKSBwbGF5ZXIpLmdldEFnZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJcGxheWVyU2NhcGUKLQkJCQkuYWRkU3RhdENvbGxlY3RvcihuZXcgb3JnLmFzY2FwZS51dGlsLmRhdGEuU3RhdENvbGxlY3RvckNTQU1NKAotCQkJCQkJIlBsYXllciBXZWFsdGgiKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4NUw7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHVibGljIGZpbmFsIGRvdWJsZSBnZXRWYWx1ZShPYmplY3QgcGxheWVyKSB7Ci0JCQkJCQlyZXR1cm4gKChQbGF5ZXIpIHBsYXllcikuZ2V0V2VhbHRoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IHBsYXllclByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCXBsYXllclNjYXBlLmFkZEluaXRpYWxSdWxlKG5ldyBSdWxlKCJJbml0aWFsaXplIikgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTgyTDsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShBZ2VudCBhKSB7Ci0JCQkJKChlZHUuYnJvb2suUGxheWVyKSBhKS5pbnRpYWxpemVOb25GcmFtZXdvcmsoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcGxheWVyU2NhcGUuYWRkSW5pdGlhbFJ1bGUobmV3IFJ1bGUoIk1vdmUgVG8gUmFuZG9tIExvY2F0aW9uIikgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTgyTDsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShBZ2VudCBhKSB7Ci0JCQkJKChlZHUuYnJvb2suUGxheWVyKSBhKS5tb3ZlVG9SYW5kb21Mb2NhdGlvbigpOwotCQkJfQotCQl9KTsKLQkJcGxheWVyU2NhcGUuYWRkUnVsZShuZXcgUnVsZSgiUmFuZG9tIFdhbGsiKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODFMOwotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEFnZW50IGEpIHsKLQkJCQkoKGVkdS5icm9vay5QbGF5ZXIpIGEpLnJhbmRvbVdhbGsoKTsKLQkJCX0KLQkJfSk7Ci0JCXBsYXllclNjYXBlLmFkZFJ1bGUobmV3IFJ1bGUoIlBsYXkgTmVpZ2hib3IiKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODFMOwotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEFnZW50IGEpIHsKLQkJCQkoKGVkdS5icm9vay5QbGF5ZXIpIGEpLnBsYXlOZWlnaGJvcigpOwotCQkJfQotCQl9KTsKLQkJcGxheWVyU2NhcGUuYWRkUnVsZShuZXcgUnVsZSgiVXBkYXRlIEFnZSIpIHsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4MUw7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQWdlbnQgYSkgewotCQkJCSgoZWR1LmJyb29rLlBsYXllcikgYSkudXBkYXRlQWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlwbGF5ZXJTY2FwZS5hZGRSdWxlKG5ldyBSdWxlKCJGaXNzaW9uIFJ1bGUiKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODFMOwotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEFnZW50IGEpIHsKLQkJCQkoKGVkdS5icm9vay5QbGF5ZXIpIGEpLmZpc3Npb25SdWxlKCk7Ci0JCQl9Ci0JCX0pOwotCQlwbGF5ZXJTY2FwZS5hZGRSdWxlKG5ldyBSdWxlKCJEaWUgQXQgQWdlIikgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTgxTDsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShBZ2VudCBhKSB7Ci0JCQkJKChlZHUuYnJvb2suUGxheWVyKSBhKS5kaWVBdEFnZSgpOwotCQkJfQotCQl9KTsKLQkJcGxheWVyU2NhcGUuYWRkUnVsZShuZXcgUnVsZSgiRGllIEF0IFdlYWx0aCAwIikgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTgxTDsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShBZ2VudCBhKSB7Ci0JCQkJKChlZHUuYnJvb2suUGxheWVyKSBhKS5kaWVBdFdlYWx0aDAoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQl0bXAuYWRkRGF0YUNvbGxlY3RvcnModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIENyZWF0ZXMgVUkgdmlld3MgZm9yIERlbW9ncmFwaGljIFByaXNvbmVyX3MgRGlsZW1tYS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlR3JhcGhpY1ZpZXdzKCkgewotCQlzdXBlci5jcmVhdGVHcmFwaGljVmlld3MoKTsKLQkJY3JlYXRlQ2hhcnRWaWV3cygpOwotCQljcmVhdGUyRFZpZXdzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2NhcGVTZXR1cChTY2FwZUV2ZW50IHNjYXBlRXZlbnQpIHsKLQkJLy9TZXQgdGhlIHNpemUgb2YgdGhlIHNjYXBlIHBvcHVsYXRpb25zLCBlLmcuIGZvciBtdXRhYmxlIHNjYXBlcyB0aGF0IG5lZWQgdG8gaGF2ZSB0aGVpciBzaXplIHJlc2V0Ci0KLQkJcGxheWVyU2NhcGUuc2V0U2l6ZShnZXRQbGF5ZXJDb3VudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFJldHVybnMgdGhlIFNjYXBlIGNvbnRhaW5pbmcgUGxheWVycy4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5hc2NhcGUubW9kZWwuU2NhcGUgZ2V0UGxheWVyU2NhcGUoKSB7Ci0JCXJldHVybiBwbGF5ZXJTY2FwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGFydFZpZXdzKCkgewotCQlDaGFydFZpZXcgY2hhcnQgPSBuZXcgQ2hhcnRWaWV3KCk7Ci0KLQkJZmluYWwgRGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hIHBsYXllclNjYXBlID0gbmV3IERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSgpOwotCQlwbGF5ZXJTY2FwZS5zZXRSdW5uZXIobmV3IE5vbkdyYXBoaWNSdW5uZXIoKSk7Ci0JCVBsYXllciBwbGF5ZXIgPSBuZXcgUGxheWVyKCkgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgRGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hIGdldERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSgpIHsKLQkJCQlyZXR1cm4gcGxheWVyU2NhcGU7Ci0JCQl9Ci0JCX07Ci0JCXBsYXllclNjYXBlLmFkZChwbGF5ZXIpOwotCQlIb3N0Q2VsbCBwbGF5ZXJIb3N0ID0gbmV3IEhvc3RDZWxsKCkgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlKCkgewotCQkJfQotCQl9OwotCQlwbGF5ZXJIb3N0LnNldE9jY3VwYW50KChDZWxsT2NjdXBhbnQpIHBsYXllcik7Ci0KLQkJSUNvbG9yUHJvdmlkZXIgY29vcGVyYXRlRGVmZWN0U3R5bGVDb2xvclByb3ZpZGVyID0gbmV3IENvb3BlcmF0ZURlZmVjdFN0eWxlQ29sb3JQcm92aWRlcigpOwotCi0JCXBsYXllci5zZXRDb29wZXJhdGUodHJ1ZSk7Ci0JCWNoYXJ0LmFkZFNlcmllcygKLQkJCQkiQ291bnQgUGxheWVyIGlzIENvb3BlcmF0ZSIsCi0JCQkJZ2V0SW5mZXJyZWRDaGFydENvbG9yKHBsYXllciwgY29vcGVyYXRlRGVmZWN0U3R5bGVDb2xvclByb3ZpZGVyKSk7Ci0KLQkJcGxheWVyLnNldENvb3BlcmF0ZShmYWxzZSk7Ci0JCWNoYXJ0LmFkZFNlcmllcygKLQkJCQkiQ291bnQgUGxheWVyIGlzIG5vdCBDb29wZXJhdGUiLAotCQkJCWdldEluZmVycmVkQ2hhcnRDb2xvcihwbGF5ZXIsIGNvb3BlcmF0ZURlZmVjdFN0eWxlQ29sb3JQcm92aWRlcikpOwotCi0JCWZpbmFsIERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSBwbGF5Q2VsbFNjYXBlID0gbmV3IERlbW9ncmFwaGljUHJpc29uZXJzRGlsZW1tYSgpOwotCQlwbGF5Q2VsbFNjYXBlLnNldFJ1bm5lcihuZXcgTm9uR3JhcGhpY1J1bm5lcigpKTsKLQkJUGxheUNlbGwgcGxheUNlbGwgPSBuZXcgUGxheUNlbGwoKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGUoKSB7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBEZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEgZ2V0RGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hKCkgewotCQkJCXJldHVybiBwbGF5Q2VsbFNjYXBlOwotCQkJfQotCQl9OwotCQlwbGF5Q2VsbFNjYXBlLmFkZChwbGF5Q2VsbCk7Ci0KLQkJSUNvbG9yUHJvdmlkZXIgcGxheUNlbGxTdHlsZTJEQ29sb3JQcm92aWRlciA9IG5ldyBQbGF5Q2VsbFN0eWxlQ29sb3JQcm92aWRlcigpOwotCQlhZGRWaWV3KGNoYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGUyRFZpZXdzKCkgewotCQlhZGRWaWV3KG5ldyBHRUZWaWV3KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoVmlld3MoKSB7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljc0FkYXB0ZXIgZ2V0R3JhcGhpY3NBZGFwdGVyKCkgewotCQlyZXR1cm4gRGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hR3JhcGhpY3NBZGFwdGVyLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldEluZmVycmVkQ2hhcnRDb2xvcihPYmplY3QgYWdlbnQsCi0JCQlJQ29sb3JQcm92aWRlciBjb2xvclByb3ZpZGVyKSB7Ci0JCUNvbG9yIGNvbG9yID0gY29sb3JQcm92aWRlci5nZXRGb3JlZ3JvdW5kKGFnZW50KTsKLQkJaWYgKGNvbG9yID09IENvbG9yRmVhdHVyZS5CTEFDSykgewotCQkJY29sb3IgPSBDb2xvckZlYXR1cmVDb25jcmV0ZS5jcmVhdGVIU0IoCi0JCQkJCShmbG9hdCkgamF2YS5sYW5nLk1hdGgucmFuZG9tKCkgKiAzNjBmLCAxLjBmLCAwLjhmKTsKLQkJfQotCQlyZXR1cm4gY29sb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQkobmV3IE5vbkdyYXBoaWNSdW5uZXIoKSkKLQkJCQkub3Blbkluc3RhbmNlKCJlZHUuYnJvb2suRGVtb2dyYXBoaWNQcmlzb25lcnNEaWxlbW1hIik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBleGVjdXRlT25NZW1iZXJzKCkgewotCQlpbnQgdGltZVN0ZXAgPSBnZXRSdW5uZXIoKS5nZXRQZXJpb2QoKTsKLQkJc3RhcnRTaW11bGF0aW9uQWdlbnRDaGlsZCh0aW1lU3RlcCk7Ci0KLQkJLy9BIG5vcm1hbCBtb3ZhYmxlIGFnZW50Ci0JCSgoUGxheWVyKSBwbGF5ZXJTY2FwZS5nZXRQcm90b3R5cGVBZ2VudCgpKQotCQkJCS5zdGFydFNpbXVsYXRpb25BZ2VudENoaWxkKHRpbWVTdGVwKTsKLQotCQkvL3RoaXMgaXMgYW4gYWdlbnQgdGhhdCByZXByZXNlbnQgYSBjZWxsIGFuZCBjYW5ub3QgbW92ZS4KLQotCQkoKFBsYXlDZWxsKSBnYW1lU3BhY2UuZ2V0UHJvdG90eXBlQWdlbnQoKSkKLQkJCQkuc3RhcnRTaW11bGF0aW9uQWdlbnRDaGlsZCh0aW1lU3RlcCk7Ci0KLQkJc3VwZXIuZXhlY3V0ZU9uTWVtYmVycygpOwotCQljYWxjdWxhdGVUaW1lU3RlcCh0aW1lU3RlcCk7Ci0KLQkJLy9BIG5vcm1hbCBtb3ZhYmxlIGFnZW50Ci0JCSgoUGxheWVyKSBwbGF5ZXJTY2FwZS5nZXRQcm90b3R5cGVBZ2VudCgpKS5jYWxjdWxhdGVUaW1lU3RlcCh0aW1lU3RlcCk7Ci0KLQkJLy90aGlzIGlzIGFuIGFnZW50IHRoYXQgcmVwcmVzZW50IGEgY2VsbCBhbmQgY2Fubm90IG1vdmUuCi0KLQkJKChQbGF5Q2VsbCkgZ2FtZVNwYWNlLmdldFByb3RvdHlwZUFnZW50KCkpLmNhbGN1bGF0ZVRpbWVTdGVwKHRpbWVTdGVwKTsKLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCi0JcHVibGljIHZvaWQgc3RhcnRTaW11bGF0aW9uQWdlbnRDaGlsZChpbnQgdGltZVN0ZXApIHsKLQkJaWYgKHRpbWVTdGVwID09IGdldFJvb3QoKS5nZXRSdW5uZXIoKS5nZXRFYXJsaWVzdFBlcmlvZCgpKSB7Ci0JCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IGNoaWxkcmVuKSB7Ci0JCQkJdG1wLnN0YXJ0U2ltdWxhdGlvbih0aW1lU3RlcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZVRpbWVTdGVwKGludCB0aW1lU3RlcCkgewotCQlmb3IgKElBZ2VudENoaWxkIHRtcCA6IGNoaWxkcmVuKSB7Ci0JCQl0bXAuY2FsY3VsYXRlKHRpbWVTdGVwKTsKLQkJfQotCX0KLQogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogR2V0cyB0aGUgUGxheWVyIENvdW50IHByb3BlcnR5IGZvciBEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEuCkBAIC0xMjYyLDcgKzYyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBTY2FwZSBnZXRHYW1lU3BhY2UoKSB7CisJcHVibGljIE9iamVjdCBnZXRHYW1lU3BhY2UoKSB7CiAJCXJldHVybiBnYW1lU3BhY2U7CiAJfQogCkBAIC0xMjc0LDIxICs2MzQsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHYW1lU3BhY2UoU2NhcGUgX2dhbWVTcGFjZSkgeworCXB1YmxpYyB2b2lkIHNldEdhbWVTcGFjZShPYmplY3QgX2dhbWVTcGFjZSkgewogCQlnYW1lU3BhY2UgPSBfZ2FtZVNwYWNlOwogCX0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuICJEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEgIiArIGdldFVJRCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9lZHUvYnJvb2svUGxheUNlbGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9QbGF5Q2VsbC5qYXZhCmluZGV4IDQzYTQ0MTcuLjgwMGM2ZDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9QbGF5Q2VsbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9QbGF5Q2VsbC5qYXZhCkBAIC0xLDQxICsxLDUgQEAKIHBhY2thZ2UgZWR1LmJyb29rOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hZ2YuSUdyYXBoaWNzQWRhcHRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYWdmLklHcmFwaGljc0FkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQWdlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5DZWxsOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbE9jY3VwYW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuSG9zdENlbGw7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5Mb2NhdGVkQWdlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5TY2FwZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLmV2ZW50LlNjYXBlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ydWxlLlJ1bGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ydWxlLkV4ZWN1dGVUaGVuVXBkYXRlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuQ29sbGVjdGlvblNwYWNlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuQ29vcmRpbmF0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGUyRERpc2NyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuR3JhcGg7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLlNpbmdsZXRvbjsKLWltcG9ydCBvcmcuYXNjYXBlLnJ1bnRpbWUuTm9uR3JhcGhpY1J1bm5lcjsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwuQ29uZGl0aW9uYWw7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLmRhdGEuRGF0YVBvaW50OwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC5kYXRhLkRhdGFQb2ludENvbmNyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC52aXMuQ29sb3JGZWF0dXJlOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC52aXMuQ29sb3JGZWF0dXJlQ29uY3JldGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS52aWV3LnZpcy5DaGFydFZpZXc7Ci1pbXBvcnQgb3JnLmFzY2FwZS52aWV3LnZpcy5HRUZWaWV3OwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuR3JhcGhWaWV3OwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5ydW50aW1lLmV4dGVuc2lvbi5JQWdlbnRDaGlsZDsKIAogLyoqCkBAIC00Niw3ICsxMCw3IEBACiAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFBsYXlDZWxsIGV4dGVuZHMgSG9zdENlbGwgeworcHVibGljIGNsYXNzIFBsYXlDZWxsIHsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMzIsNTUgKzk2LDQgQEAKIAkJfQogCX0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEgZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpIHsKLQkJcmV0dXJuIChEZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEpIGdldFNjYXBlKCkuZ2V0U2NhcGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHN0YXJ0U2ltdWxhdGlvbkFnZW50Q2hpbGQoaW50IHRpbWVTdGVwKSB7Ci0JCWlmICh0aW1lU3RlcCA9PSBnZXRSb290KCkuZ2V0UnVubmVyKCkuZ2V0RWFybGllc3RQZXJpb2QoKSkgewotCQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBjaGlsZHJlbikgewotCQkJCXRtcC5zdGFydFNpbXVsYXRpb24odGltZVN0ZXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGVUaW1lU3RlcChpbnQgdGltZVN0ZXApIHsKLQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBjaGlsZHJlbikgewotCQkJdG1wLmNhbGN1bGF0ZSh0aW1lU3RlcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiAiUGxheSBDZWxsICIgKyBnZXRVSUQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vZWR1L2Jyb29rL1BsYXllci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vZWR1L2Jyb29rL1BsYXllci5qYXZhCmluZGV4IDMyOTAwYTIuLjQwMjNkMmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL2VkdS9icm9vay9QbGF5ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9lZHUvYnJvb2svUGxheWVyLmphdmEKQEAgLTEsNDEgKzEsNSBAQAogcGFja2FnZSBlZHUuYnJvb2s7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFnZi5JR3JhcGhpY3NBZGFwdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hZ2YuSUdyYXBoaWNzQWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5BZ2VudDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkNlbGw7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5DZWxsT2NjdXBhbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5Ib3N0Q2VsbDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkxvY2F0ZWRBZ2VudDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLlNjYXBlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuZXZlbnQuU2NhcGVFdmVudDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnJ1bGUuUnVsZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnJ1bGUuRXhlY3V0ZVRoZW5VcGRhdGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db2xsZWN0aW9uU3BhY2U7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db29yZGluYXRlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuQ29vcmRpbmF0ZTJERGlzY3JldGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5HcmFwaDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuU2luZ2xldG9uOwotaW1wb3J0IG9yZy5hc2NhcGUucnVudGltZS5Ob25HcmFwaGljUnVubmVyOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC5Db25kaXRpb25hbDsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwuZGF0YS5EYXRhUG9pbnQ7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLmRhdGEuRGF0YVBvaW50Q29uY3JldGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLnZpcy5Db2xvckZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLnZpcy5Db2xvckZlYXR1cmVDb25jcmV0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLnZpZXcudmlzLkNoYXJ0VmlldzsKLWltcG9ydCBvcmcuYXNjYXBlLnZpZXcudmlzLkdFRlZpZXc7Ci1pbXBvcnQgb3JnLmFzY2FwZS52aWV3LnZpcy5HcmFwaFZpZXc7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLnJ1bnRpbWUuZXh0ZW5zaW9uLklBZ2VudENoaWxkOwogCiAvKioKQEAgLTQ2LDcgKzEwLDcgQEAKICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgUGxheWVyIGV4dGVuZHMgQ2VsbE9jY3VwYW50IHsKK3B1YmxpYyBjbGFzcyBQbGF5ZXIgewogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE1Niw0NCArMTIwLDYgQEAKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEgZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpIHsKLQkJcmV0dXJuIChEZW1vZ3JhcGhpY1ByaXNvbmVyc0RpbGVtbWEpIGdldFNjYXBlKCkuZ2V0U2NhcGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHN0YXJ0U2ltdWxhdGlvbkFnZW50Q2hpbGQoaW50IHRpbWVTdGVwKSB7Ci0JCWlmICh0aW1lU3RlcCA9PSBnZXRSb290KCkuZ2V0UnVubmVyKCkuZ2V0RWFybGllc3RQZXJpb2QoKSkgewotCQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBjaGlsZHJlbikgewotCQkJCXRtcC5zdGFydFNpbXVsYXRpb24odGltZVN0ZXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGVUaW1lU3RlcChpbnQgdGltZVN0ZXApIHsKLQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBjaGlsZHJlbikgewotCQkJdG1wLmNhbGN1bGF0ZSh0aW1lU3RlcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIEluaXRpYWxpemUgSW5pdGlhbGl6YXRpb24uIEV4ZWN1dGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG1vZGVsIHJ1bi4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC0yMDIsNyArMTI4LDcgQEAKIAkJc2V0V2VhbHRoKGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRJbml0aWFsV2VhbHRoKCkpOwogCQlpbnQgcmFuZG9tVG9NYXhBZ2UgPSByYW5kb21Ub0xpbWl0KGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQogCQkJCS5nZXRNYXhpbXVtQWdlKCkpOwotCQlib29sZWFuIHJhbmRvbVN0cmF0ZWd5ID0gZ2V0UmFuZG9tKCkubmV4dEJvb2xlYW4oKTsKKwkJYm9vbGVhbiByYW5kb21TdHJhdGVneSA9IHRydWU7CiAJCXNldEFnZShyYW5kb21Ub01heEFnZSk7CiAJCXNldENvb3BlcmF0ZShyYW5kb21TdHJhdGVneSk7CiAJfQpAQCAtMjEzLDE1ICsxMzksMTEgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIHZvaWQgbW92ZVRvUmFuZG9tTG9jYXRpb24oKSB7Ci0JCVBsYXlDZWxsIHJhbmRvbUNlbGwyID0gKFBsYXlDZWxsKSAoKG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuRGlzY3JldGUpIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCS5nZXRHYW1lU3BhY2UoKS5nZXRTcGFjZSgpKS5maW5kUmFuZG9tQXZhaWxhYmxlKCk7Ci0JCWlmIChyYW5kb21DZWxsMiAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0SG9zdFNjYXBlKCkgIT0gKChBZ2VudCkgcmFuZG9tQ2VsbDIpLmdldFNjYXBlKCkpIHsKLQkJCQlkaWUoKTsKLQkJCQlnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGxheWVyU2NhcGUoKS5hZGQodGhpcyk7Ci0JCQl9Ci0JCQltb3ZlVG8ocmFuZG9tQ2VsbDIpOwotCQl9CisJCS8qCisJCVNwYXRpYWwgRnVuY3Rpb25zOgorCQlbYXZhaWxhYmxlXQorCQkgKi8KKwkJUGxheUNlbGwgcmFuZG9tQ2VsbDIgPSBuZXcgUGxheUNlbGwoKTsKIAl9CiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzMCwxNyArMTUyLDExIEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyB2b2lkIHJhbmRvbVdhbGsoKSB7Ci0JCVBsYXlDZWxsIHJhbmRvbU5laWdoYm9yID0gKFBsYXlDZWxsKSAoKG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuRGlzY3JldGUpIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCS5nZXRHYW1lU3BhY2UoKS5nZXRTcGFjZSgpKQotCQkJCS5maW5kUmFuZG9tQXZhaWxhYmxlTmVpZ2hib3IoKChvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudCkgdGhpcykKLQkJCQkJCS5nZXRIb3N0Q2VsbCgpKTsKLQkJaWYgKHJhbmRvbU5laWdoYm9yICE9IG51bGwpIHsKLQkJCWlmIChnZXRIb3N0U2NhcGUoKSAhPSAoKEFnZW50KSByYW5kb21OZWlnaGJvcikuZ2V0U2NhcGUoKSkgewotCQkJCWRpZSgpOwotCQkJCWdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRQbGF5ZXJTY2FwZSgpLmFkZCh0aGlzKTsKLQkJCX0KLQkJCW1vdmVUbyhyYW5kb21OZWlnaGJvcik7Ci0JCX0KKwkJLyoKKwkJU3BhdGlhbCBGdW5jdGlvbnM6CisJCVthdmFpbGFibGUsIG5laWdoYm9yXQorCQkgKi8KKwkJUGxheUNlbGwgcmFuZG9tTmVpZ2hib3IgPSBuZXcgUGxheUNlbGwoKTsKIAl9CiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0OSw3NSArMTY1LDQ5IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyB2b2lkIHBsYXlOZWlnaGJvcigpIHsKLQkJQ29uZGl0aW9uYWwgb3RoZXJQbGF5ZXJDb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uYWwoKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBtZWV0c0NvbmRpdGlvbihPYmplY3Qgb3RoZXJQbGF5ZXJDZWxsKSB7Ci0JCQkJaWYgKG90aGVyUGxheWVyQ2VsbCBpbnN0YW5jZW9mIFBsYXllcikgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlQbGF5ZXIgb3RoZXJQbGF5ZXIgPSAoUGxheWVyKSAoKG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuRGlzY3JldGUpIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCS5nZXRHYW1lU3BhY2UoKS5nZXRTcGFjZSgpKS5maW5kUmFuZG9tTmVpZ2hib3IodGhpcywKLQkJCQlvdGhlclBsYXllckNvbmRpdGlvbik7Ci0JCWlmIChvdGhlclBsYXllciAhPSBudWxsKSB7Ci0JCQlpZiAoKG90aGVyUGxheWVyLmlzQ29vcGVyYXRlKCkgJiYgaXNDb29wZXJhdGUoKSkpIHsKLQkJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZDb29wZXJhdGVDb29wZXJhdGUgPSBnZXRXZWFsdGgoKQotCQkJCQkJKyBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGF5b2ZmQ0MoKTsKLQkJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZDb29wZXJhdGVDb29wZXJhdGVDb3B5ID0gb3RoZXJQbGF5ZXIKLQkJCQkJCS5nZXRXZWFsdGgoKQotCQkJCQkJKyBvdGhlclBsYXllci5nZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkKLQkJCQkJCQkJLmdldFBheW9mZkNDKCk7Ci0JCQkJc2V0V2VhbHRoKHZhbHVlV2VhbHRoQWRkUGF5b2ZmQ29vcGVyYXRlQ29vcGVyYXRlKTsKLQkJCQlvdGhlclBsYXllcgotCQkJCQkJLnNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZUNvb3BlcmF0ZUNvcHkpOwotCQkJfQotCQkJaWYgKChvdGhlclBsYXllci5pc0Nvb3BlcmF0ZSgpICYmICFpc0Nvb3BlcmF0ZSgpKSkgewotCQkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdENvb3BlcmF0ZSA9IGdldFdlYWx0aCgpCi0JCQkJCQkrIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRQYXlvZmZEQygpOwotCQkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZURlZmVjdENvcHkgPSBvdGhlclBsYXllcgotCQkJCQkJLmdldFdlYWx0aCgpCi0JCQkJCQkrIG90aGVyUGxheWVyLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCQkJCQkuZ2V0UGF5b2ZmQ0QoKTsKLQkJCQlzZXRXZWFsdGgodmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3RDb29wZXJhdGUpOwotCQkJCW90aGVyUGxheWVyLnNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZURlZmVjdENvcHkpOwotCQkJfQotCQkJaWYgKCghb3RoZXJQbGF5ZXIuaXNDb29wZXJhdGUoKSAmJiBpc0Nvb3BlcmF0ZSgpKSkgewotCQkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZURlZmVjdCA9IGdldFdlYWx0aCgpCi0JCQkJCQkrIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRQYXlvZmZDRCgpOwotCQkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdENvb3BlcmF0ZUNvcHkgPSBvdGhlclBsYXllcgotCQkJCQkJLmdldFdlYWx0aCgpCi0JCQkJCQkrIG90aGVyUGxheWVyLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCQkJCQkuZ2V0UGF5b2ZmREMoKTsKLQkJCQlzZXRXZWFsdGgodmFsdWVXZWFsdGhBZGRQYXlvZmZDb29wZXJhdGVEZWZlY3QpOwotCQkJCW90aGVyUGxheWVyLnNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdENvb3BlcmF0ZUNvcHkpOwotCQkJfQotCQkJaWYgKCghaXNDb29wZXJhdGUoKSAmJiAhb3RoZXJQbGF5ZXIuaXNDb29wZXJhdGUoKSkpIHsKLQkJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3REZWZlY3QgPSBnZXRXZWFsdGgoKQotCQkJCQkJKyBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGF5b2ZmREQoKTsKLQkJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3REZWZlY3RDb3B5ID0gb3RoZXJQbGF5ZXIKLQkJCQkJCS5nZXRXZWFsdGgoKQotCQkJCQkJKyBvdGhlclBsYXllci5nZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkKLQkJCQkJCQkJLmdldFBheW9mZkREKCk7Ci0JCQkJc2V0V2VhbHRoKHZhbHVlV2VhbHRoQWRkUGF5b2ZmRGVmZWN0RGVmZWN0KTsKLQkJCQlvdGhlclBsYXllci5zZXRXZWFsdGgodmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3REZWZlY3RDb3B5KTsKLQkJCX0KKwkJLyoKKwkJU3BhdGlhbCBGdW5jdGlvbnM6CisJCVtuZWlnaGJvcl0KKwkJICovCisJCVBsYXllciBvdGhlclBsYXllciA9IG5ldyBQbGF5ZXIoKTsKKwkJaWYgKChvdGhlclBsYXllci5pc0Nvb3BlcmF0ZSgpICYmIGlzQ29vcGVyYXRlKCkpKSB7CisJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZDb29wZXJhdGVDb29wZXJhdGUgPSBnZXRXZWFsdGgoKQorCQkJCQkrIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRQYXlvZmZDQygpOworCQkJaW50IHZhbHVlV2VhbHRoQWRkUGF5b2ZmQ29vcGVyYXRlQ29vcGVyYXRlQ29weSA9IG90aGVyUGxheWVyCisJCQkJCS5nZXRXZWFsdGgoKQorCQkJCQkrIG90aGVyUGxheWVyLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQorCQkJCQkJCS5nZXRQYXlvZmZDQygpOworCQkJc2V0V2VhbHRoKHZhbHVlV2VhbHRoQWRkUGF5b2ZmQ29vcGVyYXRlQ29vcGVyYXRlKTsKKwkJCW90aGVyUGxheWVyLnNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZUNvb3BlcmF0ZUNvcHkpOworCQl9CisJCWlmICgob3RoZXJQbGF5ZXIuaXNDb29wZXJhdGUoKSAmJiAhaXNDb29wZXJhdGUoKSkpIHsKKwkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdENvb3BlcmF0ZSA9IGdldFdlYWx0aCgpCisJCQkJCSsgZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpLmdldFBheW9mZkRDKCk7CisJCQlpbnQgdmFsdWVXZWFsdGhBZGRQYXlvZmZDb29wZXJhdGVEZWZlY3RDb3B5ID0gb3RoZXJQbGF5ZXIKKwkJCQkJLmdldFdlYWx0aCgpCisJCQkJCSsgb3RoZXJQbGF5ZXIuZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpCisJCQkJCQkJLmdldFBheW9mZkNEKCk7CisJCQlzZXRXZWFsdGgodmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3RDb29wZXJhdGUpOworCQkJb3RoZXJQbGF5ZXIuc2V0V2VhbHRoKHZhbHVlV2VhbHRoQWRkUGF5b2ZmQ29vcGVyYXRlRGVmZWN0Q29weSk7CisJCX0KKwkJaWYgKCghb3RoZXJQbGF5ZXIuaXNDb29wZXJhdGUoKSAmJiBpc0Nvb3BlcmF0ZSgpKSkgeworCQkJaW50IHZhbHVlV2VhbHRoQWRkUGF5b2ZmQ29vcGVyYXRlRGVmZWN0ID0gZ2V0V2VhbHRoKCkKKwkJCQkJKyBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGF5b2ZmQ0QoKTsKKwkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdENvb3BlcmF0ZUNvcHkgPSBvdGhlclBsYXllcgorCQkJCQkuZ2V0V2VhbHRoKCkKKwkJCQkJKyBvdGhlclBsYXllci5nZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkKKwkJCQkJCQkuZ2V0UGF5b2ZmREMoKTsKKwkJCXNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkNvb3BlcmF0ZURlZmVjdCk7CisJCQlvdGhlclBsYXllci5zZXRXZWFsdGgodmFsdWVXZWFsdGhBZGRQYXlvZmZEZWZlY3RDb29wZXJhdGVDb3B5KTsKKwkJfQorCQlpZiAoKCFpc0Nvb3BlcmF0ZSgpICYmICFvdGhlclBsYXllci5pc0Nvb3BlcmF0ZSgpKSkgeworCQkJaW50IHZhbHVlV2VhbHRoQWRkUGF5b2ZmRGVmZWN0RGVmZWN0ID0gZ2V0V2VhbHRoKCkKKwkJCQkJKyBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGF5b2ZmREQoKTsKKwkJCWludCB2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdERlZmVjdENvcHkgPSBvdGhlclBsYXllci5nZXRXZWFsdGgoKQorCQkJCQkrIG90aGVyUGxheWVyLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQorCQkJCQkJCS5nZXRQYXlvZmZERCgpOworCQkJc2V0V2VhbHRoKHZhbHVlV2VhbHRoQWRkUGF5b2ZmRGVmZWN0RGVmZWN0KTsKKwkJCW90aGVyUGxheWVyLnNldFdlYWx0aCh2YWx1ZVdlYWx0aEFkZFBheW9mZkRlZmVjdERlZmVjdENvcHkpOwogCQl9CiAJfQogCS8qKgpAQCAtMzM3LDM5ICsyMjcsMjggQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIHZvaWQgZmlzc2lvblJ1bGUoKSB7Ci0JCWlmIChnZXRXZWFsdGgoKSA+PSBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0Rmlzc2lvbldlYWx0aCgpKSB7Ci0JCQlQbGF5Q2VsbCBiaXJ0aExvY2F0aW9uID0gKFBsYXlDZWxsKSAoKG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuRGlzY3JldGUpIGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCQkuZ2V0R2FtZVNwYWNlKCkuZ2V0U3BhY2UoKSkKLQkJCQkJLmZpbmRSYW5kb21BdmFpbGFibGVOZWlnaGJvcigoKG9yZy5hc2NhcGUubW9kZWwuQ2VsbE9jY3VwYW50KSB0aGlzKQotCQkJCQkJCS5nZXRIb3N0Q2VsbCgpKTsKLQkJCWlmIChiaXJ0aExvY2F0aW9uICE9IG51bGwpIHsKKwkJaWYgKGdldFdlYWx0aCgpID49IGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRGaXNzaW9uV2VhbHRoKCkpIHsgLyoKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCVNwYXRpYWwgRnVuY3Rpb25zOgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJW25laWdoYm9yLCBhdmFpbGFibGVdCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8KKwkJCVBsYXlDZWxsIGJpcnRoTG9jYXRpb24gPSBuZXcgUGxheUNlbGwoKTsKIAotCQkJCVBsYXllciBjcmVhdGVBZ2VudHMgPSAoUGxheWVyKSBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkKLQkJCQkJCS5nZXRQbGF5ZXJTY2FwZSgpLmdldFNwYWNlKCkubmV3TG9jYXRpb24oZmFsc2UpOwotCQkJCWlmIChjcmVhdGVBZ2VudHMuZ2V0SG9zdFNjYXBlKCkgIT0gKChBZ2VudCkgYmlydGhMb2NhdGlvbikKLQkJCQkJCS5nZXRTY2FwZSgpKSB7Ci0JCQkJCWRpZSgpOwotCQkJCQlnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0UGxheWVyU2NhcGUoKS5hZGQoCi0JCQkJCQkJY3JlYXRlQWdlbnRzKTsKLQkJCQl9Ci0JCQkJY3JlYXRlQWdlbnRzLm1vdmVUbyhiaXJ0aExvY2F0aW9uKTsKLQkJCQljcmVhdGVBZ2VudHMuc2V0V2VhbHRoKGdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKQotCQkJCQkJLmdldEluaGVpcml0ZWRXZWFsdGgoKSk7Ci0JCQkJZG91YmxlIHZhbHVlUmFuZG9tVW5pdCA9IGdldFJhbmRvbSgpLm5leHREb3VibGUoKTsKLQkJCQlpbnQgd2VhbHRoQ2hpbGRXZWFsdGggPSBnZXRXZWFsdGgoKQotCQkJCQkJLSBjcmVhdGVBZ2VudHMuZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpCi0JCQkJCQkJCS5nZXRJbmhlaXJpdGVkV2VhbHRoKCk7Ci0JCQkJaWYgKHZhbHVlUmFuZG9tVW5pdCA8IGNyZWF0ZUFnZW50cwotCQkJCQkJLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRNdXRhdGlvblJhdGUoKSkgewotCQkJCQlib29sZWFuIHZhbHVlUmFuZG9tQm9vbGVhbiA9IGdldFJhbmRvbSgpLm5leHRCb29sZWFuKCk7Ci0JCQkJCWNyZWF0ZUFnZW50cy5zZXRDb29wZXJhdGUodmFsdWVSYW5kb21Cb29sZWFuKTsKLQkJCQl9Ci0JCQkJaWYgKCEodmFsdWVSYW5kb21Vbml0IDwgY3JlYXRlQWdlbnRzCi0JCQkJCQkuZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpLmdldE11dGF0aW9uUmF0ZSgpKSkgewotCQkJCQljcmVhdGVBZ2VudHMuc2V0Q29vcGVyYXRlKGlzQ29vcGVyYXRlKCkpOwotCQkJCX0KLQkJCQlzZXRXZWFsdGgod2VhbHRoQ2hpbGRXZWFsdGgpOworCQkJY3JlYXRlQWdlbnRzLnNldFdlYWx0aChnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkKKwkJCQkJLmdldEluaGVpcml0ZWRXZWFsdGgoKSk7CisJCQlkb3VibGUgdmFsdWVSYW5kb21Vbml0ID0gcmFuZG9tVW5pdCgpOworCQkJaW50IHdlYWx0aENoaWxkV2VhbHRoID0gZ2V0V2VhbHRoKCkKKwkJCQkJLSBjcmVhdGVBZ2VudHMuZ2V0RGVtb2dyYXBoaWNQcmlzb25lcl9zRGlsZW1tYSgpCisJCQkJCQkJLmdldEluaGVpcml0ZWRXZWFsdGgoKTsKKwkJCWlmICh2YWx1ZVJhbmRvbVVuaXQgPCBjcmVhdGVBZ2VudHMKKwkJCQkJLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRNdXRhdGlvblJhdGUoKSkgeworCQkJCWJvb2xlYW4gdmFsdWVSYW5kb21Cb29sZWFuID0gdHJ1ZTsKKwkJCQljcmVhdGVBZ2VudHMuc2V0Q29vcGVyYXRlKHZhbHVlUmFuZG9tQm9vbGVhbik7CiAJCQl9CisJCQlpZiAoISh2YWx1ZVJhbmRvbVVuaXQgPCBjcmVhdGVBZ2VudHMKKwkJCQkJLmdldERlbW9ncmFwaGljUHJpc29uZXJfc0RpbGVtbWEoKS5nZXRNdXRhdGlvblJhdGUoKSkpIHsKKwkJCQljcmVhdGVBZ2VudHMuc2V0Q29vcGVyYXRlKGlzQ29vcGVyYXRlKCkpOworCQkJfQorCQkJc2V0V2VhbHRoKHdlYWx0aENoaWxkV2VhbHRoKTsKIAkJfQogCX0KIAkvKioKQEAgLTM4MCw3ICsyNTksNiBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGRpZUF0QWdlKCkgewogCQlpZiAoZ2V0QWdlKCkgPiBnZXREZW1vZ3JhcGhpY1ByaXNvbmVyX3NEaWxlbW1hKCkuZ2V0RGVhdGhBZ2UoKSkgewotCQkJZGllKCk7CiAJCX0KIAl9CiAJLyoqCkBAIC0zOTEsNyArMjY5LDYgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBkaWVBdFdlYWx0aDAoKSB7CiAJCWlmIChnZXRXZWFsdGgoKSA8IDApIHsKLQkJCWRpZSgpOwogCQl9CiAJfQogCS8qKgpAQCAtNDYzLDE3ICszNDAsNCBAQAogCQl3ZWFsdGggPSBfd2VhbHRoOwogCX0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuICJQbGF5ZXIgIiArIGdldFVJRCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL2VwaS9FcGlkZW1pYy5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9lcGkvRXBpZGVtaWMuamF2YQppbmRleCBkZGIwZDA0Li4zNjkzNGI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL2VwaS9FcGlkZW1pYy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL25hbWUvbWlsZXNwYXJrZXIvZXBpL0VwaWRlbWljLmphdmEKQEAgLTEsNDEgKzEsNSBAQAogcGFja2FnZSBuYW1lLm1pbGVzcGFya2VyLmVwaTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYWdmLklHcmFwaGljc0FkYXB0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFnZi5JR3JhcGhpY3NBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkFnZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkhvc3RDZWxsOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuTG9jYXRlZEFnZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuU2NhcGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ldmVudC5TY2FwZUV2ZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5SdWxlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5FeGVjdXRlVGhlblVwZGF0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvbGxlY3Rpb25TcGFjZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db29yZGluYXRlMkREaXNjcmV0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkdyYXBoOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5TaW5nbGV0b247Ci1pbXBvcnQgb3JnLmFzY2FwZS5ydW50aW1lLk5vbkdyYXBoaWNSdW5uZXI7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLkNvbmRpdGlvbmFsOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC5kYXRhLkRhdGFQb2ludDsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwuZGF0YS5EYXRhUG9pbnRDb25jcmV0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwudmlzLkNvbG9yRmVhdHVyZTsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwudmlzLkNvbG9yRmVhdHVyZUNvbmNyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuQ2hhcnRWaWV3OwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuR0VGVmlldzsKLWltcG9ydCBvcmcuYXNjYXBlLnZpZXcudmlzLkdyYXBoVmlldzsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5lc2NhcGUucnVudGltZS5leHRlbnNpb24uSUFnZW50Q2hpbGQ7CiAKIC8qKgpAQCAtNTAsNyArMTQsNyBAQAogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBFcGlkZW1pYyBleHRlbmRzIFNjYXBlIGltcGxlbWVudHMgSUdyYXBoaWNzQWRhcHRlZCB7CitwdWJsaWMgY2xhc3MgRXBpZGVtaWMgewogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE3MCw3ICsxMzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIFNjYXBlIGNpdHkgPSBudWxsOworCXByaXZhdGUgT2JqZWN0IGNpdHkgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIwMSw3ICsxNjUsNiBAQAogCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SUFnZW50Q2hpbGQ+KCk7CiAKIAl9Ci0KIAkvL3RvZG8sIG1ha2UgdGhpcyBhIHVzZWZ1bCB2YWx1ZSBmb3IgZXZhbHVhdGluZyBjb21wYXRpYmlsaXR5IG9mIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBnZW5lcmF0ZWQgY2xhc3NlcwogCiAJLyoqCkBAIC0yNTcsNjQzICsyMjAsNiBAQAogCQl9CiAJfQogCi0Jb3JnLmFzY2FwZS5tb2RlbC5TY2FwZSBpbmRpdmlkdWFsU2NhcGU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBJbmRpdmlkdWFsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBpbmRpdmlkdWFsU2NhcGUuCi0JICogT3ZlcmlkZSB0byBjdXN0b21pemUgdGhlIHByb3RvdHlwZSwgZm9yIGV4YW1wbGUgdG8gY2hhbmdlIHRoZSB2aWV3cyBjcmVhdGVkIGZvciBhIG1lbWJlciBzY2FwZS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluZGl2aWR1YWwgY3JlYXRlSW5kaXZpZHVhbFByb3RvdHlwZSgpIHsKLQkJSW5kaXZpZHVhbCBpbmRpdmlkdWFsID0gbmV3IEluZGl2aWR1YWwoKTsKLQkJaW5kaXZpZHVhbC5zZXRDb29yZGluYXRlKG5ldyBDb29yZGluYXRlMkREaXNjcmV0ZSgwLCAwKSk7Ci0JCXJldHVybiBpbmRpdmlkdWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyBpbnQgbmV4dF92bV9pZDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCB2bV91bmlxdWVfaWQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIENyZWF0ZXMgdGhlIG1lbWJlcnMgb2YgRXBpZGVtaWMuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTY2FwZSgpIHsKLQkJc3VwZXIuY3JlYXRlU2NhcGUoKTsKLQotCQlzZXROYW1lKCJFcGlkZW1pYyIpOwotCQlJbmRpdmlkdWFsIGluZGl2aWR1YWxQcm90byA9IGNyZWF0ZUluZGl2aWR1YWxQcm90b3R5cGUoKTsKLQkJaW5kaXZpZHVhbFNjYXBlID0gbmV3IFNjYXBlKCk7Ci0JCWluZGl2aWR1YWxTY2FwZS5zZXROYW1lKCJJbmRpdmlkdWFscyIpOwotCQlpbmRpdmlkdWFsU2NhcGUuc2V0UHJvdG90eXBlQWdlbnQoaW5kaXZpZHVhbFByb3RvKTsKLQkJaW5kaXZpZHVhbFNjYXBlLnNldEV4ZWN1dGlvbk9yZGVyKFNjYXBlLlJVTEVfT1JERVIpOwotCi0JCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogaW5kaXZpZHVhbFByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCWluZGl2aWR1YWxTY2FwZS5zZXRTaXplKGdldEluZGl2aWR1YWxDb3VudCgpKTsKLQkJY2l0eSA9IG5ldyBTY2FwZShuZXcgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5BcnJheTJERXVjbGlkaWFuKCkpOwotCQljaXR5LnNldEV4ZWN1dGlvbk9yZGVyKFNjYXBlLlJVTEVfT1JERVIpOwotCQlIb3N0Q2VsbCBwcm90b0hvc3RDZWxsID0gbmV3IEhvc3RDZWxsKCk7Ci0JCWNpdHkuc2V0UHJvdG90eXBlQWdlbnQocHJvdG9Ib3N0Q2VsbCk7Ci0JCWNpdHkuc2V0RXh0ZW50KG5ldyBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGUyRERpc2NyZXRlKAotCQkJCWdldENpdHlXaWR0aCgpLCBnZXRDaXR5SGVpZ2h0KCkpKTsKLQotCQljaXR5LnNldE5hbWUoIkNpdHlzIik7Ci0JCSgoQ29sbGVjdGlvblNwYWNlKSBjaXR5LmdldFNwYWNlKCkpLnNldFBlcmlvZGljKGZhbHNlKTsKLQkJYWRkKGNpdHkpOwotCi0JCWFkZChpbmRpdmlkdWFsU2NhcGUpOwotCi0JCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogaW5kaXZpZHVhbFByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCWluZGl2aWR1YWxQcm90by5zZXRIb3N0U2NhcGUoY2l0eSk7Ci0JCWNpdHkuZ2V0UnVsZXMoKS5jbGVhcigpOwotCi0JCWluZGl2aWR1YWxTY2FwZQotCQkJCS5hZGRTdGF0Q29sbGVjdG9yKG5ldyBvcmcuYXNjYXBlLnV0aWwuZGF0YS5TdGF0Q29sbGVjdG9yQ29uZCgKLQkJCQkJCWluZGl2aWR1YWxTY2FwZS5nZXROYW1lKCkgKyAiIFBvcHVsYXRpb24iKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODkzTDsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCQkJcHVibGljIGZpbmFsIGJvb2xlYW4gbWVldHNDb25kaXRpb24oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJaW5kaXZpZHVhbFNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJIkluZGl2aWR1YWwgU3VzY2VwdGlibGUgU3RhdHVzIikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBmaW5hbCBib29sZWFuIG1lZXRzQ29uZGl0aW9uKE9iamVjdCBpbmRpdmlkdWFsKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzRW51bS5zdXNjZXB0aWJsZSA9PSAoKEluZGl2aWR1YWwpIGluZGl2aWR1YWwpCi0JCQkJCQkJCS5nZXRTdGF0dXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWluZGl2aWR1YWxTY2FwZQotCQkJCS5hZGRTdGF0Q29sbGVjdG9yKG5ldyBvcmcuYXNjYXBlLnV0aWwuZGF0YS5TdGF0Q29sbGVjdG9yQ29uZCgKLQkJCQkJCSJJbmRpdmlkdWFsIEV4cG9zZWQgU3RhdHVzIikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBmaW5hbCBib29sZWFuIG1lZXRzQ29uZGl0aW9uKE9iamVjdCBpbmRpdmlkdWFsKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzRW51bS5leHBvc2VkID09ICgoSW5kaXZpZHVhbCkgaW5kaXZpZHVhbCkKLQkJCQkJCQkJLmdldFN0YXR1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5kaXZpZHVhbFNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJIkluZGl2aWR1YWwgQXN5bXB0b20gSW5mZWN0aW91cyBTdGF0dXMiKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4NUw7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHVibGljIGZpbmFsIGJvb2xlYW4gbWVldHNDb25kaXRpb24oT2JqZWN0IGluZGl2aWR1YWwpIHsKLQkJCQkJCXJldHVybiBTdGF0dXNFbnVtLmFzeW1wdG9tSW5mZWN0aW91cyA9PSAoKEluZGl2aWR1YWwpIGluZGl2aWR1YWwpCi0JCQkJCQkJCS5nZXRTdGF0dXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWluZGl2aWR1YWxTY2FwZQotCQkJCS5hZGRTdGF0Q29sbGVjdG9yKG5ldyBvcmcuYXNjYXBlLnV0aWwuZGF0YS5TdGF0Q29sbGVjdG9yQ29uZCgKLQkJCQkJCSJJbmRpdmlkdWFsIFN5bXB0b20gSW5mZWN0aW91cyBTdGF0dXMiKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4NUw7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHVibGljIGZpbmFsIGJvb2xlYW4gbWVldHNDb25kaXRpb24oT2JqZWN0IGluZGl2aWR1YWwpIHsKLQkJCQkJCXJldHVybiBTdGF0dXNFbnVtLnN5bXB0b21JbmZlY3Rpb3VzID09ICgoSW5kaXZpZHVhbCkgaW5kaXZpZHVhbCkKLQkJCQkJCQkJLmdldFN0YXR1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5kaXZpZHVhbFNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJIkluZGl2aWR1YWwgUmVjb3ZlcmVkIFN0YXR1cyIpIHsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTg1TDsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBtZWV0c0NvbmRpdGlvbihPYmplY3QgaW5kaXZpZHVhbCkgewotCQkJCQkJcmV0dXJuIFN0YXR1c0VudW0ucmVjb3ZlcmVkID09ICgoSW5kaXZpZHVhbCkgaW5kaXZpZHVhbCkKLQkJCQkJCQkJLmdldFN0YXR1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5kaXZpZHVhbFNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDb25kKAotCQkJCQkJIkluZGl2aWR1YWwgRGVhZCBTdGF0dXMiKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4NUw7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJCSAqIAotCQkJCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCQkJICogQGdlbmVyYXRlZAotCQkJCQkgKi8KLQkJCQkJcHVibGljIGZpbmFsIGJvb2xlYW4gbWVldHNDb25kaXRpb24oT2JqZWN0IGluZGl2aWR1YWwpIHsKLQkJCQkJCXJldHVybiBTdGF0dXNFbnVtLmRlYWQgPT0gKChJbmRpdmlkdWFsKSBpbmRpdmlkdWFsKQotCQkJCQkJCQkuZ2V0U3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpbmRpdmlkdWFsU2NhcGUKLQkJCQkuYWRkU3RhdENvbGxlY3RvcihuZXcgb3JnLmFzY2FwZS51dGlsLmRhdGEuU3RhdENvbGxlY3RvckNTQU1NKAotCQkJCQkJIkluZGl2aWR1YWwgRXhwb3N1cmUgRW5kIFBlcmlvZCIpIHsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTg1TDsKLQotCQkJCQkvKioKLQkJCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCQkJICogCi0JCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCQkgKiBAZ2VuZXJhdGVkCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgZmluYWwgZG91YmxlIGdldFZhbHVlKE9iamVjdCBpbmRpdmlkdWFsKSB7Ci0JCQkJCQlyZXR1cm4gKChJbmRpdmlkdWFsKSBpbmRpdmlkdWFsKS5nZXRFeHBvc3VyZUVuZFBlcmlvZCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJaW5kaXZpZHVhbFNjYXBlCi0JCQkJLmFkZFN0YXRDb2xsZWN0b3IobmV3IG9yZy5hc2NhcGUudXRpbC5kYXRhLlN0YXRDb2xsZWN0b3JDU0FNTSgKLQkJCQkJCSJJbmRpdmlkdWFsIENvbnRhY3QgVHJhbnNtaXNzaW9uIFByb2JhYmlsaXR5IikgewotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODVMOwotCi0JCQkJCS8qKgotCQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCQkgKiAKLQkJCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0VmFsdWUoT2JqZWN0IGluZGl2aWR1YWwpIHsKLQkJCQkJCXJldHVybiAoKEluZGl2aWR1YWwpIGluZGl2aWR1YWwpCi0JCQkJCQkJCS5nZXRDb250YWN0VHJhbnNtaXNzaW9uUHJvYmFiaWxpdHkoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogaW5kaXZpZHVhbFByb3RvLmdldENoaWxkcmVuKCkpIHsKLQkJCXRtcC5hZGREYXRhQ29sbGVjdG9ycyh0aGlzKTsKLQkJfQotCi0JCWluZGl2aWR1YWxTY2FwZS5hZGRJbml0aWFsUnVsZShuZXcgUnVsZSgiSW5pdGlhbGl6ZSBMb2NhdGlvbiIpIHsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4Mkw7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQWdlbnQgYSkgewotCQkJCSgobmFtZS5taWxlc3Bhcmtlci5lcGkuSW5kaXZpZHVhbCkgYSkuaW5pdGlhbGl6ZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQlpbmRpdmlkdWFsU2NhcGUuYWRkUnVsZShuZXcgUnVsZSgiTW92ZW1lbnQiKSB7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NDYxNDQ0NDY0MDIwOTg5ODFMOwotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEFnZW50IGEpIHsKLQkJCQkoKG5hbWUubWlsZXNwYXJrZXIuZXBpLkluZGl2aWR1YWwpIGEpLm1vdmVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWluZGl2aWR1YWxTY2FwZS5hZGRJbml0aWFsUnVsZShuZXcgUnVsZSgiSW5pdGlhbGl6ZSBTdGF0ZSIpIHsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4Mkw7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQWdlbnQgYSkgewotCQkJCSgobmFtZS5taWxlc3Bhcmtlci5lcGkuSW5kaXZpZHVhbCkgYSkuaW5pdGlhbGl6ZVN0YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQlpbmRpdmlkdWFsU2NhcGUuYWRkUnVsZShuZXcgUnVsZSgiVHJhbnNtaXNzaW9uIikgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTgxTDsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShBZ2VudCBhKSB7Ci0JCQkJKChuYW1lLm1pbGVzcGFya2VyLmVwaS5JbmRpdmlkdWFsKSBhKS50cmFuc21pc3Npb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWluZGl2aWR1YWxTY2FwZS5hZGRSdWxlKG5ldyBSdWxlKCJQcm9ncmVzc2lvbiIpIHsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjg0NjE0NDQ0NjQwMjA5ODk4MUw7Ci0KLQkJCS8qKgotCQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJCSAqIAotCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQWdlbnQgYSkgewotCQkJCSgobmFtZS5taWxlc3Bhcmtlci5lcGkuSW5kaXZpZHVhbCkgYSkucHJvZ3Jlc3Npb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9yIChJQWdlbnRDaGlsZCB0bXAgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQl0bXAuYWRkRGF0YUNvbGxlY3RvcnModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIENyZWF0ZXMgVUkgdmlld3MgZm9yIEVwaWRlbWljLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVHcmFwaGljVmlld3MoKSB7Ci0JCXN1cGVyLmNyZWF0ZUdyYXBoaWNWaWV3cygpOwotCQljcmVhdGVDaGFydFZpZXdzKCk7Ci0JCWNyZWF0ZTJEVmlld3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY2FwZVNldHVwKFNjYXBlRXZlbnQgc2NhcGVFdmVudCkgewotCQkvL1NldCB0aGUgc2l6ZSBvZiB0aGUgc2NhcGUgcG9wdWxhdGlvbnMsIGUuZy4gZm9yIG11dGFibGUgc2NhcGVzIHRoYXQgbmVlZCB0byBoYXZlIHRoZWlyIHNpemUgcmVzZXQKLQotCQlpbmRpdmlkdWFsU2NhcGUuc2V0U2l6ZShnZXRJbmRpdmlkdWFsQ291bnQoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBSZXR1cm5zIHRoZSBTY2FwZSBjb250YWluaW5nIEluZGl2aWR1YWxzLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmFzY2FwZS5tb2RlbC5TY2FwZSBnZXRJbmRpdmlkdWFsU2NhcGUoKSB7Ci0JCXJldHVybiBpbmRpdmlkdWFsU2NhcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hhcnRWaWV3cygpIHsKLQkJQ2hhcnRWaWV3IGNoYXJ0ID0gbmV3IENoYXJ0VmlldygpOwotCi0JCWZpbmFsIEVwaWRlbWljIGluZGl2aWR1YWxTY2FwZSA9IG5ldyBFcGlkZW1pYygpOwotCQlpbmRpdmlkdWFsU2NhcGUuc2V0UnVubmVyKG5ldyBOb25HcmFwaGljUnVubmVyKCkpOwotCQlJbmRpdmlkdWFsIGluZGl2aWR1YWwgPSBuZXcgSW5kaXZpZHVhbCgpIHsKLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZSgpIHsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJICogCi0JCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIEVwaWRlbWljIGdldEVwaWRlbWljKCkgewotCQkJCXJldHVybiBpbmRpdmlkdWFsU2NhcGU7Ci0JCQl9Ci0JCX07Ci0JCWluZGl2aWR1YWxTY2FwZS5hZGQoaW5kaXZpZHVhbCk7Ci0JCUhvc3RDZWxsIGluZGl2aWR1YWxIb3N0ID0gbmV3IEhvc3RDZWxsKCkgewotCi0JCQkvKioKLQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkgKiAKLQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlKCkgewotCQkJfQotCQl9OwotCQlpbmRpdmlkdWFsSG9zdC5zZXRPY2N1cGFudCgoQ2VsbE9jY3VwYW50KSBpbmRpdmlkdWFsKTsKLQotCQlJQ29sb3JQcm92aWRlciBpbmRpdmlkdWFsU3R5bGUyRENvbG9yUHJvdmlkZXIgPSBuZXcgSW5kaXZpZHVhbFN0eWxlMkRDb2xvclByb3ZpZGVyKCk7Ci0KLQkJaW5kaXZpZHVhbC5zZXRTdGF0dXMoU3RhdHVzRW51bS5zdXNjZXB0aWJsZSk7Ci0JCWNoYXJ0LmFkZFNlcmllcygKLQkJCQkiQ291bnQgSW5kaXZpZHVhbCBTdXNjZXB0aWJsZSBTdGF0dXMiLAotCQkJCWdldEluZmVycmVkQ2hhcnRDb2xvcihpbmRpdmlkdWFsLAotCQkJCQkJaW5kaXZpZHVhbFN0eWxlMkRDb2xvclByb3ZpZGVyKSk7Ci0KLQkJaW5kaXZpZHVhbC5zZXRTdGF0dXMoU3RhdHVzRW51bS5leHBvc2VkKTsKLQkJY2hhcnQuYWRkU2VyaWVzKAotCQkJCSJDb3VudCBJbmRpdmlkdWFsIEV4cG9zZWQgU3RhdHVzIiwKLQkJCQlnZXRJbmZlcnJlZENoYXJ0Q29sb3IoaW5kaXZpZHVhbCwKLQkJCQkJCWluZGl2aWR1YWxTdHlsZTJEQ29sb3JQcm92aWRlcikpOwotCi0JCWluZGl2aWR1YWwuc2V0U3RhdHVzKFN0YXR1c0VudW0uYXN5bXB0b21JbmZlY3Rpb3VzKTsKLQkJY2hhcnQuYWRkU2VyaWVzKAotCQkJCSJDb3VudCBJbmRpdmlkdWFsIEFzeW1wdG9tIEluZmVjdGlvdXMgU3RhdHVzIiwKLQkJCQlnZXRJbmZlcnJlZENoYXJ0Q29sb3IoaW5kaXZpZHVhbCwKLQkJCQkJCWluZGl2aWR1YWxTdHlsZTJEQ29sb3JQcm92aWRlcikpOwotCi0JCWluZGl2aWR1YWwuc2V0U3RhdHVzKFN0YXR1c0VudW0uc3ltcHRvbUluZmVjdGlvdXMpOwotCQljaGFydC5hZGRTZXJpZXMoCi0JCQkJIkNvdW50IEluZGl2aWR1YWwgU3ltcHRvbSBJbmZlY3Rpb3VzIFN0YXR1cyIsCi0JCQkJZ2V0SW5mZXJyZWRDaGFydENvbG9yKGluZGl2aWR1YWwsCi0JCQkJCQlpbmRpdmlkdWFsU3R5bGUyRENvbG9yUHJvdmlkZXIpKTsKLQotCQlpbmRpdmlkdWFsLnNldFN0YXR1cyhTdGF0dXNFbnVtLnJlY292ZXJlZCk7Ci0JCWNoYXJ0LmFkZFNlcmllcygKLQkJCQkiQ291bnQgSW5kaXZpZHVhbCBSZWNvdmVyZWQgU3RhdHVzIiwKLQkJCQlnZXRJbmZlcnJlZENoYXJ0Q29sb3IoaW5kaXZpZHVhbCwKLQkJCQkJCWluZGl2aWR1YWxTdHlsZTJEQ29sb3JQcm92aWRlcikpOwotCi0JCWluZGl2aWR1YWwuc2V0U3RhdHVzKFN0YXR1c0VudW0uZGVhZCk7Ci0JCWNoYXJ0LmFkZFNlcmllcygKLQkJCQkiQ291bnQgSW5kaXZpZHVhbCBEZWFkIFN0YXR1cyIsCi0JCQkJZ2V0SW5mZXJyZWRDaGFydENvbG9yKGluZGl2aWR1YWwsCi0JCQkJCQlpbmRpdmlkdWFsU3R5bGUyRENvbG9yUHJvdmlkZXIpKTsKLQkJYWRkVmlldyhjaGFydCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlMkRWaWV3cygpIHsKLQkJYWRkVmlldyhuZXcgR0VGVmlldygpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFZpZXdzKCkgewotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY3NBZGFwdGVyIGdldEdyYXBoaWNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIEVwaWRlbWljR3JhcGhpY3NBZGFwdGVyLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldEluZmVycmVkQ2hhcnRDb2xvcihPYmplY3QgYWdlbnQsCi0JCQlJQ29sb3JQcm92aWRlciBjb2xvclByb3ZpZGVyKSB7Ci0JCUNvbG9yIGNvbG9yID0gY29sb3JQcm92aWRlci5nZXRGb3JlZ3JvdW5kKGFnZW50KTsKLQkJaWYgKGNvbG9yID09IENvbG9yRmVhdHVyZS5CTEFDSykgewotCQkJY29sb3IgPSBDb2xvckZlYXR1cmVDb25jcmV0ZS5jcmVhdGVIU0IoCi0JCQkJCShmbG9hdCkgamF2YS5sYW5nLk1hdGgucmFuZG9tKCkgKiAzNjBmLCAxLjBmLCAwLjhmKTsKLQkJfQotCQlyZXR1cm4gY29sb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQkobmV3IE5vbkdyYXBoaWNSdW5uZXIoKSkub3Blbkluc3RhbmNlKCJuYW1lLm1pbGVzcGFya2VyLmVwaS5FcGlkZW1pYyIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQSBzaW1wbGUgbW9kZWwgb2YgZXBpZGVtaWMgZHluYW1pY3MuIFdlIGRlZmluZSBpbmRpdmlkdWFsIGFnZW50cyB3aXRoIGRpZmZlcmVudCBkaXNlYXNlIHN0YXRlcy4gVGhlIHByb2dyZXNzaW9uIG9mIGRpc2Vhc2UgbW92ZXMgZnJvbSBzdWNjZXB0aWJsZSB0byBleHBvc2VkIHRvIGluZmVjdGlvdXMgKGVpdGhlciBzeW1wdG9tYXRpYyBvciBhc3ltcHRvbWF0aWMpIHRvIHNvbWUgb3V0Y29tZSBzdGF0ZS4gQWdlbnRzIGNhbiB0cmFuc21pdCBpbmZlY3Rpb24gdG8gdGhlaXIgaW1tZWRpYXRlIG5laWdoYm9ycy4KLQotCUZvciBzb21lIGJhY2tncm91bmQgb24gdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHNlZSBKb3NodWEgTS4gRXBzdGVpbi4gIkdlbmVyYXRpdmUgU29jaWFsIFNjaWVuY2UiLiAyMDA2LiBQcmluY2V0b24uIAotCi0JQ29weXJpZ2h0IDIwMDksIE1pbGVzIFBhcmtlci4gUmVsZWFzZWQgdW5kZXIgRWNsaXBzZSBQdWJsaWMgTGljZW5zZS4gQWxsIHVzZXMgc2hvdWxkIGJlIGF0dHJpYnV0ZWQuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZU9uTWVtYmVycygpIHsKLQkJaW50IHRpbWVTdGVwID0gZ2V0UnVubmVyKCkuZ2V0UGVyaW9kKCk7Ci0JCXN0YXJ0U2ltdWxhdGlvbkFnZW50Q2hpbGQodGltZVN0ZXApOwotCi0JCS8vQSBub3JtYWwgbW92YWJsZSBhZ2VudAotCQkoKEluZGl2aWR1YWwpIGluZGl2aWR1YWxTY2FwZS5nZXRQcm90b3R5cGVBZ2VudCgpKQotCQkJCS5zdGFydFNpbXVsYXRpb25BZ2VudENoaWxkKHRpbWVTdGVwKTsKLQotCQlzdXBlci5leGVjdXRlT25NZW1iZXJzKCk7Ci0JCWNhbGN1bGF0ZVRpbWVTdGVwKHRpbWVTdGVwKTsKLQotCQkvL0Egbm9ybWFsIG1vdmFibGUgYWdlbnQKLQkJKChJbmRpdmlkdWFsKSBpbmRpdmlkdWFsU2NhcGUuZ2V0UHJvdG90eXBlQWdlbnQoKSkKLQkJCQkuY2FsY3VsYXRlVGltZVN0ZXAodGltZVN0ZXApOwotCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBBIHNpbXBsZSBtb2RlbCBvZiBlcGlkZW1pYyBkeW5hbWljcy4gV2UgZGVmaW5lIGluZGl2aWR1YWwgYWdlbnRzIHdpdGggZGlmZmVyZW50IGRpc2Vhc2Ugc3RhdGVzLiBUaGUgcHJvZ3Jlc3Npb24gb2YgZGlzZWFzZSBtb3ZlcyBmcm9tIHN1Y2NlcHRpYmxlIHRvIGV4cG9zZWQgdG8gaW5mZWN0aW91cyAoZWl0aGVyIHN5bXB0b21hdGljIG9yIGFzeW1wdG9tYXRpYykgdG8gc29tZSBvdXRjb21lIHN0YXRlLiBBZ2VudHMgY2FuIHRyYW5zbWl0IGluZmVjdGlvbiB0byB0aGVpciBpbW1lZGlhdGUgbmVpZ2hib3JzLgotCi0JRm9yIHNvbWUgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgc2VlIEpvc2h1YSBNLiBFcHN0ZWluLiAiR2VuZXJhdGl2ZSBTb2NpYWwgU2NpZW5jZSIuIDIwMDYuIFByaW5jZXRvbi4gCi0KLQlDb3B5cmlnaHQgMjAwOSwgTWlsZXMgUGFya2VyLiBSZWxlYXNlZCB1bmRlciBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLiBBbGwgdXNlcyBzaG91bGQgYmUgYXR0cmlidXRlZC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzdGFydFNpbXVsYXRpb25BZ2VudENoaWxkKGludCB0aW1lU3RlcCkgewotCQlpZiAodGltZVN0ZXAgPT0gZ2V0Um9vdCgpLmdldFJ1bm5lcigpLmdldEVhcmxpZXN0UGVyaW9kKCkpIHsKLQkJCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogY2hpbGRyZW4pIHsKLQkJCQl0bXAuc3RhcnRTaW11bGF0aW9uKHRpbWVTdGVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQSBzaW1wbGUgbW9kZWwgb2YgZXBpZGVtaWMgZHluYW1pY3MuIFdlIGRlZmluZSBpbmRpdmlkdWFsIGFnZW50cyB3aXRoIGRpZmZlcmVudCBkaXNlYXNlIHN0YXRlcy4gVGhlIHByb2dyZXNzaW9uIG9mIGRpc2Vhc2UgbW92ZXMgZnJvbSBzdWNjZXB0aWJsZSB0byBleHBvc2VkIHRvIGluZmVjdGlvdXMgKGVpdGhlciBzeW1wdG9tYXRpYyBvciBhc3ltcHRvbWF0aWMpIHRvIHNvbWUgb3V0Y29tZSBzdGF0ZS4gQWdlbnRzIGNhbiB0cmFuc21pdCBpbmZlY3Rpb24gdG8gdGhlaXIgaW1tZWRpYXRlIG5laWdoYm9ycy4KLQotCUZvciBzb21lIGJhY2tncm91bmQgb24gdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHNlZSBKb3NodWEgTS4gRXBzdGVpbi4gIkdlbmVyYXRpdmUgU29jaWFsIFNjaWVuY2UiLiAyMDA2LiBQcmluY2V0b24uIAotCi0JQ29weXJpZ2h0IDIwMDksIE1pbGVzIFBhcmtlci4gUmVsZWFzZWQgdW5kZXIgRWNsaXBzZSBQdWJsaWMgTGljZW5zZS4gQWxsIHVzZXMgc2hvdWxkIGJlIGF0dHJpYnV0ZWQuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlVGltZVN0ZXAoaW50IHRpbWVTdGVwKSB7Ci0JCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogY2hpbGRyZW4pIHsKLQkJCXRtcC5jYWxjdWxhdGUodGltZVN0ZXApOwotCQl9Ci0JfQotCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBHZXRzIHRoZSBJbmRpdmlkdWFsIENvdW50IHByb3BlcnR5IGZvciBFcGlkZW1pYy4KQEAgLTEyNzIsNyArNTk4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFNjYXBlIGdldENpdHkoKSB7CisJcHVibGljIE9iamVjdCBnZXRDaXR5KCkgewogCQlyZXR1cm4gY2l0eTsKIAl9CiAKQEAgLTEyODQsMjEgKzYxMCw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyB2b2lkIHNldENpdHkoU2NhcGUgX2NpdHkpIHsKKwlwdWJsaWMgdm9pZCBzZXRDaXR5KE9iamVjdCBfY2l0eSkgewogCQljaXR5ID0gX2NpdHk7CiAJfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIkVwaWRlbWljICIgKyBnZXRVSUQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9lcGkvSW5kaXZpZHVhbC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9lcGkvSW5kaXZpZHVhbC5qYXZhCmluZGV4IGIyYTJiMTYuLjFiODY0MWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL25hbWUvbWlsZXNwYXJrZXIvZXBpL0luZGl2aWR1YWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL2VwaS9JbmRpdmlkdWFsLmphdmEKQEAgLTEsNDEgKzEsNSBAQAogcGFja2FnZSBuYW1lLm1pbGVzcGFya2VyLmVwaTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYWdmLklHcmFwaGljc0FkYXB0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFnZi5JR3JhcGhpY3NBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkFnZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudDsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkhvc3RDZWxsOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuTG9jYXRlZEFnZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuU2NhcGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ldmVudC5TY2FwZUV2ZW50OwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5SdWxlOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5FeGVjdXRlVGhlblVwZGF0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvbGxlY3Rpb25TcGFjZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGU7Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db29yZGluYXRlMkREaXNjcmV0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkdyYXBoOwotaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5TaW5nbGV0b247Ci1pbXBvcnQgb3JnLmFzY2FwZS5ydW50aW1lLk5vbkdyYXBoaWNSdW5uZXI7Ci1pbXBvcnQgb3JnLmFzY2FwZS51dGlsLkNvbmRpdGlvbmFsOwotaW1wb3J0IG9yZy5hc2NhcGUudXRpbC5kYXRhLkRhdGFQb2ludDsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwuZGF0YS5EYXRhUG9pbnRDb25jcmV0ZTsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwudmlzLkNvbG9yRmVhdHVyZTsKLWltcG9ydCBvcmcuYXNjYXBlLnV0aWwudmlzLkNvbG9yRmVhdHVyZUNvbmNyZXRlOwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuQ2hhcnRWaWV3OwotaW1wb3J0IG9yZy5hc2NhcGUudmlldy52aXMuR0VGVmlldzsKLWltcG9ydCBvcmcuYXNjYXBlLnZpZXcudmlzLkdyYXBoVmlldzsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5lc2NhcGUucnVudGltZS5leHRlbnNpb24uSUFnZW50Q2hpbGQ7CiAKIC8qKgpAQCAtNDYsNyArMTAsNyBAQAogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBJbmRpdmlkdWFsIGV4dGVuZHMgQ2VsbE9jY3VwYW50IHsKK3B1YmxpYyBjbGFzcyBJbmRpdmlkdWFsIHsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xNzAsNTggKzEzNCwxNiBAQAogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVwaWRlbWljIGdldEVwaWRlbWljKCkgewotCQlyZXR1cm4gKEVwaWRlbWljKSBnZXRTY2FwZSgpLmdldFNjYXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzdGFydFNpbXVsYXRpb25BZ2VudENoaWxkKGludCB0aW1lU3RlcCkgewotCQlpZiAodGltZVN0ZXAgPT0gZ2V0Um9vdCgpLmdldFJ1bm5lcigpLmdldEVhcmxpZXN0UGVyaW9kKCkpIHsKLQkJCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogY2hpbGRyZW4pIHsKLQkJCQl0bXAuc3RhcnRTaW11bGF0aW9uKHRpbWVTdGVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlVGltZVN0ZXAoaW50IHRpbWVTdGVwKSB7Ci0JCWZvciAoSUFnZW50Q2hpbGQgdG1wIDogY2hpbGRyZW4pIHsKLQkJCXRtcC5jYWxjdWxhdGUodGltZVN0ZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBJbml0aWFsaXplIExvY2F0aW9uIEluaXRpYWxpemF0aW9uLiBFeGVjdXRlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBtb2RlbCBydW4uCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVMb2NhdGlvbigpIHsKLQkJT2JqZWN0IGNpdHlMb2NhdGlvbiA9IChPYmplY3QpICgob3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5EaXNjcmV0ZSkgZ2V0RXBpZGVtaWMoKQotCQkJCS5nZXRDaXR5KCkuZ2V0U3BhY2UoKSkuZmluZFJhbmRvbUF2YWlsYWJsZSgpOwotCQlpZiAoY2l0eUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWlmIChnZXRIb3N0U2NhcGUoKSAhPSAoKEFnZW50KSBjaXR5TG9jYXRpb24pLmdldFNjYXBlKCkpIHsKLQkJCQlkaWUoKTsKLQkJCQlnZXRFcGlkZW1pYygpLmdldEluZGl2aWR1YWxTY2FwZSgpLmFkZCh0aGlzKTsKLQkJCX0KLQkJCW1vdmVUbygoKEhvc3RDZWxsKSBjaXR5TG9jYXRpb24pKTsKLQkJfQorCQkvKgorCQlTcGF0aWFsIEZ1bmN0aW9uczoKKwkJW2F2YWlsYWJsZV0KKwkJICovCisJCU9iamVjdCBjaXR5TG9jYXRpb24gPSBuZXcgT2JqZWN0KCk7CiAJfQogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMzAsMjIgKzE1MiwxNSBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBtb3ZlbWVudCgpIHsKLQkJZG91YmxlIG1vdmVtZW50RHJhdyA9IGdldFJhbmRvbSgpLm5leHREb3VibGUoKTsKKwkJZG91YmxlIG1vdmVtZW50RHJhdyA9IHJhbmRvbVVuaXQoKTsKIAkJaWYgKChnZXRTdGF0dXMoKSAhPSBTdGF0dXNFbnVtLmRlYWQKIAkJCQkmJiBtb3ZlbWVudERyYXcgPCBnZXRFcGlkZW1pYygpLmdldE1vdmVtZW50UHJvYmFiaWxpdHkoKQogCQkJCSYmIGdldFN0YXR1cygpICE9IFN0YXR1c0VudW0uc3ltcHRvbUluZmVjdGlvdXMgJiYgbW92ZW1lbnREcmF3IDwgZ2V0RXBpZGVtaWMoKQotCQkJCS5nZXRNb3ZlbWVudFByb2JhYmlsaXR5KCkpKSB7Ci0JCQlPYmplY3QgbmVpZ2hib3JpbmdMb2NhdGlvbiA9IChPYmplY3QpICgob3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5EaXNjcmV0ZSkgZ2V0RXBpZGVtaWMoKQotCQkJCQkuZ2V0Q2l0eSgpLmdldFNwYWNlKCkpCi0JCQkJCS5maW5kUmFuZG9tQXZhaWxhYmxlTmVpZ2hib3IoKChvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudCkgdGhpcykKLQkJCQkJCQkuZ2V0SG9zdENlbGwoKSk7Ci0JCQlpZiAobmVpZ2hib3JpbmdMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGdldEhvc3RTY2FwZSgpICE9ICgoQWdlbnQpIG5laWdoYm9yaW5nTG9jYXRpb24pLmdldFNjYXBlKCkpIHsKLQkJCQkJZGllKCk7Ci0JCQkJCWdldEVwaWRlbWljKCkuZ2V0SW5kaXZpZHVhbFNjYXBlKCkuYWRkKHRoaXMpOwotCQkJCX0KLQkJCQltb3ZlVG8oKChIb3N0Q2VsbCkgbmVpZ2hib3JpbmdMb2NhdGlvbikpOwotCQkJfQorCQkJCS5nZXRNb3ZlbWVudFByb2JhYmlsaXR5KCkpKSB7IC8qCisJCQkJCQkJCQkJCQlTcGF0aWFsIEZ1bmN0aW9uczoKKwkJCQkJCQkJCQkJCVthdmFpbGFibGUsIG5laWdoYm9yXQorCQkJCQkJCQkJCQkJICovCisJCQlPYmplY3QgbmVpZ2hib3JpbmdMb2NhdGlvbiA9IG5ldyBPYmplY3QoKTsKIAkJfQogCX0KIAkvKioKQEAgLTI1NSw3ICsxNzAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplU3RhdGUoKSB7Ci0JCWRvdWJsZSBpbmZlY3Rpb25EcmF3ID0gZ2V0UmFuZG9tKCkubmV4dERvdWJsZSgpOworCQlkb3VibGUgaW5mZWN0aW9uRHJhdyA9IHJhbmRvbVVuaXQoKTsKIAkJZG91YmxlIGluZGl2aWR1YWxUcmFuc21pc3Npb25SYXRlID0gcmFuZG9tSW5SYW5nZShnZXRFcGlkZW1pYygpCiAJCQkJLmdldE1pbkNvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eSgpLCBnZXRFcGlkZW1pYygpCiAJCQkJLmdldE1heENvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eSgpKTsKQEAgLTI3MSw0MSArMTg2LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyB2b2lkIHRyYW5zbWlzc2lvbigpIHsKLQkJaWYgKChnZXRTdGF0dXMoKSA9PSBTdGF0dXNFbnVtLnN5bXB0b21JbmZlY3Rpb3VzIHx8IGdldFN0YXR1cygpID09IFN0YXR1c0VudW0uYXN5bXB0b21JbmZlY3Rpb3VzKSkgewotCQkJQ29uZGl0aW9uYWwgcG90ZW50aWFsRXhwb3N1cmVDb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uYWwoKSB7Ci0KLQkJCQkvKioKLQkJCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkJCSAqIAotCQkJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkJCSAqIEBnZW5lcmF0ZWQKLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODQ2MTQ0NDQ2NDAyMDk4OTg1TDsKLQotCQkJCS8qKgotCQkJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCQkJICogCi0JCQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCQkJICogQGdlbmVyYXRlZAotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIG1lZXRzQ29uZGl0aW9uKE9iamVjdCBwb3RlbnRpYWxFeHBvc3VyZUNlbGwpIHsKLQkJCQkJaWYgKHBvdGVudGlhbEV4cG9zdXJlQ2VsbCBpbnN0YW5jZW9mIEluZGl2aWR1YWwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCUluZGl2aWR1YWwgcG90ZW50aWFsRXhwb3N1cmUgPSAoSW5kaXZpZHVhbCkgKChvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkRpc2NyZXRlKSBnZXRFcGlkZW1pYygpCi0JCQkJCS5nZXRDaXR5KCkuZ2V0U3BhY2UoKSkuZmluZFJhbmRvbU5laWdoYm9yKHRoaXMsCi0JCQkJCXBvdGVudGlhbEV4cG9zdXJlQ29uZGl0aW9uKTsKLQkJCWlmIChwb3RlbnRpYWxFeHBvc3VyZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHBvdGVudGlhbEV4cG9zdXJlLmdldFN0YXR1cygpID09IFN0YXR1c0VudW0uc3VzY2VwdGlibGUpIHsKLQkJCQkJZG91YmxlIHRyYW5zbWlzc2lvbkRyYXcgPSBnZXRSYW5kb20oKS5uZXh0RG91YmxlKCk7Ci0JCQkJCWlmICh0cmFuc21pc3Npb25EcmF3IDwgcG90ZW50aWFsRXhwb3N1cmUKLQkJCQkJCQkuZ2V0Q29udGFjdFRyYW5zbWlzc2lvblByb2JhYmlsaXR5KCkpIHsKLQkJCQkJCXBvdGVudGlhbEV4cG9zdXJlLnNldFN0YXR1cyhTdGF0dXNFbnVtLmV4cG9zZWQpOwotCQkJCQl9CisJCWlmICgoZ2V0U3RhdHVzKCkgPT0gU3RhdHVzRW51bS5zeW1wdG9tSW5mZWN0aW91cyB8fCBnZXRTdGF0dXMoKSA9PSBTdGF0dXNFbnVtLmFzeW1wdG9tSW5mZWN0aW91cykpIHsgLyoKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTcGF0aWFsIEZ1bmN0aW9uczoKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlbbmVpZ2hib3JdCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICovCisJCQlJbmRpdmlkdWFsIHBvdGVudGlhbEV4cG9zdXJlID0gbmV3IEluZGl2aWR1YWwoKTsKKwkJCWlmIChwb3RlbnRpYWxFeHBvc3VyZS5nZXRTdGF0dXMoKSA9PSBTdGF0dXNFbnVtLnN1c2NlcHRpYmxlKSB7CisJCQkJZG91YmxlIHRyYW5zbWlzc2lvbkRyYXcgPSByYW5kb21Vbml0KCk7CisJCQkJaWYgKHRyYW5zbWlzc2lvbkRyYXcgPCBwb3RlbnRpYWxFeHBvc3VyZQorCQkJCQkJLmdldENvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eSgpKSB7CisJCQkJCXBvdGVudGlhbEV4cG9zdXJlLnNldFN0YXR1cyhTdGF0dXNFbnVtLmV4cG9zZWQpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMzE3LDEyICsyMDcsMTIgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIHZvaWQgcHJvZ3Jlc3Npb24oKSB7Ci0JCWludCBjdXJyZW50UGVyaW9kID0gZ2V0U2NhcGUoKS5nZXRQZXJpb2QoKTsKKwkJaW50IGN1cnJlbnRQZXJpb2QgPSB0aW1lTm93KCk7CiAJCWlmICgoZ2V0RXhwb3N1cmVFbmRQZXJpb2QoKSAhPSBnZXRBc3ltcHRvbWF0aWNFbmRQZXJpb2QoKSAmJiBjdXJyZW50UGVyaW9kID09IGdldEV4cG9zdXJlRW5kUGVyaW9kKCkpKSB7CiAJCQlzZXRTdGF0dXMoU3RhdHVzRW51bS5hc3ltcHRvbUluZmVjdGlvdXMpOwogCQl9CiAJCWlmIChjdXJyZW50UGVyaW9kID09IGdldE91dGNvbWVQZXJpb2QoKSkgewotCQkJZG91YmxlIG1vcnRhbGl0eURyYXcgPSBnZXRSYW5kb20oKS5uZXh0RG91YmxlKCk7CisJCQlkb3VibGUgbW9ydGFsaXR5RHJhdyA9IHJhbmRvbVVuaXQoKTsKIAkJCWlmIChtb3J0YWxpdHlEcmF3IDwgZ2V0RXBpZGVtaWMoKS5nZXRDYXNlTW9ydGFsaXR5UmF0ZSgpKSB7CiAJCQkJc2V0U3RhdHVzKFN0YXR1c0VudW0uZGVhZCk7CiAJCQl9CkBAIC0zNDUsNyArMjM1LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBleHBvc3VyZSgpIHsKIAkJaWYgKGdldFN0YXR1cygpID09IFN0YXR1c0VudW0uZXhwb3NlZCkgewotCQkJaW50IGV4cG9zdXJlTm93ID0gZ2V0U2NhcGUoKS5nZXRQZXJpb2QoKTsKKwkJCWludCBleHBvc3VyZU5vdyA9IHRpbWVOb3coKTsKIAkJCWludCBleHBvc3VyZUxlbmd0aCA9IHJhbmRvbUluUmFuZ2UoZ2V0RXBpZGVtaWMoKQogCQkJCQkuZ2V0TWluUGVyaW9kRXhwb3N1cmUoKSwgZ2V0RXBpZGVtaWMoKQogCQkJCQkuZ2V0TWF4UGVyaW9kRXhwb3N1cmUoKSk7CkBAIC00ODAsMTcgKzM3MCw0IEBACiAJCWNvbnRhY3RUcmFuc21pc3Npb25Qcm9iYWJpbGl0eSA9IF9jb250YWN0VHJhbnNtaXNzaW9uUHJvYmFiaWxpdHk7CiAJfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIkluZGl2aWR1YWwgIiArIGdldFVJRCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL21hcmtldHMvSW5zdHJ1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9tYXJrZXRzL0luc3RydW1lbnQuamF2YQppbmRleCAzMWM3MDNmLi5hMWZkYjBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL21hcmtldHMvSW5zdHJ1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL25hbWUvbWlsZXNwYXJrZXIvbWFya2V0cy9JbnN0cnVtZW50LmphdmEKQEAgLTE4NiwxMCArMTg2LDEwIEBACiAJICovCiAJcHVibGljIExpc3QgZ2V0TmV0d29yaygpIHsKIAkJTGlzdCBuZXR3b3JrID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXR3b3JrLmFkZEFsbCgoKEdyYXBoKSBnZXRNYXJrZXRzKCkuZ2V0RmlybUluc3RydW1lbnRzKCkuZ2V0U3BhY2UoKSkKLQkJCQkuZ2V0TmVpZ2hib3JzRm9yKHRoaXMpKTsKIAkJbmV0d29yay5hZGRBbGwoKChHcmFwaCkgZ2V0TWFya2V0cygpLmdldEluc3RydW1lbnRIb2xkZXJzKCkuZ2V0U3BhY2UoKSkKIAkJCQkuZ2V0TmVpZ2hib3JzRm9yKHRoaXMpKTsKKwkJbmV0d29yay5hZGRBbGwoKChHcmFwaCkgZ2V0TWFya2V0cygpLmdldEZpcm1JbnN0cnVtZW50cygpLmdldFNwYWNlKCkpCisJCQkJLmdldE5laWdoYm9yc0Zvcih0aGlzKSk7CiAJCXJldHVybiBuZXR3b3JrOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9tYXJrZXRzL1RyYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9leGFtcGxlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZS9zcmNnZW4vbmFtZS9taWxlc3Bhcmtlci9tYXJrZXRzL1RyYWRlci5qYXZhCmluZGV4IDY0MjJiNDIuLjNkNzFhN2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZXhhbXBsZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5leGFtcGxlcy5lc2NhcGUvc3JjZ2VuL25hbWUvbWlsZXNwYXJrZXIvbWFya2V0cy9UcmFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2V4YW1wbGVzL29yZy5lY2xpcHNlLmFtcC5hbWYuZXhhbXBsZXMuZXNjYXBlL3NyY2dlbi9uYW1lL21pbGVzcGFya2VyL21hcmtldHMvVHJhZGVyLmphdmEKQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJICovCiAJcHVibGljIExpc3QgZ2V0TmV0d29yaygpIHsKIAkJTGlzdCBuZXR3b3JrID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXR3b3JrLmFkZEFsbCgoKEdyYXBoKSBnZXRNYXJrZXRzKCkuZ2V0VGFyZ2V0QnV5RmlybXMoKS5nZXRTcGFjZSgpKQotCQkJCS5nZXROZWlnaGJvcnNGb3IodGhpcykpOwogCQluZXR3b3JrLmFkZEFsbCgoKEdyYXBoKSBnZXRNYXJrZXRzKCkuZ2V0SW5zdHJ1bWVudEhvbGRlcnMoKS5nZXRTcGFjZSgpKQogCQkJCS5nZXROZWlnaGJvcnNGb3IodGhpcykpOworCQluZXR3b3JrLmFkZEFsbCgoKEdyYXBoKSBnZXRNYXJrZXRzKCkuZ2V0VGFyZ2V0QnV5RmlybXMoKS5nZXRTcGFjZSgpKQorCQkJCS5nZXROZWlnaGJvcnNGb3IodGhpcykpOwogCQlyZXR1cm4gbmV0d29yazsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggOWMzMjljYS4uNTBiNTUyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE4LDEwICsxOCw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iQU1QIFVwZGF0ZSBTaXRlIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgIDwvdXJsPgotCiAgICA8aW5jbHVkZXMKICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbXAuYW1mLmNvcmUiCiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmNvcmUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5jb3JlLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjI3ZjljNi4uMGZjN2Q0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLmNvcmUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYuY29yZS1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0xOCwxMCArMTgsNiBAQAogICAgICAgJWxpY2Vuc2UKICAgIDwvbGljZW5zZT4KIAotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiVBTVBVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvcmVsZWFzZXMvaW5kaWdvIi8+Ci0gICA8L3VybD4KLQogICAgPHJlcXVpcmVzPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi5zZC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnNkLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggOGFhM2M5OS4uZTIyMGU1OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnNkLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnNkLWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE2LDEwICsxNiw2IEBACiAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+CiAgICAKICAgIDxwbHVnaW4KICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbXAuYW1mLnNkIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRhcmdldC5hc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQuYXNjYXBlLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMTc4M2ExNi4uMjQ1Yjg4MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRhcmdldC5hc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LmFzY2FwZS1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0xOCwxMCArMTgsNiBAQAogICAgICAgJWxpY2Vuc2UKICAgIDwvbGljZW5zZT4KIAotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiVBTVBVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvcmVsZWFzZXMvaW5kaWdvIi8+Ci0gICA8L3VybD4KLQogICAgPHJlcXVpcmVzPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQuZXNjYXBlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LmVzY2FwZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGUwMzQ2ZGYuLjQzMDM4ODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQuZXNjYXBlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRhcmdldC5lc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LmVzY2FwZTNkLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LmVzY2FwZTNkLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNWE2ZTc2Yy4uMzg1MWU3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRhcmdldC5lc2NhcGUzZC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQuZXNjYXBlM2QtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTcsMTAgKzE3LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxpbmNsdWRlcwogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFtcC5hZ2YzZCIKICAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LnJlcGFzdC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRhcmdldC5yZXBhc3QtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBlMzUxZDM0Li42NDJhZTQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWYudGFyZ2V0LnJlcGFzdC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQucmVwYXN0LWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE4LDExICsxOCw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJUFNUFVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IlJlcGFzdCBTaW1waG9ueSBTaXRlIiB1cmw9Imh0dHA6Ly9taXJyb3IuYW5sLmdvdi9wdWIvcmVwYXN0c2ltcGhvbnkvc2l0ZS54bWwiLz4KLSAgIDwvdXJsPgotCiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZSIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1meC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYW1meC1mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDdjZWY0YjcuLjAxMGU5OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFtZngtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbWZ4LWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE4LDEwICsxOCw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJUFNUFVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgIDwvdXJsPgotCiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHRleHQiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5leHRyYXMvc3JjL21vZGVsL2dlbmVyYXRlX2dyYXBodmlzLm13ZSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5leHRyYXMvc3JjL21vZGVsL2dlbmVyYXRlX2dyYXBodmlzLm13ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2QxMzRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmV4dHJhcy9zcmMvbW9kZWwvZ2VuZXJhdGVfZ3JhcGh2aXMubXdlCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzx3b3JrZmxvdz4JCisJPHByb3BlcnR5IG5hbWU9Im91dHB1dFBhdGgiIHZhbHVlPSIuLyIvPgorCTxwcm9wZXJ0eSBuYW1lPSJtb2RlbFBhdGgiIHZhbHVlPSJ0ZXN0LyIvPgorCTxwcm9wZXJ0eSBuYW1lPSJtb2RlbEZpbGUiIHZhbHVlPSJUZXN0R2VuZXJhdGlvbi5tZXRhYWJtIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyY0RpciIgdmFsdWU9InNyY2dlbiIvPg0KKwkKKworICAgIDxiZWFuIGlkPSJtZXRhYWJtIiBjbGFzcz0ib3JnLmVjbGlwc2UueHRlbmQudHlwZXN5c3RlbS5lbWYuRW1mUmVnaXN0cnlNZXRhTW9kZWwiLz4KKyAgIAorCTxjb21wb25lbnQgaWQ9InhtaVBhcnNlciIgY2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHMuUmVhZGVyIj4KKyAgICAgICAgPHVyaSB2YWx1ZT0iJHttb2RlbFBhdGh9Ii8+CisgICAgICAgIDxtb2RlbFNsb3QgdmFsdWU9Im1vZGVsIi8+CisgIAk8L2NvbXBvbmVudD4KKwkKKwk8Y29tcG9uZW50IGlkPSJncmFwaHZpc0dlbmVyYXRvciIgY2xhc3M9Im9yZy5lY2xpcHNlLnhwYW5kMi5HZW5lcmF0b3IiIHNraXBPbkVycm9ycz0idHJ1ZSIgZmlsZUVuY29kaW5nPSJpc28tODg1OS0xIj4KKwkJPG1ldGFNb2RlbCBpZFJlZj0ibWV0YWFibSIvPgorCQk8ZXhwYW5kIHZhbHVlPSJtZXRhYWJtOjpleHQ6OnRtcGw6OkdyYXBoOjpNb2RlbCBGT1IgbW9kZWwiLz4KKwkgICAgPG91dGxldCBwYXRoPSIke291dHB1dFBhdGh9IiBvdmVyd3JpdGU9InRydWUiLz4gCisJCTxmaWxlRW5jb2RpbmcgdmFsdWU9IklTTy04ODU5LTEiLz4gCisJPC9jb21wb25lbnQ+ICAgIAorPC93b3JrZmxvdz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXh0cmFzL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL2dlbi9leHQvR2VuZXJhdGVHcmFwaFZpc0hhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5leHRyYXMvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvZ2VuL2V4dC9HZW5lcmF0ZUdyYXBoVmlzSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDcxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXh0cmFzL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL2dlbi9leHQvR2VuZXJhdGVHcmFwaFZpc0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgTWV0YXNjYXBlLCBMTEMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICBNZXRhc2NhcGUgLSBJbml0aWFsIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZQorICoKKyAqIDwvY29weXJpZ2h0PgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmlkZS5SZXNvdXJjZUpvYkhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uaWRlLlRlc3RDYXNlTW9kZWxCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmF0ZUdyYXBoVmlzSGFuZGxlciBleHRlbmRzIFJlc291cmNlSm9iSGFuZGxlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCXRyeSB7CisgICAgICAgICAgICBJUHJvamVjdCBtb2RlbFByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBtb2RlbFByb2plY3Qub3BlbihudWxsKTsKKwkJCUdyYXBoVmlzQnVpbGRlci5nZXRHcmFwaFZpc0J1aWxkZXJEZWZhdWx0KCkuaGFuZGxlTW9kaWZpZWRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICByZXNvdXJjZS5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSVN0YXR1cyBpb1N0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLldBUk5JTkcsICJvcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5leHQiLCAiUHJvYmxlbSBHZW5lcmF0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyByZXNvdXJjZSArICIgR3JhcGhpY3MiLCBlKTsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShpb1N0YXR1cyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXh0cmFzL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL2dlbi9leHQvR3JhcGhWaXNCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi5nZW4uZXh0cmFzL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL2dlbi9leHQvR3JhcGhWaXNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0YThiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLmdlbi5leHRyYXMvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvZ2VuL2V4dC9HcmFwaFZpc0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgTWV0YXNjYXBlLCBMTEMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICBNZXRhc2NhcGUgLSBJbml0aWFsIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZQorICoKKyAqIDwvY29weXJpZ2h0PgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmlkZS5NZXRhQUJNQnVpbGRlcjsKKworCitwdWJsaWMgY2xhc3MgR3JhcGhWaXNCdWlsZGVyIGV4dGVuZHMgTWV0YUFCTUJ1aWxkZXIgeworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdSQVBIVklTX0JVSUxERVJfSUQgPSAiZ3JhcGh2aXNHZW5lcmF0b3IiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0YUFCTUJ1aWxkZXIgZ3JhcGh2aXNCdWlsZGVyOworICAgIAorICAgIHB1YmxpYyBHcmFwaFZpc0J1aWxkZXIoKSB7CisgICAgICAgIHN1cGVyKCJHZW5lcmF0aW5nIEdyYXBoIFZpcyBEb2N1bWVudGF0aW9uIiwgIm9yZy5lY2xpcHNlLmFtcC5hbWYuZ2VuLmV4dCIsICJtb2RlbC9nZW5lcmF0ZV9ncmFwaHZpcy5td2UiLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0YUFCTUJ1aWxkZXIgZ2V0R3JhcGhWaXNCdWlsZGVyRGVmYXVsdCgpIHsKKyAgICAgICAgaWYgKGdyYXBodmlzQnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgIAlncmFwaHZpc0J1aWxkZXIgPSBuZXcgR3JhcGhWaXNCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdyYXBodmlzQnVpbGRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3QubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdC5tZXRhYWJtCmluZGV4IDA0M2IyMDMuLmVhNmFjMWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTYsOSArMTYsMjEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3RDb21wLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3RDb21wLm1ldGFhYm0KaW5kZXggMDQzYjIwMy4uZWE2YWMxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0Q29tcC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdENvbXAubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTE2LDkgKzE2LDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0RG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdERvLm1ldGFhYm0KaW5kZXggMDQzYjIwMy4uZWE2YWMxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0RG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3REby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTYsOSArMTYsMjEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3RSZWRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3RSZWRvLm1ldGFhYm0KaW5kZXggMDQzYjIwMy4uZWE2YWMxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0UmVkby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdFJlZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTE2LDkgKzE2LDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0VW5kby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFjdHNUZXN0VW5kby5tZXRhYWJtCmluZGV4IDU5NmU1NTcuLjE0NTY3ZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBY3RzVGVzdFVuZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWN0c1Rlc3RVbmRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xNSw5ICsxNSwyMSBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBZ2VudHNUZXN0Lm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWdlbnRzVGVzdC5tZXRhYWJtCmluZGV4IDc2ZjU3NDcuLjhkNDgzYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBZ2VudHNUZXN0Lm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3QubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTExLDkgKzExLDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RDb21wLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWdlbnRzVGVzdENvbXAubWV0YWFibQppbmRleCA3NmY1NzQ3Li44ZDQ4M2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWdlbnRzVGVzdENvbXAubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWdlbnRzVGVzdENvbXAubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTExLDkgKzExLDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3REby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3REby5tZXRhYWJtCmluZGV4IDc2ZjU3NDcuLjhkNDgzYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBZ2VudHNUZXN0RG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWRkQWdlbnRzVGVzdERvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xMSw5ICsxMSwyMSBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBZ2VudHNUZXN0UmVkby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RSZWRvLm1ldGFhYm0KaW5kZXggNzZmNTc0Ny4uOGQ0ODNhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RSZWRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RSZWRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xMSw5ICsxMSwyMSBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZGRBZ2VudHNUZXN0VW5kby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RVbmRvLm1ldGFhYm0KaW5kZXggOTI0MDJiZi4uODQ3YzFmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RVbmRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFkZEFnZW50c1Rlc3RVbmRvLm1ldGFhYm0KQEAgLTEsNiArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC05LDUgKzksMTEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0Lm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rRGVsZXRlQWdlbnRUYXJnZXRSdWxlVGVzdC5tZXRhYWJtCmluZGV4IDg0ODY3YWUuLmY4YWNlOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0Lm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3QubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xNSw5ICsxNSwyMSBAQAogICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlIiBJRD0icm9vdENvbnRleHRBZ2VudFJ1bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdyb290Q29udGV4dEFnZW50UnVsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZXMiLz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0Q29tcC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RDb21wLm1ldGFhYm0KaW5kZXggODQ4NjdhZS4uZjhhY2U5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RDb21wLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RDb21wLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTUsOSArMTUsMjEgQEAKICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZSIgSUQ9InJvb3RDb250ZXh0QWdlbnRSdWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0ncm9vdENvbnRleHRBZ2VudFJ1bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGVzIi8+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rRGVsZXRlQWdlbnRUYXJnZXRSdWxlVGVzdERvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rRGVsZXRlQWdlbnRUYXJnZXRSdWxlVGVzdERvLm1ldGFhYm0KaW5kZXggODQ4NjdhZS4uZjhhY2U5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3REby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0RG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xNSw5ICsxNSwyMSBAQAogICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlIiBJRD0icm9vdENvbnRleHRBZ2VudFJ1bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdyb290Q29udGV4dEFnZW50UnVsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZXMiLz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0UmVkby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RSZWRvLm1ldGFhYm0KaW5kZXggODQ4NjdhZS4uZjhhY2U5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RSZWRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0RlbGV0ZUFnZW50VGFyZ2V0UnVsZVRlc3RSZWRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTUsOSArMTUsMjEgQEAKICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZSIgSUQ9InJvb3RDb250ZXh0QWdlbnRSdWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0ncm9vdENvbnRleHRBZ2VudFJ1bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGVzIi8+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rRGVsZXRlQWdlbnRUYXJnZXRSdWxlVGVzdFVuZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0VW5kby5tZXRhYWJtCmluZGV4IDJmODhkNWMuLmMwMjRlZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0VW5kby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtEZWxldGVBZ2VudFRhcmdldFJ1bGVUZXN0VW5kby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTIwLDkgKzIwLDIxIEBACiAgICAgICA8L21lbWJlcnM+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRBdHRyVGVzdC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50QXR0clRlc3QubWV0YWFibQppbmRleCBkYmYxNWM4Li42ODE0ZjVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRBdHRyVGVzdC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0Lm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOmZ1bmN0aW9uPSJodHRwOi8vbWV0YWFibS5vcmcvZnVuY3Rpb24iIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgICAgIDwvbWVtYmVycz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0Q29tcC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50QXR0clRlc3RDb21wLm1ldGFhYm0KaW5kZXggZGJmMTVjOC4uNjgxNGY1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50QXR0clRlc3RDb21wLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50QXR0clRlc3RDb21wLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOmZ1bmN0aW9uPSJodHRwOi8vbWV0YWFibS5vcmcvZnVuY3Rpb24iIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgICAgIDwvbWVtYmVycz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0RG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0RG8ubWV0YWFibQppbmRleCBkYmYxNWM4Li42ODE0ZjVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRBdHRyVGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50QXR0clRlc3REby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE5LDkgKzE5LDIxIEBACiAgICAgICA8L21lbWJlcnM+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRBdHRyVGVzdFJlZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0UmVkby5tZXRhYWJtCmluZGV4IGRiZjE1YzguLjY4MTRmNWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0UmVkby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0UmVkby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE5LDkgKzE5LDIxIEBACiAgICAgICA8L21lbWJlcnM+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRBdHRyVGVzdFVuZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0VW5kby5tZXRhYWJtCmluZGV4IDJmODhkNWMuLmMwMjRlZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0VW5kby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudEF0dHJUZXN0VW5kby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTIwLDkgKzIwLDIxIEBACiAgICAgICA8L21lbWJlcnM+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50TWVtYmVyUnVsZVRlc3QubWV0YWFibQppbmRleCA4NDg2N2FlLi5mOGFjZTk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0Lm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTUsOSArMTUsMjEgQEAKICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZSIgSUQ9InJvb3RDb250ZXh0QWdlbnRSdWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0ncm9vdENvbnRleHRBZ2VudFJ1bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGVzIi8+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdENvbXAubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0Q29tcC5tZXRhYWJtCmluZGV4IDg0ODY3YWUuLmY4YWNlOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0Q29tcC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0Q29tcC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE1LDkgKzE1LDIxIEBACiAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGUiIElEPSJyb290Q29udGV4dEFnZW50UnVsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRSdWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlcyIvPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50TWVtYmVyUnVsZVRlc3REby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50TWVtYmVyUnVsZVRlc3REby5tZXRhYWJtCmluZGV4IDg0ODY3YWUuLmY4YWNlOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0RG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdERvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTUsOSArMTUsMjEgQEAKICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZSIgSUQ9InJvb3RDb250ZXh0QWdlbnRSdWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0ncm9vdENvbnRleHRBZ2VudFJ1bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGVzIi8+CiAgICAgPC9yb290QWN0aXZpdHk+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdFJlZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0UmVkby5tZXRhYWJtCmluZGV4IDg0ODY3YWUuLmY4YWNlOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0UmVkby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudE1lbWJlclJ1bGVUZXN0UmVkby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE1LDkgKzE1LDIxIEBACiAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGUiIElEPSJyb290Q29udGV4dEFnZW50UnVsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRSdWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlcyIvPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50TWVtYmVyUnVsZVRlc3RVbmRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdFVuZG8ubWV0YWFibQppbmRleCAyZjg4ZDVjLi5jMDI0ZWU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdFVuZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRNZW1iZXJSdWxlVGVzdFVuZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6ZnVuY3Rpb249Imh0dHA6Ly9tZXRhYWJtLm9yZy9mdW5jdGlvbiIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0yMCw5ICsyMCwyMSBAQAogICAgICAgPC9tZW1iZXJzPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3QubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRhcmdldFJ1bGVUZXN0Lm1ldGFhYm0KaW5kZXggODQ4NjdhZS4uZjhhY2U5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3QubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE1LDkgKzE1LDIxIEBACiAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGUiIElEPSJyb290Q29udGV4dEFnZW50UnVsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRSdWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlcyIvPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3RDb21wLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdENvbXAubWV0YWFibQppbmRleCA4NDg2N2FlLi5mOGFjZTk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdENvbXAubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdENvbXAubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xNSw5ICsxNSwyMSBAQAogICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlIiBJRD0icm9vdENvbnRleHRBZ2VudFJ1bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdyb290Q29udGV4dEFnZW50UnVsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZXMiLz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRhcmdldFJ1bGVUZXN0RG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRhcmdldFJ1bGVUZXN0RG8ubWV0YWFibQppbmRleCA4NDg2N2FlLi5mOGFjZTk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3REby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDIiBJRD0icm9vdEMiIHBsdXJhbExhYmVsPSJSb290IENzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE1LDkgKzE1LDIxIEBACiAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFJ1bGUiIElEPSJyb290Q29udGV4dEFnZW50UnVsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRSdWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlcyIvPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3RSZWRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdFJlZG8ubWV0YWFibQppbmRleCA4NDg2N2FlLi5mOGFjZTk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdFJlZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUYXJnZXRSdWxlVGVzdFJlZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xNSw5ICsxNSwyMSBAQAogICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBSdWxlIiBJRD0icm9vdENvbnRleHRBZ2VudFJ1bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdyb290Q29udGV4dEFnZW50UnVsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgUnVsZXMiLz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRhcmdldFJ1bGVUZXN0VW5kby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3RVbmRvLm1ldGFhYm0KaW5kZXggMmY4OGQ1Yy4uYzAyNGVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3RVbmRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGFyZ2V0UnVsZVRlc3RVbmRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOmZ1bmN0aW9uPSJodHRwOi8vbWV0YWFibS5vcmcvZnVuY3Rpb24iIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMjAsOSArMjAsMjEgQEAKICAgICAgIDwvbWVtYmVycz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3QubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3QubWV0YWFibQppbmRleCAzNTk0ODMxLi5kMzMxY2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0Lm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdC5tZXRhYWJtCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTEwLDUgKzEwLDExIEBACiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdENvbXAubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3RDb21wLm1ldGFhYm0KaW5kZXggMzU5NDgzMS4uZDMzMWNhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdENvbXAubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0Q29tcC5tZXRhYWJtCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTEwLDUgKzEwLDExIEBACiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdERvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0RG8ubWV0YWFibQppbmRleCAzNTk0ODMxLi5kMzMxY2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0RG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0RG8ubWV0YWFibQpAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xMCw1ICsxMCwxMSBAQAogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3RSZWRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0UmVkby5tZXRhYWJtCmluZGV4IDM1OTQ4MzEuLmQzMzFjYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3RSZWRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdFJlZG8ubWV0YWFibQpAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IEMiIElEPSJyb290QyIgcGx1cmFsTGFiZWw9IlJvb3QgQ3MiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0xMCw1ICsxMCwxMSBAQAogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3RVbmRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQWdlbnRUZXN0VW5kby5tZXRhYWJtCmluZGV4IDU4YTVlNzMuLmIyYmNkZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVBZ2VudFRlc3RVbmRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUFnZW50VGVzdFVuZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6ZnVuY3Rpb249Imh0dHA6Ly9tZXRhYWJtLm9yZy9mdW5jdGlvbiIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0yMCw5ICsyMCwyMSBAQAogICAgICAgPC9tZW1iZXJzPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdC5tZXRhYWJtCmluZGV4IDU1N2RmY2UuLmNlNWQzZTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3QubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQ29udGV4dEF0dHJUZXN0Lm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOmZ1bmN0aW9uPSJodHRwOi8vbWV0YWFibS5vcmcvZnVuY3Rpb24iIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xOSw5ICsxOSwyMSBAQAogICAgICAgPC9tZW1iZXJzPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdENvbXAubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3RDb21wLm1ldGFhYm0KaW5kZXggNTU3ZGZjZS4uY2U1ZDNlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdENvbXAubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQ29udGV4dEF0dHJUZXN0Q29tcC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgICAgIDwvbWVtYmVycz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3REby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdERvLm1ldGFhYm0KaW5kZXggNTU3ZGZjZS4uY2U1ZDNlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdERvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOmZ1bmN0aW9uPSJodHRwOi8vbWV0YWFibS5vcmcvZnVuY3Rpb24iIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xOSw5ICsxOSwyMSBAQAogICAgICAgPC9tZW1iZXJzPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdFJlZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3RSZWRvLm1ldGFhYm0KaW5kZXggNTU3ZGZjZS4uY2U1ZDNlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdFJlZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQ29udGV4dEF0dHJUZXN0UmVkby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczpmdW5jdGlvbj0iaHR0cDovL21ldGFhYm0ub3JnL2Z1bmN0aW9uIiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgICAgIDwvbWVtYmVycz4KICAgICA8L3Jvb3RBY3Rpdml0eT4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3RVbmRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0QWdlbnRTaW5rSW5wdXRzUmVtb3ZlQ29udGV4dEF0dHJUZXN0VW5kby5tZXRhYWJtCmluZGV4IDJmODhkNWMuLmMwMjRlZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RBZ2VudFNpbmtJbnB1dHNSZW1vdmVDb250ZXh0QXR0clRlc3RVbmRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEFnZW50U2lua0lucHV0c1JlbW92ZUNvbnRleHRBdHRyVGVzdFVuZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6ZnVuY3Rpb249Imh0dHA6Ly9tZXRhYWJtLm9yZy9mdW5jdGlvbiIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQyIgSUQ9InJvb3RDIiBwbHVyYWxMYWJlbD0iUm9vdCBDcyIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CkBAIC0yMCw5ICsyMCwyMSBAQAogICAgICAgPC9tZW1iZXJzPgogICAgIDwvcm9vdEFjdGl2aXR5PgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0Lm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3QubWV0YWFibQppbmRleCBkZGEyOTk2Li5iY2ZiZjU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3QubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3QubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTEyLDEwICsxMiwyMiBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNHcmlkIiBsYWJlbD0iR3JpZCIgSUQ9ImdyaWQiIHBsdXJhbExhYmVsPSJHcmlkcyIvPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0Q29tcC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0Q29tcC5tZXRhYWJtCmluZGV4IGRkYTI5OTYuLmJjZmJmNTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdENvbXAubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3RDb21wLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkR3JpZHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xMiwxMCArMTIsMjIgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQiIElEPSJncmlkIiBwbHVyYWxMYWJlbD0iR3JpZHMiLz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdERvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3REby5tZXRhYWJtCmluZGV4IGRkYTI5OTYuLmJjZmJmNTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0RG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTEyLDEwICsxMiwyMiBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNHcmlkIiBsYWJlbD0iR3JpZCIgSUQ9ImdyaWQiIHBsdXJhbExhYmVsPSJHcmlkcyIvPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0UmVkby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0UmVkby5tZXRhYWJtCmluZGV4IGRkYTI5OTYuLmJjZmJmNTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdFJlZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3RSZWRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkR3JpZHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xMiwxMCArMTIsMjIgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQiIElEPSJncmlkIiBwbHVyYWxMYWJlbD0iR3JpZHMiLz4KIDwvbWV0YWFibTpTQ29udGV4dD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdFVuZG8ubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RDcmVhdGVTcGFjZUFnZW50c0ZpcnN0VGVzdFVuZG8ubWV0YWFibQppbmRleCA3NmY1NzQ3Li44ZDQ4M2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0Q3JlYXRlU3BhY2VBZ2VudHNGaXJzdFRlc3RVbmRvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdENyZWF0ZVNwYWNlQWdlbnRzRmlyc3RUZXN0VW5kby5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTEsOSArMTEsMjEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3QubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdC5tZXRhYWJtCmluZGV4IGU4YzM2ZjkuLjdlMmU4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZEdyaWRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFNwYWNlcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGROZXR3b3JrcyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTE0LDEwICsxNCwyMiBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNHcmlkIiBsYWJlbD0iR3JpZCIgSUQ9ImdyaWQiIHBsdXJhbExhYmVsPSJHcmlkcyIvPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRpbnVvdXNTcGFjZSIgbGFiZWw9IlNwYWNlIiBJRD0ic3BhY2UiIHBsdXJhbExhYmVsPSJTcGFjZXMiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdENvbXAubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdENvbXAubWV0YWFibQppbmRleCBlOGMzNmY5Li43ZTJlOGVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3RDb21wLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRBZGRUZXN0Q29tcC5tZXRhYWJtCkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIvPgogICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQnVpbGQiIGxhYmVsPSJCdWlsZCBSb290IENvbnRleHQiIElEPSJidWlsZFJvb3RDb250ZXh0IiB0YXJnZXRzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0QWdlbnRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZEdyaWRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFNwYWNlcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGROZXR3b3JrcyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTE0LDEwICsxNCwyMiBAQAogICA8YWdlbnRzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQiIElEPSJyb290Q29udGV4dEFnZW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dEFnZW50U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dEFnZW50U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8YWdlbnRzIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250ZXh0IiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQiIElEPSJyb290Q29udGV4dENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0Ii8+CisgICAgPHN0eWxlcyB4c2k6dHlwZT0ibWV0YWFibTpTU3R5bGUyRCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIDJEcyI+CisgICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyI+CisgICAgICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QVJ1bGUiIGxhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXS9Ac3R5bGVzW0lEPSdyb290Q29udGV4dENvbnRleHRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0Q29udGV4dFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBwbHVyYWxMYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNHcmlkIiBsYWJlbD0iR3JpZCIgSUQ9ImdyaWQiIHBsdXJhbExhYmVsPSJHcmlkcyIvPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRpbnVvdXNTcGFjZSIgbGFiZWw9IlNwYWNlIiBJRD0ic3BhY2UiIHBsdXJhbExhYmVsPSJTcGFjZXMiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdERvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3REby5tZXRhYWJtCmluZGV4IGU4YzM2ZjkuLjdlMmU4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRBZGRUZXN0RG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRTcGFjZXMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkTmV0d29ya3MnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xNCwxMCArMTQsMjIgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQiIElEPSJncmlkIiBwbHVyYWxMYWJlbD0iR3JpZHMiLz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250aW51b3VzU3BhY2UiIGxhYmVsPSJTcGFjZSIgSUQ9InNwYWNlIiBwbHVyYWxMYWJlbD0iU3BhY2VzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3RSZWRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3RSZWRvLm1ldGFhYm0KaW5kZXggZThjMzZmOS4uN2UyZThlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRBZGRUZXN0UmVkby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdFJlZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRTcGFjZXMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkTmV0d29ya3MnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xNCwxMCArMTQsMjIgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQiIElEPSJncmlkIiBwbHVyYWxMYWJlbD0iR3JpZHMiLz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250aW51b3VzU3BhY2UiIGxhYmVsPSJTcGFjZSIgSUQ9InNwYWNlIiBwbHVyYWxMYWJlbD0iU3BhY2VzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3RVbmRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZEFkZFRlc3RVbmRvLm1ldGFhYm0KaW5kZXggMDA0MWE3ZC4uYzY1MWJkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRBZGRUZXN0VW5kby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkQWRkVGVzdFVuZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRTcGFjZXMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xMywxMCArMTMsMjIgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQiIElEPSJncmlkIiBwbHVyYWxMYWJlbD0iR3JpZHMiLz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250aW51b3VzU3BhY2UiIGxhYmVsPSJTcGFjZSIgSUQ9InNwYWNlIiBwbHVyYWxMYWJlbD0iU3BhY2VzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0Lm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0Lm1ldGFhYm0KaW5kZXggMzNhM2NlMi4uMmU1ZWNiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3QubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRTcGFjZXMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkTmV0d29ya3MnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xNCwxNSArMTQsMjcgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQgM0QiIElEPSJncmlkM0QiIHBsdXJhbExhYmVsPSJHcmlkIDNEcyIgZGltZW5zaW9uYWxpdHk9IjMiPgotICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJYIEV4dGVudCIgSUQ9InhFeHRlbnQiIHBsdXJhbExhYmVsPSJYIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWSBFeHRlbnQiIElEPSJ5RXh0ZW50IiBwbHVyYWxMYWJlbD0iWSBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIHZlcnRpY2FsIGV4dGVudCBvZiB0aGUgc3BhY2UuIiBzVHlwZT0iSU5URUdFUiIvPgotICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJaIEV4dGVudCIgSUQ9InpFeHRlbnQiIHBsdXJhbExhYmVsPSJaIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgZGVwdGggZXh0ZW50IG9mIHRoZSBzcGFjZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlggRXh0ZW50IiBJRD0ieEV4dGVudCIgcGx1cmFsTGFiZWw9IlggRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BhY2UuIi8+CisgICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlkgRXh0ZW50IiBJRD0ieUV4dGVudCIgcGx1cmFsTGFiZWw9IlkgRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSB2ZXJ0aWNhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJaIEV4dGVudCIgSUQ9InpFeHRlbnQiIHBsdXJhbExhYmVsPSJaIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgZGVwdGggZXh0ZW50IG9mIHRoZSBzcGFjZS4iLz4KICAgPC9wcm9qZWN0aW9ucz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250aW51b3VzU3BhY2UiIGxhYmVsPSJTcGFjZSIgSUQ9InNwYWNlIiBwbHVyYWxMYWJlbD0iU3BhY2VzIi8+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTTmV0d29yayIgbGFiZWw9Ik5ldHdvcmsiIElEPSJuZXR3b3JrIiBwbHVyYWxMYWJlbD0iTmV0d29ya3MiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3RDb21wLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0Q29tcC5tZXRhYWJtCmluZGV4IDMzYTNjZTIuLjJlNWVjYjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3RDb21wLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdENvbXAubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRHcmlkcyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRTcGFjZXMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkTmV0d29ya3MnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFDcmVhdGVBZ2VudHMiIGxhYmVsPSJDcmVhdGUgUm9vdCBDb250ZXh0IEFnZW50cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0QWdlbnRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIGFnZW50Q291bnQ9Ii8vQGF0dHJpYnV0ZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRDb3VudCddIi8+CkBAIC0xNCwxNSArMTQsMjcgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTR3JpZCIgbGFiZWw9IkdyaWQgM0QiIElEPSJncmlkM0QiIHBsdXJhbExhYmVsPSJHcmlkIDNEcyIgZGltZW5zaW9uYWxpdHk9IjMiPgotICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJYIEV4dGVudCIgSUQ9InhFeHRlbnQiIHBsdXJhbExhYmVsPSJYIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWSBFeHRlbnQiIElEPSJ5RXh0ZW50IiBwbHVyYWxMYWJlbD0iWSBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIHZlcnRpY2FsIGV4dGVudCBvZiB0aGUgc3BhY2UuIiBzVHlwZT0iSU5URUdFUiIvPgotICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJaIEV4dGVudCIgSUQ9InpFeHRlbnQiIHBsdXJhbExhYmVsPSJaIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgZGVwdGggZXh0ZW50IG9mIHRoZSBzcGFjZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlggRXh0ZW50IiBJRD0ieEV4dGVudCIgcGx1cmFsTGFiZWw9IlggRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BhY2UuIi8+CisgICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlkgRXh0ZW50IiBJRD0ieUV4dGVudCIgcGx1cmFsTGFiZWw9IlkgRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSB2ZXJ0aWNhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJaIEV4dGVudCIgSUQ9InpFeHRlbnQiIHBsdXJhbExhYmVsPSJaIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgZGVwdGggZXh0ZW50IG9mIHRoZSBzcGFjZS4iLz4KICAgPC9wcm9qZWN0aW9ucz4KICAgPHByb2plY3Rpb25zIHhzaTp0eXBlPSJtZXRhYWJtOlNDb250aW51b3VzU3BhY2UiIGxhYmVsPSJTcGFjZSIgSUQ9InNwYWNlIiBwbHVyYWxMYWJlbD0iU3BhY2VzIi8+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTTmV0d29yayIgbGFiZWw9Ik5ldHdvcmsiIElEPSJuZXR3b3JrIiBwbHVyYWxMYWJlbD0iTmV0d29ya3MiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3REby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdERvLm1ldGFhYm0KaW5kZXggMzNhM2NlMi4uMmU1ZWNiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdERvLm1ldGFhYm0KKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdERvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkR3JpZHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkU3BhY2VzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZE5ldHdvcmtzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTQsMTUgKzE0LDI3IEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U0dyaWQiIGxhYmVsPSJHcmlkIDNEIiBJRD0iZ3JpZDNEIiBwbHVyYWxMYWJlbD0iR3JpZCAzRHMiIGRpbWVuc2lvbmFsaXR5PSIzIj4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWCBFeHRlbnQiIElEPSJ4RXh0ZW50IiBwbHVyYWxMYWJlbD0iWCBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGFjZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlkgRXh0ZW50IiBJRD0ieUV4dGVudCIgcGx1cmFsTGFiZWw9IlkgRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSB2ZXJ0aWNhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWiBFeHRlbnQiIElEPSJ6RXh0ZW50IiBwbHVyYWxMYWJlbD0iWiBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGRlcHRoIGV4dGVudCBvZiB0aGUgc3BhY2UuIiBzVHlwZT0iSU5URUdFUiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJYIEV4dGVudCIgSUQ9InhFeHRlbnQiIHBsdXJhbExhYmVsPSJYIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJZIEV4dGVudCIgSUQ9InlFeHRlbnQiIHBsdXJhbExhYmVsPSJZIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgdmVydGljYWwgZXh0ZW50IG9mIHRoZSBzcGFjZS4iLz4KKyAgICA8YXR0cmlidXRlcyBsYWJlbD0iWiBFeHRlbnQiIElEPSJ6RXh0ZW50IiBwbHVyYWxMYWJlbD0iWiBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGRlcHRoIGV4dGVudCBvZiB0aGUgc3BhY2UuIi8+CiAgIDwvcHJvamVjdGlvbnM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGludW91c1NwYWNlIiBsYWJlbD0iU3BhY2UiIElEPSJzcGFjZSIgcGx1cmFsTGFiZWw9IlNwYWNlcyIvPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U05ldHdvcmsiIGxhYmVsPSJOZXR3b3JrIiBJRD0ibmV0d29yayIgcGx1cmFsTGFiZWw9Ik5ldHdvcmtzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0UmVkby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdFJlZG8ubWV0YWFibQppbmRleCAzM2EzY2UyLi4yZTVlY2IzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0UmVkby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3RSZWRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkR3JpZHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkU3BhY2VzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZE5ldHdvcmtzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTQsMTUgKzE0LDI3IEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U0dyaWQiIGxhYmVsPSJHcmlkIDNEIiBJRD0iZ3JpZDNEIiBwbHVyYWxMYWJlbD0iR3JpZCAzRHMiIGRpbWVuc2lvbmFsaXR5PSIzIj4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWCBFeHRlbnQiIElEPSJ4RXh0ZW50IiBwbHVyYWxMYWJlbD0iWCBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGFjZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gICAgPGF0dHJpYnV0ZXMgbGFiZWw9IlkgRXh0ZW50IiBJRD0ieUV4dGVudCIgcGx1cmFsTGFiZWw9IlkgRXh0ZW50cyIgZGVzY3JpcHRpb249IlRoZSB2ZXJ0aWNhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIgc1R5cGU9IklOVEVHRVIiLz4KLSAgICA8YXR0cmlidXRlcyBsYWJlbD0iWiBFeHRlbnQiIElEPSJ6RXh0ZW50IiBwbHVyYWxMYWJlbD0iWiBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGRlcHRoIGV4dGVudCBvZiB0aGUgc3BhY2UuIiBzVHlwZT0iSU5URUdFUiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJYIEV4dGVudCIgSUQ9InhFeHRlbnQiIHBsdXJhbExhYmVsPSJYIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwYWNlLiIvPgorICAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJZIEV4dGVudCIgSUQ9InlFeHRlbnQiIHBsdXJhbExhYmVsPSJZIEV4dGVudHMiIGRlc2NyaXB0aW9uPSJUaGUgdmVydGljYWwgZXh0ZW50IG9mIHRoZSBzcGFjZS4iLz4KKyAgICA8YXR0cmlidXRlcyBsYWJlbD0iWiBFeHRlbnQiIElEPSJ6RXh0ZW50IiBwbHVyYWxMYWJlbD0iWiBFeHRlbnRzIiBkZXNjcmlwdGlvbj0iVGhlIGRlcHRoIGV4dGVudCBvZiB0aGUgc3BhY2UuIi8+CiAgIDwvcHJvamVjdGlvbnM+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGludW91c1NwYWNlIiBsYWJlbD0iU3BhY2UiIElEPSJzcGFjZSIgcGx1cmFsTGFiZWw9IlNwYWNlcyIvPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U05ldHdvcmsiIGxhYmVsPSJOZXR3b3JrIiBJRD0ibmV0d29yayIgcGx1cmFsTGFiZWw9Ik5ldHdvcmtzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0VW5kby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdEdyaWRTZXREaW1zVGVzdFVuZG8ubWV0YWFibQppbmRleCBlOGMzNmY5Li43ZTJlOGVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0R3JpZFNldERpbXNUZXN0VW5kby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RHcmlkU2V0RGltc1Rlc3RVbmRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkR3JpZHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkU3BhY2VzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZE5ldHdvcmtzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBBZ2VudHMiIElEPSJjcmVhdGVSb290Q29udGV4dEFnZW50cyIgc291cmNlcz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dEFnZW50Q291bnQnXSIvPgpAQCAtMTQsMTAgKzE0LDIyIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogICA8cHJvamVjdGlvbnMgeHNpOnR5cGU9Im1ldGFhYm06U0dyaWQiIGxhYmVsPSJHcmlkIiBJRD0iZ3JpZCIgcGx1cmFsTGFiZWw9IkdyaWRzIi8+CiAgIDxwcm9qZWN0aW9ucyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGludW91c1NwYWNlIiBsYWJlbD0iU3BhY2UiIElEPSJzcGFjZSIgcGx1cmFsTGFiZWw9IlNwYWNlcyIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFJlbW92ZUFnZW50c1Rlc3QubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RSZW1vdmVBZ2VudHNUZXN0Lm1ldGFhYm0KaW5kZXggMjlhNDU2Zi4uYzA0OGE0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFJlbW92ZUFnZW50c1Rlc3QubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdC5tZXRhYWJtCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBDb250ZXh0cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dENvbnRleHRDb3VudCddIi8+CkBAIC05LDUgKzksMTEgQEAKICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdENvbXAubWV0YWFibSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RSZW1vdmVBZ2VudHNUZXN0Q29tcC5tZXRhYWJtCmluZGV4IDI5YTQ1NmYuLmMwNDhhNDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RSZW1vdmVBZ2VudHNUZXN0Q29tcC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RSZW1vdmVBZ2VudHNUZXN0Q29tcC5tZXRhYWJtCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KIDxtZXRhYWJtOlNDb250ZXh0IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6YWN0PSJodHRwOi8vbWV0YWFibS5vcmcvYWN0IiB4bWxuczptZXRhYWJtPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIiBsYWJlbD0iUm9vdCBDb250ZXh0IiBJRD0icm9vdENvbnRleHQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHRzIj4KLSAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10iIHNlbGVjdGVkPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgYWdlbnQ9Ii8iIHBsdXJhbExhYmVsPSJCdWlsZCBSb290IENvbnRleHRzIi8+CiAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBQ3JlYXRlQWdlbnRzIiBsYWJlbD0iQ3JlYXRlIFJvb3QgQ29udGV4dCBDb250ZXh0cyIgSUQ9ImNyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddIiBhZ2VudENvdW50PSIvL0BhdHRyaWJ1dGVzW0lEPSdyb290Q29udGV4dENvbnRleHRDb3VudCddIi8+CkBAIC05LDUgKzksMTEgQEAKICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdERvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdERvLm1ldGFhYm0KaW5kZXggMjlhNDU2Zi4uYzA0OGE0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFJlbW92ZUFnZW50c1Rlc3REby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RSZW1vdmVBZ2VudHNUZXN0RG8ubWV0YWFibQpAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQ29udGV4dHMiIElEPSJjcmVhdGVSb290Q29udGV4dENvbnRleHRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0Q291bnQnXSIvPgpAQCAtOSw1ICs5LDExIEBACiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFJlbW92ZUFnZW50c1Rlc3RSZWRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFJlZG8ubWV0YWFibQppbmRleCAyOWE0NTZmLi5jMDQ4YTQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFJlZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFJlZG8ubWV0YWFibQpAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQ29udGV4dHMiIElEPSJjcmVhdGVSb290Q29udGV4dENvbnRleHRzIiBzb3VyY2VzPSIvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2J1aWxkUm9vdENvbnRleHQnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0Q291bnQnXSIvPgpAQCAtOSw1ICs5LDExIEBACiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFJlbW92ZUFnZW50c1Rlc3RVbmRvLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFVuZG8ubWV0YWFibQppbmRleCBiMjZiOTNiLi5lYmNjZmVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFVuZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0UmVtb3ZlQWdlbnRzVGVzdFVuZG8ubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dENvbnRleHRzJ10gLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUNyZWF0ZUFnZW50cyIgbGFiZWw9IkNyZWF0ZSBSb290IENvbnRleHQgQWdlbnRzIiBJRD0iY3JlYXRlUm9vdENvbnRleHRBZ2VudHMiIHNvdXJjZXM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgYWdlbnRDb3VudD0iLy9AYXR0cmlidXRlc1tJRD0ncm9vdENvbnRleHRBZ2VudENvdW50J10iLz4KQEAgLTExLDkgKzExLDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0Lm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3QubWV0YWFibQppbmRleCBhMTVmN2UzLi4zNWNkNWQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3QubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3QubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IkEiIElEPSJhIiBwbHVyYWxMYWJlbD0iQXMiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3RDb21wLm1ldGFhYm0gYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3RDb21wLm1ldGFhYm0KaW5kZXggYTE1ZjdlMy4uMzVjZDVkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0Q29tcC5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RTaW5rSW5wdXRzVGVzdENvbXAubWV0YWFibQpAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+CiA8bWV0YWFibTpTQ29udGV4dCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmFjdD0iaHR0cDovL21ldGFhYm0ub3JnL2FjdCIgeG1sbnM6bWV0YWFibT0iaHR0cDovL21ldGFhYm0ub3JnL3N0cnVjdHVyZSIgbGFiZWw9IlJvb3QgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0cyI+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+Ci0gIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgY29udGV4dHMgdG8gY3JlYXRlLiIgc1R5cGU9IklOVEVHRVIiLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBhZ2VudHMgdG8gY3JlYXRlLiIvPgorICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iLz4KICAgPGF0dHJpYnV0ZXMgbGFiZWw9IkEiIElEPSJhIiBwbHVyYWxMYWJlbD0iQXMiLz4KICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgogICAgIDxtZW1iZXJzIHhzaTp0eXBlPSJhY3Q6QUJ1aWxkIiBsYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0IiBJRD0iYnVpbGRSb290Q29udGV4dCIgdGFyZ2V0cz0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdjcmVhdGVSb290Q29udGV4dEFnZW50cyddIC8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRDb250ZXh0cyddIiBzZWxlY3RlZD0iLy9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdidWlsZFJvb3RDb250ZXh0J10iIGFnZW50PSIvIiBwbHVyYWxMYWJlbD0iQnVpbGQgUm9vdCBDb250ZXh0cyIvPgpAQCAtMTksOSArMTksMjEgQEAKICAgPGFnZW50cyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IiBJRD0icm9vdENvbnRleHRBZ2VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudHMiPgogICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIi8+CiAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dEFnZW50U3R5bGUyRCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQWdlbnQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlIiBzZWxlY3RlZD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRBZ2VudFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRBZ2VudFN0eWxlJ10iIGFnZW50PSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0QWdlbnQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dEFnZW50U3R5bGUyRCIvPgorICAgIDwvc3R5bGVzPgogICA8L2FnZW50cz4KICAgPGFnZW50cyB4c2k6dHlwZT0ibWV0YWFibTpTQ29udGV4dCIgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IiBJRD0icm9vdENvbnRleHRDb250ZXh0IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dCIvPgorICAgIDxzdHlsZXMgeHNpOnR5cGU9Im1ldGFhYm06U1N0eWxlMkQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSAyRHMiPgorICAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiPgorICAgICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFSdWxlIiBsYWJlbD0iRGVmYXVsdCBSb290IENvbnRleHQgQ29udGV4dCBTdHlsZSIgSUQ9ImRlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10vQHN0eWxlc1tJRD0ncm9vdENvbnRleHRDb250ZXh0U3R5bGUyRCddL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2RlZmF1bHRSb290Q29udGV4dENvbnRleHRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dENvbnRleHQnXSIgcGx1cmFsTGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGVzIi8+CisgICAgICA8L3Jvb3RBY3Rpdml0eT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiA8L21ldGFhYm06U0NvbnRleHQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3REby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0RG8ubWV0YWFibQppbmRleCBhMTVmN2UzLi4zNWNkNWQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3REby5tZXRhYWJtCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RTaW5rSW5wdXRzVGVzdERvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJBIiBJRD0iYSIgcGx1cmFsTGFiZWw9IkFzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE5LDkgKzE5LDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0UmVkby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0UmVkby5tZXRhYWJtCmluZGV4IGExNWY3ZTMuLjM1Y2Q1ZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RTaW5rSW5wdXRzVGVzdFJlZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3RSZWRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJBIiBJRD0iYSIgcGx1cmFsTGFiZWw9IkFzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE5LDkgKzE5LDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0VW5kby5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQudGVzdC90ZXN0L3Jlc3VsdHMvdGVzdFNpbmtJbnB1dHNUZXN0VW5kby5tZXRhYWJtCmluZGV4IDhlNDVjNmMuLjMyNDgyMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5hbWYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZS5lZGl0LnRlc3QvdGVzdC9yZXN1bHRzL3Rlc3RTaW5rSW5wdXRzVGVzdFVuZG8ubWV0YWFibQorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUuZWRpdC50ZXN0L3Rlc3QvcmVzdWx0cy90ZXN0U2lua0lucHV0c1Rlc3RVbmRvLm1ldGFhYm0KQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgogPG1ldGFhYm06U0NvbnRleHQgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphY3Q9Imh0dHA6Ly9tZXRhYWJtLm9yZy9hY3QiIHhtbG5zOm1ldGFhYm09Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUiIGxhYmVsPSJSb290IENvbnRleHQiIElEPSJyb290Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dHMiPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50IiBJRD0icm9vdENvbnRleHRBZ2VudENvdW50IiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGFnZW50cyB0byBjcmVhdGUuIiBzVHlwZT0iSU5URUdFUiIvPgotICA8YXR0cmlidXRlcyBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgQ291bnQiIElEPSJyb290Q29udGV4dENvbnRleHRDb3VudCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50cyIgZGVzY3JpcHRpb249IlRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IGNvbnRleHRzIHRvIGNyZWF0ZS4iIHNUeXBlPSJJTlRFR0VSIi8+CisgIDxhdHRyaWJ1dGVzIGxhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnQiIElEPSJyb290Q29udGV4dEFnZW50Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgQ291bnRzIiBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiByb290IGNvbnRleHQgYWdlbnRzIHRvIGNyZWF0ZS4iLz4KKyAgPGF0dHJpYnV0ZXMgbGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0IENvdW50IiBJRD0icm9vdENvbnRleHRDb250ZXh0Q291bnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCBDb3VudHMiIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBjb250ZXh0cyB0byBjcmVhdGUuIi8+CiAgIDxhdHRyaWJ1dGVzIGxhYmVsPSJBIiBJRD0iYSIgcGx1cmFsTGFiZWw9IkFzIi8+CiAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KICAgICA8bWVtYmVycyB4c2k6dHlwZT0iYWN0OkFCdWlsZCIgbGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dCIgSUQ9ImJ1aWxkUm9vdENvbnRleHQiIHRhcmdldHM9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nY3JlYXRlUm9vdENvbnRleHRBZ2VudHMnXSAvL0Byb290QWN0aXZpdHkvQG1lbWJlcnNbSUQ9J2NyZWF0ZVJvb3RDb250ZXh0Q29udGV4dHMnXSIgc2VsZWN0ZWQ9Ii8vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nYnVpbGRSb290Q29udGV4dCddIiBhZ2VudD0iLyIgcGx1cmFsTGFiZWw9IkJ1aWxkIFJvb3QgQ29udGV4dHMiLz4KQEAgLTE3LDkgKzE3LDIxIEBACiAgIDxhZ2VudHMgbGFiZWw9IlJvb3QgQ29udGV4dCBBZ2VudCIgSUQ9InJvb3RDb250ZXh0QWdlbnQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnRzIj4KICAgICA8cm9vdEFjdGl2aXR5IHhzaTp0eXBlPSJhY3Q6QUdyb3VwIiBsYWJlbD0iQWN0aW9ucyIgSUQ9ImFjdGlvbnMiIHBsdXJhbExhYmVsPSJBY3Rpb25zcyIvPgogICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzc05hbWU9IlJvb3RDb250ZXh0QWdlbnQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIDJEIiBJRD0icm9vdENvbnRleHRBZ2VudFN0eWxlMkQiIHBsdXJhbExhYmVsPSJSb290IENvbnRleHQgQWdlbnQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IEFnZW50IFN0eWxlIiBJRD0iZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSIgc2VsZWN0ZWQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRBZ2VudCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0QWdlbnRTdHlsZTJEJ10vQHJvb3RBY3Rpdml0eS9AbWVtYmVyc1tJRD0nZGVmYXVsdFJvb3RDb250ZXh0QWdlbnRTdHlsZSddIiBhZ2VudD0iLy9AYWdlbnRzW0lEPSdyb290Q29udGV4dEFnZW50J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBBZ2VudCBTdHlsZXMiLz4KKyAgICAgIDwvcm9vdEFjdGl2aXR5PgorICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzTmFtZT0iUm9vdENvbnRleHRBZ2VudFN0eWxlMkQiLz4KKyAgICA8L3N0eWxlcz4KICAgPC9hZ2VudHM+CiAgIDxhZ2VudHMgeHNpOnR5cGU9Im1ldGFhYm06U0NvbnRleHQiIGxhYmVsPSJSb290IENvbnRleHQgQ29udGV4dCIgSUQ9InJvb3RDb250ZXh0Q29udGV4dCIgcGx1cmFsTGFiZWw9IlJvb3QgQ29udGV4dCBDb250ZXh0cyI+CiAgICAgPHJvb3RBY3Rpdml0eSB4c2k6dHlwZT0iYWN0OkFHcm91cCIgbGFiZWw9IkFjdGlvbnMiIElEPSJhY3Rpb25zIiBwbHVyYWxMYWJlbD0iQWN0aW9uc3MiLz4KICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHQiLz4KKyAgICA8c3R5bGVzIHhzaTp0eXBlPSJtZXRhYWJtOlNTdHlsZTJEIiBsYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkQiIElEPSJyb290Q29udGV4dENvbnRleHRTdHlsZTJEIiBwbHVyYWxMYWJlbD0iUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUgMkRzIj4KKyAgICAgIDxyb290QWN0aXZpdHkgeHNpOnR5cGU9ImFjdDpBR3JvdXAiIGxhYmVsPSJBY3Rpb25zIiBJRD0iYWN0aW9ucyIgcGx1cmFsTGFiZWw9IkFjdGlvbnNzIj4KKyAgICAgICAgPG1lbWJlcnMgeHNpOnR5cGU9ImFjdDpBUnVsZSIgbGFiZWw9IkRlZmF1bHQgUm9vdCBDb250ZXh0IENvbnRleHQgU3R5bGUiIElEPSJkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUiIHNlbGVjdGVkPSIvL0BhZ2VudHNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dCddL0BzdHlsZXNbSUQ9J3Jvb3RDb250ZXh0Q29udGV4dFN0eWxlMkQnXS9Acm9vdEFjdGl2aXR5L0BtZW1iZXJzW0lEPSdkZWZhdWx0Um9vdENvbnRleHRDb250ZXh0U3R5bGUnXSIgYWdlbnQ9Ii8vQGFnZW50c1tJRD0ncm9vdENvbnRleHRDb250ZXh0J10iIHBsdXJhbExhYmVsPSJEZWZhdWx0IFJvb3QgQ29udGV4dCBDb250ZXh0IFN0eWxlcyIvPgorICAgICAgPC9yb290QWN0aXZpdHk+CisgICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3NOYW1lPSJSb290Q29udGV4dENvbnRleHRTdHlsZTJEIi8+CisgICAgPC9zdHlsZXM+CiAgIDwvYWdlbnRzPgogPC9tZXRhYWJtOlNDb250ZXh0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYXhmLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5heGYtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAxYTlmYThlLi5iOTM5NjRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYXhmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5heGYtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5heGYtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxyZXF1aXJlcz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMTZkYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi8zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZWYyNjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBUZXN0IEFYRiBJREUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Q7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC45LjAKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLAotIG9yZy5lY2xpcHNlLnN3dGJvdC5lY2xpcHNlLmZpbmRlciwKLSBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlciwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUsCi0gb3JnLmVjbGlwc2UuYW1wLmF4Zi52aWV3cywKLSBvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0LAotIG9yZy5lY2xpcHNlLmFtcC5hZ2YuY29yZSwKLSBvcmcuZWNsaXBzZS5hbXAuYWdmLmlkZSwKLSBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmlkZSwKLSBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmFzY2FwZSwKLSBvcmcuYXNjYXBlLmNvcmUsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSI0LjguMSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L01vZGVsTWFuZ2VtZW50VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvTW9kZWxNYW5nZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDhkNjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvTW9kZWxNYW5nZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBNZXRhc2NhcGUsIExMQy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBNZXRhc2NhcGUgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5heGYuY29yZS5BYnN0cmFjdExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5heGYuY29yZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLklPYnNlcnZhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLk1vZGVsVmlld01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5lY2xpcHNlLmZpbmRlci5TV1RXb3JrYmVuY2hCb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LmVjbGlwc2UuZmluZGVyLndpZGdldHMuU1dUQm90VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5leGNlcHRpb25zLldpZGdldE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90TWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBtcGFya2VyCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLXB1YmxpYyBjbGFzcyBNb2RlbE1hbmdlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gInRlc3QuZXNjYXBlIjsKLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gc3RyZWFtRnJvbVBsdWdpbihTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJCVVSTCBlbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeShwYXRoKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHJlc291cmNlOiIgKyBwYXRoICsgIiBmb3VuZCBpbiBwbHVnaW46ICIgKyBwbHVnaW5JRCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZW50cnkub3BlblN0cmVhbSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGRuJ3QgbG9hZCBwcm9qZWN0IHJlc291cmNlIGZyb20gcGx1Z2luLiIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlcyhTdHJpbmcgc3JjUGx1Z2luSUQsIFN0cmluZyBzcmNGaWxlTG9jLCBTdHJpbmcgZGVzdFByb2plY3ROYW1lLCBTdHJpbmcgZGVzdEZpbGVMb2MpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIHNyY1N0cmVhbSA9IHN0cmVhbUZyb21QbHVnaW4oc3JjUGx1Z2luSUQsIHNyY0ZpbGVMb2MudG9TdHJpbmcoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHNyY1JlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3JjU3RyZWFtKSk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBuZXh0ID0gc3JjUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV4dCArICJcclxuIik7Ci0JCQluZXh0ID0gc3JjUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCX0KLQkJU3RyaW5nIHBhcnNlZFRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0ocGFyc2VkVGV4dCk7Ci0JCUlGaWxlIGRlc3RGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGRlc3RQcm9qZWN0TmFtZSkuZ2V0RmlsZShkZXN0RmlsZUxvYyk7Ci0JCWRlc3RGaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW4gZnV0dXJlIHlvdSB3aWxsIG5vdCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGluc3RhbmNlLiBZb3UgbmVlZCB0byBleHRlbmQKLQkgKiBTV1RCb3RFY2xpcHNlVGVzdENhc2Ugd2hpY2ggaG9sZHMgYW4gaW5zdGFuY2Ugb2YgU1dURWNsaXBzZUJvdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU1dUV29ya2JlbmNoQm90IGJvdCA9IG5ldyBTV1RXb3JrYmVuY2hCb3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFdpZGdldE5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTV1RCb3RUcmVlIHRyZWUoKSB0aHJvd3MgV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gcGFja2FnZUV4cGxvcmVyKCkuYm90KCkudHJlZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFdpZGdldE5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTV1RCb3RWaWV3IHBhY2thZ2VFeHBsb3JlcigpIHRocm93cyBXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBib3Qudmlld0J5VGl0bGUoIlBhY2thZ2UgRXhwbG9yZXIiKTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCS8vIHN1cGVyLnNldFVwKCk7Ci0JLy8gc2V0dXBQcm9qZWN0KCk7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgdGVzdE9uZSgpIHsKLQkJc2V0dXBQcm9qZWN0KCk7Ci0JCWFzc2VydEVxdWFscyhnZWZWaWV3cygpLnNpemUoKSwgMCk7Ci0JCWFzc2VydFRydWUoYWN0aXZlTW9kZWwoKSA9PSBudWxsKTsKLQkJbGF1bmNoTW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAxKTsKLQkJSU1vZGVsIG1vZGVsMSA9IGFjdGl2ZU1vZGVsKCk7Ci0JCXN1YnRlc3RQYXVzZVJlc3VtZVN0b3BTdGFydFJlc3RhcnQobW9kZWwxKTsKLQkJY29udHJvbCgpLm1lbnUoIkNsb3NlIikuY2xpY2soKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQlhc3NlcnRUcnVlKCFtb2RlbDEuZ2V0RW5naW5lKCkuaXNSdW5uaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobWFuYWdlcigpLmdldE1vZGVscygpLnNpemUoKSwgMCk7Ci0JCWFzc2VydE51bGwoIk1vZGVsOiAiICsgYWN0aXZlTW9kZWwoKSwgYWN0aXZlTW9kZWwoKSk7Ci0JCWFzc2VydEVxdWFscyhnZWZWaWV3cygpLnNpemUoKSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb3NlT25lKCkgewotCQlzZXR1cFByb2plY3QoKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQkvLyBzdGFydCBuZXcKLQkJbGF1bmNoTW9kZWwoKTsKLQkJYm90LnNsZWVwKDQwMDApOwotCQlJTW9kZWwgbW9kZWxBXzEgPSBhY3RpdmVNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsQV8xKTsKLQotCQlzdWJ0ZXN0Q2xvc2VWaWV3cyhtb2RlbEFfMSk7Ci0JCVNXVEJvdFZpZXcgc3d0R3JhcGhpY3NWaWV3ID0gZ2VmVmlld3MoKS5nZXQoMCk7Ci0JCXN3dEdyYXBoaWNzVmlldy5jbG9zZSgpOwotCQlib3Quc2xlZXAoMzAwMCk7Ci0JCUlNb2RlbCBpTW9kZWwgPSBtYW5hZ2VyKCkuZ2V0TW9kZWxzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKGlNb2RlbC5nZXRQZXJpb2QoKSArICJ0b28gYmlnISIsIGlNb2RlbC5nZXRQZXJpb2QoKSA8IDUwMCk7Ci0JCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgzMDAwKTsKLQotCQkvLyBzdGFydCBuZXcKLQkJbGF1bmNoTW9kZWwoKTsKLQkJSU1vZGVsIG1vZGVsQV8xXzIgPSBhY3RpdmVNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsQV8xXzIpOwotCQlzdWJ0ZXN0Q2xvc2VWaWV3cyhtb2RlbEFfMV8yKTsKLQkJU1dUQm90VmlldyBzd3RDaGFydFZpZXcgPSBjaGFydFZpZXdzKCkuZ2V0KDApOwotCQlzd3RDaGFydFZpZXcuY2xvc2UoKTsKLQkJYm90LnNsZWVwKDMwMDApOwotCQlJTW9kZWwgaU1vZGVsMiA9IG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoaU1vZGVsMi5nZXRQZXJpb2QoKSArICJ0b28gYmlnISIsIGlNb2RlbDIuZ2V0UGVyaW9kKCkgPCA1MDApOwotCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOwotCi0JCWJvdC5zbGVlcCgzMDAwKTsKLQotCQltb2RlbEFfMSA9IGFjdGl2ZU1vZGVsKCk7Ci0JCWFzc2VydE51bGwobW9kZWxBXzEpOwotCi0JCWFzc2VydEVxdWFscyhtYW5hZ2VyKCkuZ2V0TW9kZWxzKCkuc2l6ZSgpLCAwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VidGVzdENsb3NlVmlld3MoSU1vZGVsIG1vZGVsQV8xKSB7Ci0JCUxpc3Q8SVZpZXdQYXJ0PiB2aWV3c0FfMSA9IG1hbmFnZXIoKS5nZXRWaWV3cyhtb2RlbEFfMSk7Ci0JCWFzc2VydEVxdWFscyh2aWV3c0FfMS5zaXplKCksIDIpOwotCQlJVmlld1BhcnQgY2hhcnRWaWV3ID0gdmlld3NBXzEuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoY2hhcnRWaWV3LmdldFRpdGxlKCksICJEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEgQ2hhcnQgVmlldyIpOwotCQlJVmlld1BhcnQgZ2VmVmlldyA9IHZpZXdzQV8xLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKGdlZlZpZXcuZ2V0VGl0bGUoKSwgIkRlbW9ncmFwaGljIFByaXNvbmVyX3MgRGlsZW1tYSBHcmFwaGljIFZpZXciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvKCkgewotCQlzZXR1cFByb2plY3QoKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQkvLyBzdGFydCBuZXcKLQkJbGF1bmNoTW9kZWwoKTsKLQkJSU1vZGVsIG1vZGVsQV8xID0gYWN0aXZlTW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChtb2RlbEFfMSk7Ci0JCWFzc2VydEVxdWFscyhnZWZWaWV3cygpLnNpemUoKSwgMSk7Ci0KLQkJLy8gc3RhcnQgYW5vdGhlcgotCQlsYXVuY2hNb2RlbCgpOwotCQlJTW9kZWwgbW9kZWxBXzIgPSBhY3RpdmVNb2RlbCgpOwotCQlzdWJ0ZXN0UGF1c2VSZXN1bWVTdG9wU3RhcnRSZXN0YXJ0KG1vZGVsQV8yKTsKLQkJYXNzZXJ0Tm90U2FtZShtb2RlbEFfMSwgbW9kZWxBXzIpOwotCQlhc3NlcnRFcXVhbHMoZ2VmVmlld3MoKS5zaXplKCksIDIpOwotCi0JCUxpc3Q8SVZpZXdQYXJ0PiB2aWV3c0FfMSA9IG1hbmFnZXIoKS5nZXRWaWV3cyhtb2RlbEFfMSk7Ci0JCWFzc2VydEVxdWFscyh2aWV3c0FfMS5zaXplKCksIDIpOwotCQlhY3RpdmF0ZVZpZXcodmlld3NBXzEpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCWFzc2VydEVxdWFscyhhY3RpdmVNb2RlbCgpLCBtb2RlbEFfMSk7Ci0KLQkJY29udHJvbCgpLm1lbnUoIlBhdXNlIikuY2xpY2soKTsKLQkJYm90LnNsZWVwKDEwMDApOwotCQlhc3NlcnRUcnVlKGFjdGl2ZU1vZGVsKCkuZ2V0RW5naW5lKCkuaXNQYXVzZWQoKSk7Ci0KLQkJTGlzdDxJVmlld1BhcnQ+IHZpZXdzQV8yID0gbWFuYWdlcigpLmdldFZpZXdzKG1vZGVsQV8yKTsKLQkJYXNzZXJ0RXF1YWxzKHZpZXdzQV8yLnNpemUoKSwgMik7Ci0JCWFjdGl2YXRlVmlldyh2aWV3c0FfMik7Ci0JCWJvdC5zbGVlcCgyMDAwKTsKLQkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8yKTsKLQkJYXNzZXJ0VHJ1ZSghYWN0aXZlTW9kZWwoKS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKLQotCQlhY3RpdmF0ZVZpZXcodmlld3NBXzEpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCWFzc2VydFRydWUoYWN0aXZlTW9kZWwoKS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKLQotCQkvLyByYXBpZCBjeWNsZQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJYWN0aXZhdGVWaWV3KHZpZXdzQV8xKTsKLQkJCWJvdC5zbGVlcCgxMDAwKTsKLQkJCWFzc2VydEVxdWFscyhhY3RpdmVNb2RlbCgpLCBtb2RlbEFfMSk7Ci0JCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpOwotCQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlBhdXNlIikuaXNFbmFibGVkKCkpOwotCQkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiU3RvcCIpLmlzRW5hYmxlZCgpKTsKLQkJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmlzRW5hYmxlZCgpKTsKLQkJCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJTdGFydCIpLmlzRW5hYmxlZCgpKTsKLQkJCWFjdGl2YXRlVmlldyh2aWV3c0FfMik7Ci0JCQlib3Quc2xlZXAoNTAwKTsKLQkJCWFzc2VydEVxdWFscyhhY3RpdmVNb2RlbCgpLCBtb2RlbEFfMik7Ci0JCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpOwotCQkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiUGF1c2UiKS5pc0VuYWJsZWQoKSk7Ci0JCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJTdG9wIikuaXNFbmFibGVkKCkpOwotCQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmlzRW5hYmxlZCgpKTsKLQkJCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJTdGFydCIpLmlzRW5hYmxlZCgpKTsKLQkJfQotCi0JCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCg0MDAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5zaXplKCksIDEpOwotCQlhc3NlcnRUcnVlKG1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbCgpID09IG1vZGVsQV8xKTsKLQkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAxKTsKLQkJYWN0aXZhdGVWaWV3KHZpZXdzQV8xKTsKLQkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiUmVzdGFydCIpLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlBhdXNlIikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJTdG9wIikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN1bWUiKS5pc0VuYWJsZWQoKSk7Ci0JCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJTdGFydCIpLmlzRW5hYmxlZCgpKTsKLQkJY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgxNTAwKTsKLQkJc3ViVGVzdFBhdXNlUmVzdW1lKG1vZGVsQV8xKTsKLQkJc3ViVGVzdFN0b3BTdGFydFJlc3RhcnQobW9kZWxBXzEpOwotCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCWFzc2VydEVxdWFscyhnZWZWaWV3cygpLnNpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhtYW5hZ2VyKCkuZ2V0TW9kZWxzKCkuc2l6ZSgpLCAwKTsKLQkJYXNzZXJ0TnVsbChtYW5hZ2VyKCkuZ2V0QWN0aXZlTW9kZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3BQYXVzZSgpIHsKLQkJc2V0dXBQcm9qZWN0KCk7Ci0JCWJvdC5zbGVlcCgyMDAwKTsKLQkJLy8gc3RhcnQgbmV3Ci0JCWxhdW5jaE1vZGVsKCk7Ci0JCUlNb2RlbCBtb2RlbEFfMSA9IGFjdGl2ZU1vZGVsKCk7Ci0JCWNvbnRyb2woKS5tZW51KCJQYXVzZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgxMDAwKTsKLQkJYXNzZXJ0VHJ1ZShhY3RpdmVNb2RlbCgpLmdldEVuZ2luZSgpLmlzUGF1c2VkKCkpOwotCi0JCS8vIHN0YXJ0IGFub3RoZXIKLQkJbGF1bmNoTW9kZWwoKTsKLQotCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCWFzc2VydFRydWUoYWN0aXZlTW9kZWwoKS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8xKTsKLQkJYXNzZXJ0RXF1YWxzKG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5zaXplKCksIDEpOwotCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiUGF1c2UiKS5pc0VuYWJsZWQoKSk7Ci0JCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlN0b3AiKS5pc0VuYWJsZWQoKSk7Ci0JCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmlzRW5hYmxlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlN0YXJ0IikuaXNFbmFibGVkKCkpOwotCi0JCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgyMDAwKTsKLQkJYXNzZXJ0TnVsbChtYW5hZ2VyKCkuZ2V0QWN0aXZlTW9kZWwoKSk7Ci0JCWFzc2VydE51bGwoY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3BUd28oKSB7Ci0JCXNldHVwUHJvamVjdCgpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCS8vIHN0YXJ0IG5ldwotCQlsYXVuY2hNb2RlbCgpOwotCQlJTW9kZWwgbW9kZWxBXzEgPSBhY3RpdmVNb2RlbCgpOwotCi0JCS8vIHN0YXJ0IGFub3RoZXIKLQkJbGF1bmNoTW9kZWwoKTsKLQkJSU1vZGVsIG1vZGVsQV8yID0gYWN0aXZlTW9kZWwoKTsKLQotCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOwotCQlib3Quc2xlZXAoMjAwMCk7Ci0JCWFzc2VydEVxdWFscyhhY3RpdmVNb2RlbCgpLCBtb2RlbEFfMSk7Ci0JCWFzc2VydEVxdWFscyhtYW5hZ2VyKCkuZ2V0TW9kZWxzKCkuc2l6ZSgpLCAxKTsKLQkJYXNzZXJ0VHJ1ZShtb2RlbEFfMS5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKSk7Ci0JCWFzc2VydEZhbHNlKG1vZGVsQV8yLmdldEVuZ2luZSgpLmlzUnVubmluZygpKTsKLQkJaWYgKCFjb250cm9sKCkubWVudSgiUmVzdGFydCIpLmlzRW5hYmxlZCgpKSB7Ci0JCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpOwotCQl9Ci0JCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlBhdXNlIikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJTdG9wIikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiUmVzdW1lIikuaXNFbmFibGVkKCkpOwotCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiU3RhcnQiKS5pc0VuYWJsZWQoKSk7Ci0KLQkJY29udHJvbCgpLm1lbnUoIkNsb3NlIikuY2xpY2soKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQlhc3NlcnROdWxsKG1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250cm9sKCkgPT0gbnVsbCB8fCBjb250cm9sKCkubWVudSgiU3RhcnQiKSA9PSBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF1bmNoTW9kZWwoKSB7Ci0JCXRyZWUoKS5zZXRGb2N1cygpOwotCQl0cmVlKCkuc2VsZWN0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCVNXVEJvdFRyZWVJdGVtIHByb2plY3ROb2RlID0gdHJlZSgpLmV4cGFuZE5vZGUodGVzdFByb2plY3ROYW1lKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQlwcm9qZWN0Tm9kZS5leHBhbmROb2RlKCJUZXN0TW9kZWwubWV0YWFibSIpLmRvdWJsZUNsaWNrKCk7Ci0JCXBhY2thZ2VFeHBsb3JlcigpLnNldEZvY3VzKCk7Ci0JCWJvdC5zbGVlcCgyMDAwKTsKLQotCQljb250cm9sKCkubWVudSgiRXhlY3V0ZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCg0MDAwKTsKLQl9Ci0KLQlpbnQgY291bnQ7Ci0KLQlwdWJsaWMgdm9pZCB1dGVzdFdvcmtiZW5jaE1vZGVsTGlzdGVuZXJzKCkgewotCQljb3VudCA9IDA7Ci0JCW1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbExpc3RlbmVycygpLmFkZExpc3RlbmVyKG5ldyBBYnN0cmFjdExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQkJT2JqZWN0IG1vZGVsOwotCi0JCQlwdWJsaWMgdm9pZCBvYnNlcnZpbmcoSU9ic2VydmF0aW9uUHJvdmlkZXIgb2JzZXJ2ZWQpIHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlmYWlsKCJNb3JlIHRoYW4gb25lIG1vZGVsIGxpc3RlbmVkIHRvLiIpOwotCQkJCX0KLQkJCQltb2RlbCA9IG9ic2VydmVkOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG9ic2VydmF0aW9uRW5kKElPYnNlcnZhdGlvblByb3ZpZGVyIG9ic2VydmVkKSB7Ci0JCQkJbW9kZWwgPSBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZShPYmplY3Qga2V5LCBPYmplY3QgdXBkYXRlZCkgewotCQkJCXN1cGVyLnN0YXRlQ2hhbmdlKGtleSwgdXBkYXRlZCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh1cGRhdGVkID09IG1vZGVsIHx8IHVwZGF0ZWQgPT0gbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCQlsYXVuY2hNb2RlbCgpOwotCQlsYXVuY2hNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoY291bnQsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZVZpZXcoZmluYWwgTGlzdDxJVmlld1BhcnQ+IHZpZXdzKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKVswXS5nZXRBY3RpdmVQYWdlKCkuYWN0aXZhdGUodmlld3MuZ2V0KDApKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1YnRlc3RQYXVzZVJlc3VtZVN0b3BTdGFydFJlc3RhcnQoSU1vZGVsIG1vZGVsMSkgewotCQlhc3NlcnRUcnVlKG1vZGVsMSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShtb2RlbDEuZ2V0RW5naW5lKCkuaXNSdW5uaW5nKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJc3ViVGVzdFBhdXNlUmVzdW1lKG1vZGVsMSk7Ci0JCX0KLQkJc3ViVGVzdFN0b3BTdGFydFJlc3RhcnQobW9kZWwxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3ViVGVzdFN0b3BTdGFydFJlc3RhcnQoSU1vZGVsIG1vZGVsMSkgewotCQljb250cm9sKCkubWVudSgiU3RvcCIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgyMDAwKTsKLQkJYXNzZXJ0VHJ1ZSghbW9kZWwxLmdldEVuZ2luZSgpLmlzUnVubmluZygpKTsKLQkJY29udHJvbCgpLm1lbnUoIlN0YXJ0IikuY2xpY2soKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQlhc3NlcnRUcnVlKG1vZGVsMS5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKSk7Ci0JCWNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuY2xpY2soKTsKLQkJYm90LnNsZWVwKDIwMDApOwotCQlhc3NlcnRUcnVlKG1vZGVsMS5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1YlRlc3RQYXVzZVJlc3VtZShJTW9kZWwgbW9kZWwxKSB7Ci0JCWNvbnRyb2woKS5tZW51KCJQYXVzZSIpLmNsaWNrKCk7Ci0JCWJvdC5zbGVlcCgxNTAwKTsKLQkJYXNzZXJ0VHJ1ZShtb2RlbDEuZ2V0RW5naW5lKCkuaXNQYXVzZWQoKSk7Ci0JCWNvbnRyb2woKS5tZW51KCJSZXN1bWUiKS5jbGljaygpOwotCQlib3Quc2xlZXAoMTUwMCk7Ci0JCWFzc2VydFRydWUoIW1vZGVsMS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U1dUQm90Vmlldz4gZ2VmVmlld3MoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyByZXR1cm4KLQkJLy8gYm90LnZpZXdzKFdpZGdldE1hdGNoZXJGYWN0b3J5LndpdGhQYXJ0TmFtZSgiRGVtb2dyYXBoaWMgUHJpc29uZXJfcyBEaWxlbW1hIEdyYXBoaWMgVmlldyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U1dUQm90Vmlldz4gY2hhcnRWaWV3cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIHJldHVybgotCQkvLyBib3Qudmlld3MoV2lkZ2V0TWF0Y2hlckZhY3Rvcnkud2l0aFBhcnROYW1lKCJEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEgQ2hhcnQgVmlldyIpKTsKLQl9Ci0KLQlwcml2YXRlIFNXVEJvdE1lbnUgY29udHJvbCgpIHsKLQkJcmV0dXJuIGJvdC5tZW51KCJDb250cm9sIik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFZpZXdNYW5hZ2VyIG1hbmFnZXIoKSB7Ci0JCXJldHVybiBNb2RlbFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTW9kZWwgYWN0aXZlTW9kZWwoKSB7Ci0JCXJldHVybiAoSU1vZGVsKSBtYW5hZ2VyKCkuZ2V0QWN0aXZlTW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0dXBQcm9qZWN0KCkgewotCQkvLyBib3Qudmlld0J5VGl0bGUoIldlbGNvbWUiKS5jbG9zZSgpOwotCQlib3QucGVyc3BlY3RpdmVCeUxhYmVsKCJBZ2VudCBNb2RlbGluZyIpLmFjdGl2YXRlKCk7Ci0JCWJvdC52aWV3QnlUaXRsZSgiUGFja2FnZSBFeHBsb3JlciIpLnNldEZvY3VzKCk7Ci0JCXRyeSB7Ci0JCQl0cmVlKCkuZXhwYW5kTm9kZSh0ZXN0UHJvamVjdE5hbWUpOwotCQl9IGNhdGNoIChXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlib3Quc2xlZXAoMzAwMCk7Ci0JCQlib3QubWVudSgiRmlsZSIpLm1lbnUoIk5ldyIpLm1lbnUoIkVzY2FwZSBQcm9qZWN0IikuY2xpY2soKTsKLQkJCS8vICdjb20uc3d0Ym90LnRlc3QucHJvamVjdCcgaXMgdGhlIGphdmEgcHJvamVjdCBuYW1lIHRvIGNyZWF0ZQotCi0JCQlib3QudGV4dCgwKS5zZXRUZXh0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCQkvLyBDbGljayB0aGUgRmluaXNoIGJ1dHRvbgotCi0JCQlib3QuYnV0dG9uKCJGaW5pc2giKS5jbGljaygpOwotCQkJdHJ5IHsKLQkJCQljb3B5RmlsZXMoIm9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QiLCAicmVzL1Rlc3RNb2RlbC5tZXRhYWJtIiwgdGVzdFByb2plY3ROYW1lLCAiVGVzdE1vZGVsLm1ldGFhYm0iKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlMSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUxKTsKLQkJCX0KLQkJCWJvdC5zbGVlcCg1MDAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGRmZTZjZmYuLjEyZWQ2MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTEwLDggKzEwLDcgQEAKICBvcmcuZWNsaXBzZS51aSwKICBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAogIG9yZy5lY2xpcHNlLmFtcC5heGYuY29yZSwKLSBvcmcuZWNsaXBzZS5hbXAuYXhmLnZpZXdzLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iNC44LjEiCisgb3JnLmVjbGlwc2UuYW1wLmF4Zi52aWV3cwogRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLAogICAgb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUuaGFuZGxlcnMsCiAgb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0Ly5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Q0YjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0Ly5wcm9qZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC8ucHJvamVjdApyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0Ly5wcm9qZWN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMGUxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBUZXN0IEFYRiBJREUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Q7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMC45LjAKK0ZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLAorIG9yZy5lY2xpcHNlLnN3dGJvdC5lY2xpcHNlLmZpbmRlciwKKyBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlciwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKKyBvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUsCisgb3JnLmVjbGlwc2UuYW1wLmF4Zi52aWV3cywKKyBvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0LAorIG9yZy5lY2xpcHNlLmFtcC5hZ2YuY29yZSwKKyBvcmcuZWNsaXBzZS5hbXAuYWdmLmlkZSwKKyBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmlkZSwKKyBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmFzY2FwZSwKKyBvcmcuYXNjYXBlLmNvcmUsCisgb3JnLmVjbGlwc2UuamR0Lmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjcuMCIsCisgb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMiIKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvYWJvdXQuaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvYWJvdXQuaHRtbApyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L2Fib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvYnVpbGQucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvYnVpbGQucHJvcGVydGllcwpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L2J1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3Jlcy9UZXN0TW9kZWwuYXBhciBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9yZXMvVGVzdE1vZGVsLmFwYXIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3Jlcy9UZXN0TW9kZWwuYXBhcgpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3Jlcy9UZXN0TW9kZWwuYXBhcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvcmVzL1Rlc3RNb2RlbC5hdGVzdCBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9yZXMvVGVzdE1vZGVsLmF0ZXN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9yZXMvVGVzdE1vZGVsLmF0ZXN0CnJlbmFtZSB0byBvcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvcmVzL1Rlc3RNb2RlbC5hdGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvcmVzL1Rlc3RNb2RlbC5tZXRhYWJtIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3Jlcy9UZXN0TW9kZWwubWV0YWFibQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvcmVzL1Rlc3RNb2RlbC5tZXRhYWJtCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3QvcmVzL1Rlc3RNb2RlbC5tZXRhYWJtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvRW5naW5lU3RhdGVTZXJ2aWNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9FbmdpbmVTdGF0ZVNlcnZpY2VUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9FbmdpbmVTdGF0ZVNlcnZpY2VUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvRW5naW5lU3RhdGVTZXJ2aWNlVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvQ2xvc2VIYW5kbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9DbG9zZUhhbmRsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9DbG9zZUhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvQ2xvc2VIYW5kbGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvTW9kZWxSdW5IYW5kbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9Nb2RlbFJ1bkhhbmRsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9Nb2RlbFJ1bkhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvTW9kZWxSdW5IYW5kbGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUGF1c2VIYW5kbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9QYXVzZUhhbmRsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9QYXVzZUhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUGF1c2VIYW5kbGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUmVzdGFydEhhbmRsZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL2hhbmRsZXJzL1Jlc3RhcnRIYW5kbGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUmVzdGFydEhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUmVzdGFydEhhbmRsZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9SZXN1bWVIYW5kbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9SZXN1bWVIYW5kbGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvUmVzdW1lSGFuZGxlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9SZXN1bWVIYW5kbGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RhcnRIYW5kbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9TdGFydEhhbmRsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9TdGFydEhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RhcnRIYW5kbGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RlcEhhbmRsZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL2hhbmRsZXJzL1N0ZXBIYW5kbGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RlcEhhbmRsZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RlcEhhbmRsZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9TdG9wSGFuZGxlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvaGFuZGxlcnMvU3RvcEhhbmRsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9TdG9wSGFuZGxlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS9oYW5kbGVycy9TdG9wSGFuZGxlclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvQWN0aXZhdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L0FjdGl2YXRvci5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvQWN0aXZhdG9yLmphdmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvdGVzdC9Nb2RlbE1hbmdlbWVudFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvdGVzdC9Nb2RlbE1hbmdlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTk1ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L01vZGVsTWFuZ2VtZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQ5IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1ldGFzY2FwZSwgTExDLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgIE1ldGFzY2FwZSAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoKKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLkFic3RyYWN0TGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi5jb3JlLklNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUuSU9ic2VydmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUuTW9kZWxWaWV3TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LmVjbGlwc2UuZmluZGVyLlNXVFdvcmtiZW5jaEJvdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3QuZWNsaXBzZS5maW5kZXIud2lkZ2V0cy5TV1RCb3RWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLmV4Y2VwdGlvbnMuV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RNZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFRyZWVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKKy8qKgorICogCisgKiBAYXV0aG9yIG1wYXJrZXIKKyAqIAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorcHVibGljIGNsYXNzIE1vZGVsTWFuZ2VtZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCVN0cmluZyB0ZXN0UHJvamVjdE5hbWUgPSAidGVzdC5lc2NhcGUiOworCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBzdHJlYW1Gcm9tUGx1Z2luKFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIHBhdGgpIHsKKwkJdHJ5IHsKKwkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOworCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOworCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gcmVzb3VyY2U6IiArIHBhdGggKyAiIGZvdW5kIGluIHBsdWdpbjogIiArIHBsdWdpbklEKTsKKwkJCX0KKwkJCXJldHVybiBlbnRyeS5vcGVuU3RyZWFtKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZG4ndCBsb2FkIHByb2plY3QgcmVzb3VyY2UgZnJvbSBwbHVnaW4uIiwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGVzKFN0cmluZyBzcmNQbHVnaW5JRCwgU3RyaW5nIHNyY0ZpbGVMb2MsIFN0cmluZyBkZXN0UHJvamVjdE5hbWUsIFN0cmluZyBkZXN0RmlsZUxvYykgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gc3JjU3RyZWFtID0gc3RyZWFtRnJvbVBsdWdpbihzcmNQbHVnaW5JRCwgc3JjRmlsZUxvYy50b1N0cmluZygpKTsKKwkJQnVmZmVyZWRSZWFkZXIgc3JjUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzcmNTdHJlYW0pKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJU3RyaW5nIG5leHQgPSBzcmNSZWFkZXIucmVhZExpbmUoKTsKKwkJd2hpbGUgKG5leHQgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZChuZXh0ICsgIlxyXG4iKTsKKwkJCW5leHQgPSBzcmNSZWFkZXIucmVhZExpbmUoKTsKKwkJfQorCQlTdHJpbmcgcGFyc2VkVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOworCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShwYXJzZWRUZXh0KTsKKwkJSUZpbGUgZGVzdEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZGVzdFByb2plY3ROYW1lKS5nZXRGaWxlKGRlc3RGaWxlTG9jKTsKKwkJZGVzdEZpbGUuY3JlYXRlKGlzLCB0cnVlLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBJbiBmdXR1cmUgeW91IHdpbGwgbm90IG5lZWQgdG8gY3JlYXRlIHRoaXMgaW5zdGFuY2UuIFlvdSBuZWVkIHRvIGV4dGVuZAorCSAqIFNXVEJvdEVjbGlwc2VUZXN0Q2FzZSB3aGljaCBob2xkcyBhbiBpbnN0YW5jZSBvZiBTV1RFY2xpcHNlQm90LgorCSAqLworCXByb3RlY3RlZCBTV1RXb3JrYmVuY2hCb3QgYm90ID0gbmV3IFNXVFdvcmtiZW5jaEJvdCgpOworCisJLyoqCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIFNXVEJvdFRyZWUgdHJlZSgpIHRocm93cyBXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXJldHVybiBwYWNrYWdlRXhwbG9yZXIoKS5ib3QoKS50cmVlKCk7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIFNXVEJvdFZpZXcgcGFja2FnZUV4cGxvcmVyKCkgdGhyb3dzIFdpZGdldE5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGJvdC52aWV3QnlUaXRsZSgiUGFja2FnZSBFeHBsb3JlciIpOworCX0KKworCS8vIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gc3VwZXIuc2V0VXAoKTsKKwkvLyBzZXR1cFByb2plY3QoKTsKKwkvLyB9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T25lKCkgeworCQlzZXR1cFByb2plY3QoKTsKKwkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAwKTsKKwkJYXNzZXJ0VHJ1ZShhY3RpdmVNb2RlbCgpID09IG51bGwpOworCQlsYXVuY2hNb2RlbCgpOworCQlhc3NlcnRFcXVhbHMoZ2VmVmlld3MoKS5zaXplKCksIDEpOworCQlJTW9kZWwgbW9kZWwxID0gYWN0aXZlTW9kZWwoKTsKKwkJc3VidGVzdFBhdXNlUmVzdW1lU3RvcFN0YXJ0UmVzdGFydChtb2RlbDEpOworCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCWFzc2VydFRydWUoIW1vZGVsMS5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKSk7CisJCWFzc2VydEVxdWFscyhtYW5hZ2VyKCkuZ2V0TW9kZWxzKCkuc2l6ZSgpLCAwKTsKKwkJYXNzZXJ0TnVsbCgiTW9kZWw6ICIgKyBhY3RpdmVNb2RlbCgpLCBhY3RpdmVNb2RlbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAwKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VPbmUoKSB7CisJCXNldHVwUHJvamVjdCgpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCS8vIHN0YXJ0IG5ldworCQlsYXVuY2hNb2RlbCgpOworCQlib3Quc2xlZXAoNDAwMCk7CisJCUlNb2RlbCBtb2RlbEFfMSA9IGFjdGl2ZU1vZGVsKCk7CisJCWFzc2VydE5vdE51bGwobW9kZWxBXzEpOworCisJCXN1YnRlc3RDbG9zZVZpZXdzKG1vZGVsQV8xKTsKKwkJU1dUQm90VmlldyBzd3RHcmFwaGljc1ZpZXcgPSBnZWZWaWV3cygpLmdldCgwKTsKKwkJc3d0R3JhcGhpY3NWaWV3LmNsb3NlKCk7CisJCWJvdC5zbGVlcCgzMDAwKTsKKwkJSU1vZGVsIGlNb2RlbCA9IG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5nZXQoMCk7CisJCWFzc2VydFRydWUoaU1vZGVsLmdldFBlcmlvZCgpICsgInRvbyBiaWchIiwgaU1vZGVsLmdldFBlcmlvZCgpIDwgNTAwKTsKKwkJY29udHJvbCgpLm1lbnUoIkNsb3NlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDMwMDApOworCisJCS8vIHN0YXJ0IG5ldworCQlsYXVuY2hNb2RlbCgpOworCQlJTW9kZWwgbW9kZWxBXzFfMiA9IGFjdGl2ZU1vZGVsKCk7CisJCWFzc2VydE5vdE51bGwobW9kZWxBXzFfMik7CisJCXN1YnRlc3RDbG9zZVZpZXdzKG1vZGVsQV8xXzIpOworCQlTV1RCb3RWaWV3IHN3dENoYXJ0VmlldyA9IGNoYXJ0Vmlld3MoKS5nZXQoMCk7CisJCXN3dENoYXJ0Vmlldy5jbG9zZSgpOworCQlib3Quc2xlZXAoMzAwMCk7CisJCUlNb2RlbCBpTW9kZWwyID0gbWFuYWdlcigpLmdldE1vZGVscygpLmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShpTW9kZWwyLmdldFBlcmlvZCgpICsgInRvbyBiaWchIiwgaU1vZGVsMi5nZXRQZXJpb2QoKSA8IDUwMCk7CisJCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7CisKKwkJYm90LnNsZWVwKDMwMDApOworCisJCW1vZGVsQV8xID0gYWN0aXZlTW9kZWwoKTsKKwkJYXNzZXJ0TnVsbChtb2RlbEFfMSk7CisKKwkJYXNzZXJ0RXF1YWxzKG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5zaXplKCksIDApOworCX0KKworCXByaXZhdGUgdm9pZCBzdWJ0ZXN0Q2xvc2VWaWV3cyhJTW9kZWwgbW9kZWxBXzEpIHsKKwkJTGlzdDxJVmlld1BhcnQ+IHZpZXdzQV8xID0gbWFuYWdlcigpLmdldFZpZXdzKG1vZGVsQV8xKTsKKwkJYXNzZXJ0RXF1YWxzKHZpZXdzQV8xLnNpemUoKSwgMik7CisJCUlWaWV3UGFydCBjaGFydFZpZXcgPSB2aWV3c0FfMS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhjaGFydFZpZXcuZ2V0VGl0bGUoKSwgIkRlbW9ncmFwaGljIFByaXNvbmVyX3MgRGlsZW1tYSBDaGFydCBWaWV3Iik7CisJCUlWaWV3UGFydCBnZWZWaWV3ID0gdmlld3NBXzEuZ2V0KDEpOworCQlhc3NlcnRFcXVhbHMoZ2VmVmlldy5nZXRUaXRsZSgpLCAiRGVtb2dyYXBoaWMgUHJpc29uZXJfcyBEaWxlbW1hIEdyYXBoaWMgVmlldyIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RUd28oKSB7CisJCXNldHVwUHJvamVjdCgpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCS8vIHN0YXJ0IG5ldworCQlsYXVuY2hNb2RlbCgpOworCQlJTW9kZWwgbW9kZWxBXzEgPSBhY3RpdmVNb2RlbCgpOworCQlhc3NlcnROb3ROdWxsKG1vZGVsQV8xKTsKKwkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAxKTsKKworCQkvLyBzdGFydCBhbm90aGVyCisJCWxhdW5jaE1vZGVsKCk7CisJCUlNb2RlbCBtb2RlbEFfMiA9IGFjdGl2ZU1vZGVsKCk7CisJCXN1YnRlc3RQYXVzZVJlc3VtZVN0b3BTdGFydFJlc3RhcnQobW9kZWxBXzIpOworCQlhc3NlcnROb3RTYW1lKG1vZGVsQV8xLCBtb2RlbEFfMik7CisJCWFzc2VydEVxdWFscyhnZWZWaWV3cygpLnNpemUoKSwgMik7CisKKwkJTGlzdDxJVmlld1BhcnQ+IHZpZXdzQV8xID0gbWFuYWdlcigpLmdldFZpZXdzKG1vZGVsQV8xKTsKKwkJYXNzZXJ0RXF1YWxzKHZpZXdzQV8xLnNpemUoKSwgMik7CisJCWFjdGl2YXRlVmlldyh2aWV3c0FfMSk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8xKTsKKworCQljb250cm9sKCkubWVudSgiUGF1c2UiKS5jbGljaygpOworCQlib3Quc2xlZXAoMTAwMCk7CisJCWFzc2VydFRydWUoYWN0aXZlTW9kZWwoKS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKKworCQlMaXN0PElWaWV3UGFydD4gdmlld3NBXzIgPSBtYW5hZ2VyKCkuZ2V0Vmlld3MobW9kZWxBXzIpOworCQlhc3NlcnRFcXVhbHModmlld3NBXzIuc2l6ZSgpLCAyKTsKKwkJYWN0aXZhdGVWaWV3KHZpZXdzQV8yKTsKKwkJYm90LnNsZWVwKDIwMDApOworCQlhc3NlcnRFcXVhbHMoYWN0aXZlTW9kZWwoKSwgbW9kZWxBXzIpOworCQlhc3NlcnRUcnVlKCFhY3RpdmVNb2RlbCgpLmdldEVuZ2luZSgpLmlzUGF1c2VkKCkpOworCisJCWFjdGl2YXRlVmlldyh2aWV3c0FfMSk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJYXNzZXJ0VHJ1ZShhY3RpdmVNb2RlbCgpLmdldEVuZ2luZSgpLmlzUGF1c2VkKCkpOworCisJCS8vIHJhcGlkIGN5Y2xlCisJCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlhY3RpdmF0ZVZpZXcodmlld3NBXzEpOworCQkJYm90LnNsZWVwKDEwMDApOworCQkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8xKTsKKwkJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKS5pc0VuYWJsZWQoKSk7CisJCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiUGF1c2UiKS5pc0VuYWJsZWQoKSk7CisJCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJTdG9wIikuaXNFbmFibGVkKCkpOworCQkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiUmVzdW1lIikuaXNFbmFibGVkKCkpOworCQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlN0YXJ0IikuaXNFbmFibGVkKCkpOworCQkJYWN0aXZhdGVWaWV3KHZpZXdzQV8yKTsKKwkJCWJvdC5zbGVlcCg1MDApOworCQkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8yKTsKKwkJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKS5pc0VuYWJsZWQoKSk7CisJCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJQYXVzZSIpLmlzRW5hYmxlZCgpKTsKKwkJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlN0b3AiKS5pc0VuYWJsZWQoKSk7CisJCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiUmVzdW1lIikuaXNFbmFibGVkKCkpOworCQkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlN0YXJ0IikuaXNFbmFibGVkKCkpOworCQl9CisKKwkJY29udHJvbCgpLm1lbnUoIkNsb3NlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDQwMDApOworCQlhc3NlcnRFcXVhbHMobWFuYWdlcigpLmdldE1vZGVscygpLnNpemUoKSwgMSk7CisJCWFzc2VydFRydWUobWFuYWdlcigpLmdldEFjdGl2ZU1vZGVsKCkgPT0gbW9kZWxBXzEpOworCQlhc3NlcnRFcXVhbHMoZ2VmVmlld3MoKS5zaXplKCksIDEpOworCQlhY3RpdmF0ZVZpZXcodmlld3NBXzEpOworCQlhc3NlcnRUcnVlKGNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpOworCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiUGF1c2UiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlN0b3AiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmlzRW5hYmxlZCgpKTsKKwkJYXNzZXJ0VHJ1ZSghY29udHJvbCgpLm1lbnUoIlN0YXJ0IikuaXNFbmFibGVkKCkpOworCQljb250cm9sKCkubWVudSgiUmVzdW1lIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDE1MDApOworCQlzdWJUZXN0UGF1c2VSZXN1bWUobW9kZWxBXzEpOworCQlzdWJUZXN0U3RvcFN0YXJ0UmVzdGFydChtb2RlbEFfMSk7CisJCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJYXNzZXJ0RXF1YWxzKGdlZlZpZXdzKCkuc2l6ZSgpLCAwKTsKKwkJYXNzZXJ0RXF1YWxzKG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5zaXplKCksIDApOworCQlhc3NlcnROdWxsKG1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U3RvcFBhdXNlKCkgeworCQlzZXR1cFByb2plY3QoKTsKKwkJYm90LnNsZWVwKDIwMDApOworCQkvLyBzdGFydCBuZXcKKwkJbGF1bmNoTW9kZWwoKTsKKwkJSU1vZGVsIG1vZGVsQV8xID0gYWN0aXZlTW9kZWwoKTsKKwkJY29udHJvbCgpLm1lbnUoIlBhdXNlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDEwMDApOworCQlhc3NlcnRUcnVlKGFjdGl2ZU1vZGVsKCkuZ2V0RW5naW5lKCkuaXNQYXVzZWQoKSk7CisKKwkJLy8gc3RhcnQgYW5vdGhlcgorCQlsYXVuY2hNb2RlbCgpOworCisJCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJYXNzZXJ0VHJ1ZShhY3RpdmVNb2RlbCgpLmdldEVuZ2luZSgpLmlzUGF1c2VkKCkpOworCQlhc3NlcnRFcXVhbHMoYWN0aXZlTW9kZWwoKSwgbW9kZWxBXzEpOworCQlhc3NlcnRFcXVhbHMobWFuYWdlcigpLmdldE1vZGVscygpLnNpemUoKSwgMSk7CisJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJQYXVzZSIpLmlzRW5hYmxlZCgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiU3RvcCIpLmlzRW5hYmxlZCgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiUmVzdW1lIikuaXNFbmFibGVkKCkpOworCQlhc3NlcnRUcnVlKCFjb250cm9sKCkubWVudSgiU3RhcnQiKS5pc0VuYWJsZWQoKSk7CisKKwkJY29udHJvbCgpLm1lbnUoIkNsb3NlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDIwMDApOworCQlhc3NlcnROdWxsKG1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbCgpKTsKKwkJYXNzZXJ0TnVsbChjb250cm9sKCkubWVudSgiUmVzdGFydCIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U3RvcFR3bygpIHsKKwkJc2V0dXBQcm9qZWN0KCk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJLy8gc3RhcnQgbmV3CisJCWxhdW5jaE1vZGVsKCk7CisJCUlNb2RlbCBtb2RlbEFfMSA9IGFjdGl2ZU1vZGVsKCk7CisKKwkJLy8gc3RhcnQgYW5vdGhlcgorCQlsYXVuY2hNb2RlbCgpOworCQlJTW9kZWwgbW9kZWxBXzIgPSBhY3RpdmVNb2RlbCgpOworCisJCWNvbnRyb2woKS5tZW51KCJDbG9zZSIpLmNsaWNrKCk7CisJCWJvdC5zbGVlcCgyMDAwKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdGl2ZU1vZGVsKCksIG1vZGVsQV8xKTsKKwkJYXNzZXJ0RXF1YWxzKG1hbmFnZXIoKS5nZXRNb2RlbHMoKS5zaXplKCksIDEpOworCQlhc3NlcnRUcnVlKG1vZGVsQV8xLmdldEVuZ2luZSgpLmlzUnVubmluZygpKTsKKwkJYXNzZXJ0RmFsc2UobW9kZWxBXzIuZ2V0RW5naW5lKCkuaXNSdW5uaW5nKCkpOworCQlpZiAoIWNvbnRyb2woKS5tZW51KCJSZXN0YXJ0IikuaXNFbmFibGVkKCkpIHsKKwkJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKS5pc0VuYWJsZWQoKSk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShjb250cm9sKCkubWVudSgiUGF1c2UiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoY29udHJvbCgpLm1lbnUoIlN0b3AiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJSZXN1bWUiKS5pc0VuYWJsZWQoKSk7CisJCWFzc2VydFRydWUoIWNvbnRyb2woKS5tZW51KCJTdGFydCIpLmlzRW5hYmxlZCgpKTsKKworCQljb250cm9sKCkubWVudSgiQ2xvc2UiKS5jbGljaygpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCWFzc2VydE51bGwobWFuYWdlcigpLmdldEFjdGl2ZU1vZGVsKCkpOworCQlhc3NlcnRUcnVlKGNvbnRyb2woKSA9PSBudWxsIHx8IGNvbnRyb2woKS5tZW51KCJTdGFydCIpID09IG51bGwpOworCX0KKworCXByaXZhdGUgdm9pZCBsYXVuY2hNb2RlbCgpIHsKKwkJdHJlZSgpLnNldEZvY3VzKCk7CisJCXRyZWUoKS5zZWxlY3QodGVzdFByb2plY3ROYW1lKTsKKwkJU1dUQm90VHJlZUl0ZW0gcHJvamVjdE5vZGUgPSB0cmVlKCkuZXhwYW5kTm9kZSh0ZXN0UHJvamVjdE5hbWUpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCXByb2plY3ROb2RlLmV4cGFuZE5vZGUoIlRlc3RNb2RlbC5tZXRhYWJtIikuZG91YmxlQ2xpY2soKTsKKwkJcGFja2FnZUV4cGxvcmVyKCkuc2V0Rm9jdXMoKTsKKwkJYm90LnNsZWVwKDIwMDApOworCisJCWNvbnRyb2woKS5tZW51KCJFeGVjdXRlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDQwMDApOworCX0KKworCWludCBjb3VudDsKKworCXB1YmxpYyB2b2lkIHV0ZXN0V29ya2JlbmNoTW9kZWxMaXN0ZW5lcnMoKSB7CisJCWNvdW50ID0gMDsKKwkJbWFuYWdlcigpLmdldEFjdGl2ZU1vZGVsTGlzdGVuZXJzKCkuYWRkTGlzdGVuZXIobmV3IEFic3RyYWN0TGlmZWN5Y2xlTGlzdGVuZXIoKSB7CisJCQlPYmplY3QgbW9kZWw7CisKKwkJCXB1YmxpYyB2b2lkIG9ic2VydmluZyhJT2JzZXJ2YXRpb25Qcm92aWRlciBvYnNlcnZlZCkgeworCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7CisJCQkJCWZhaWwoIk1vcmUgdGhhbiBvbmUgbW9kZWwgbGlzdGVuZWQgdG8uIik7CisJCQkJfQorCQkJCW1vZGVsID0gb2JzZXJ2ZWQ7CisJCQkJY291bnQrKzsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgb2JzZXJ2YXRpb25FbmQoSU9ic2VydmF0aW9uUHJvdmlkZXIgb2JzZXJ2ZWQpIHsKKwkJCQltb2RlbCA9IG51bGw7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlKE9iamVjdCBrZXksIE9iamVjdCB1cGRhdGVkKSB7CisJCQkJc3VwZXIuc3RhdGVDaGFuZ2Uoa2V5LCB1cGRhdGVkKTsKKwkJCQlhc3NlcnRUcnVlKHVwZGF0ZWQgPT0gbW9kZWwgfHwgdXBkYXRlZCA9PSBudWxsKTsKKwkJCX0KKwkJfSk7CisJCWxhdW5jaE1vZGVsKCk7CisJCWxhdW5jaE1vZGVsKCk7CisJCWFzc2VydEVxdWFscyhjb3VudCwgMik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFjdGl2YXRlVmlldyhmaW5hbCBMaXN0PElWaWV3UGFydD4gdmlld3MpIHsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpWzBdLmdldEFjdGl2ZVBhZ2UoKS5hY3RpdmF0ZSh2aWV3cy5nZXQoMCkpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc3VidGVzdFBhdXNlUmVzdW1lU3RvcFN0YXJ0UmVzdGFydChJTW9kZWwgbW9kZWwxKSB7CisJCWFzc2VydFRydWUobW9kZWwxICE9IG51bGwpOworCQlhc3NlcnRUcnVlKG1vZGVsMS5nZXRFbmdpbmUoKS5pc1J1bm5pbmcoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlzdWJUZXN0UGF1c2VSZXN1bWUobW9kZWwxKTsKKwkJfQorCQlzdWJUZXN0U3RvcFN0YXJ0UmVzdGFydChtb2RlbDEpOworCX0KKworCXByaXZhdGUgdm9pZCBzdWJUZXN0U3RvcFN0YXJ0UmVzdGFydChJTW9kZWwgbW9kZWwxKSB7CisJCWNvbnRyb2woKS5tZW51KCJTdG9wIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDIwMDApOworCQlhc3NlcnRUcnVlKCFtb2RlbDEuZ2V0RW5naW5lKCkuaXNSdW5uaW5nKCkpOworCQljb250cm9sKCkubWVudSgiU3RhcnQiKS5jbGljaygpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCWFzc2VydFRydWUobW9kZWwxLmdldEVuZ2luZSgpLmlzUnVubmluZygpKTsKKwkJY29udHJvbCgpLm1lbnUoIlJlc3RhcnQiKS5jbGljaygpOworCQlib3Quc2xlZXAoMjAwMCk7CisJCWFzc2VydFRydWUobW9kZWwxLmdldEVuZ2luZSgpLmlzUnVubmluZygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc3ViVGVzdFBhdXNlUmVzdW1lKElNb2RlbCBtb2RlbDEpIHsKKwkJY29udHJvbCgpLm1lbnUoIlBhdXNlIikuY2xpY2soKTsKKwkJYm90LnNsZWVwKDE1MDApOworCQlhc3NlcnRUcnVlKG1vZGVsMS5nZXRFbmdpbmUoKS5pc1BhdXNlZCgpKTsKKwkJY29udHJvbCgpLm1lbnUoIlJlc3VtZSIpLmNsaWNrKCk7CisJCWJvdC5zbGVlcCgxNTAwKTsKKwkJYXNzZXJ0VHJ1ZSghbW9kZWwxLmdldEVuZ2luZSgpLmlzUGF1c2VkKCkpOworCX0KKworCXByaXZhdGUgTGlzdDxTV1RCb3RWaWV3PiBnZWZWaWV3cygpIHsKKwkJcmV0dXJuIG51bGw7CisJCS8vIHJldHVybgorCQkvLyBib3Qudmlld3MoV2lkZ2V0TWF0Y2hlckZhY3Rvcnkud2l0aFBhcnROYW1lKCJEZW1vZ3JhcGhpYyBQcmlzb25lcl9zIERpbGVtbWEgR3JhcGhpYyBWaWV3IikpOworCX0KKworCXByaXZhdGUgTGlzdDxTV1RCb3RWaWV3PiBjaGFydFZpZXdzKCkgeworCQlyZXR1cm4gbnVsbDsKKwkJLy8gcmV0dXJuCisJCS8vIGJvdC52aWV3cyhXaWRnZXRNYXRjaGVyRmFjdG9yeS53aXRoUGFydE5hbWUoIkRlbW9ncmFwaGljIFByaXNvbmVyX3MgRGlsZW1tYSBDaGFydCBWaWV3IikpOworCX0KKworCXByaXZhdGUgU1dUQm90TWVudSBjb250cm9sKCkgeworCQlyZXR1cm4gYm90Lm1lbnUoIkNvbnRyb2wiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1vZGVsVmlld01hbmFnZXIgbWFuYWdlcigpIHsKKwkJcmV0dXJuIE1vZGVsVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElNb2RlbCBhY3RpdmVNb2RlbCgpIHsKKwkJcmV0dXJuIChJTW9kZWwpIG1hbmFnZXIoKS5nZXRBY3RpdmVNb2RlbCgpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXR1cFByb2plY3QoKSB7CisJCWJvdC5zbGVlcCgzMDAwKTsKKwkJYm90LnZpZXdCeVRpdGxlKCJXZWxjb21lIikuY2xvc2UoKTsKKwkJYm90LnBlcnNwZWN0aXZlQnlMYWJlbCgiQWdlbnQgTW9kZWxpbmciKS5hY3RpdmF0ZSgpOworCQlib3Qudmlld0J5VGl0bGUoIlBhY2thZ2UgRXhwbG9yZXIiKS5zZXRGb2N1cygpOworCQl0cnkgeworCQkJdHJlZSgpLmV4cGFuZE5vZGUodGVzdFByb2plY3ROYW1lKTsKKwkJfSBjYXRjaCAoV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJYm90LnNsZWVwKDMwMDApOworCQkJYm90Lm1lbnUoIkZpbGUiKS5tZW51KCJOZXciKS5tZW51KCJBZ2VudCBNb2RlbGluZyBFc2NhcGUgUHJvamVjdCIpLmNsaWNrKCk7CisJCQkvLyAnY29tLnN3dGJvdC50ZXN0LnByb2plY3QnIGlzIHRoZSBqYXZhIHByb2plY3QgbmFtZSB0byBjcmVhdGUKKwkJCWJvdC5zbGVlcCgyMDAwKTsKKworCQkJYm90LnRleHQoMCkuc2V0VGV4dCh0ZXN0UHJvamVjdE5hbWUpOworCQkJLy8gQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24KKworCQkJYm90LmJ1dHRvbigiRmluaXNoIikuY2xpY2soKTsKKwkJCXRyeSB7CisJCQkJY29weUZpbGVzKCJvcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0IiwgInJlcy9UZXN0TW9kZWwubWV0YWFibSIsIHRlc3RQcm9qZWN0TmFtZSwgIlRlc3RNb2RlbC5tZXRhYWJtIik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlMSk7CisJCQl9CisJCQlib3Quc2xlZXAoNTAwMCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L1BhcmFtZXRlckV4ZWN1dGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvdGVzdC9QYXJhbWV0ZXJFeGVjdXRpb25UZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmFtcC5heGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L1BhcmFtZXRlckV4ZWN1dGlvblRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuYW1wLmF4Zi90ZXN0cy9vcmcuZWNsaXBzZS5hbXAuYXhmLmlkZS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9hbXAvYXhmL2lkZS90ZXN0L1BhcmFtZXRlckV4ZWN1dGlvblRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmF4Zi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvVGVzdEV4ZWN1dGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5heGYvdGVzdHMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvdGVzdC9UZXN0RXhlY3V0aW9uVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5hbXAuYXhmL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUudGVzdC9zcmMvb3JnL2VjbGlwc2UvYW1wL2F4Zi9pZGUvdGVzdC9UZXN0RXhlY3V0aW9uVGVzdC5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5hbXAuYXhmL3Rlc3RzL29yZy5lY2xpcHNlLmFtcC5heGYuaWRlLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2FtcC9heGYvaWRlL3Rlc3QvVGVzdEV4ZWN1dGlvblRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCA0MzNlNDgyLi5jN2Y3MGU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTgsMTAgKzE4LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxpbmNsdWRlcwogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFtcC5hZ2YuY2hhcnQiCiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgpAQCAtMzMsMjcgKzI5LDI3IEBACiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5nZWYiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5heGYudmlld3MiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYWdmLmNvcmUiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5heGYuY29yZSIgdmVyc2lvbj0iMC45LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5heGYuaWRlIiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmFnZi56ZXN0IiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlIiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5hc2NhcGUuY2hhcnQiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYXhmLmNvcmUiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYXhmLnZpZXdzIiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmFnZi5jb3JlIiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmF4Zi5pZGUiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYWdmLnplc3QiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0IiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5hc2NhcGUiIHZlcnNpb249IjAuOS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmNvbW1vbnMubGFuZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hc2NhcGUuY29yZSIgdmVyc2lvbj0iNS4yLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvciIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucyIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuY29tbW9ucy5sYW5nIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5lbmdpbmUiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5nZWYiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0IiB2ZXJzaW9uPSIwLjkuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2UuZXh0ZW5zaW9uIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2Uuc3d0Ii8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5lbmdpbmUuZXh0ZW5zaW9uIi8+CkBAIC0xMDMsNCArOTksMTEgQEAKICAgICAgICAgIHZlcnNpb249IjAuMC4wIgogICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgogCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCiA8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5ydW50aW1lL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNmIxYjQ4Li4yMWRmMjU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmVzY2FwZS5ydW50aW1lL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmFtcC5lc2NhcGUvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuZXNjYXBlLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTE1LDggKzE1LDggQEAKICBvcmcuZWNsaXBzZS5hbXAuZXNjYXBlLmFzY2FwZS5jaGFydDtidW5kbGUtdmVyc2lvbj0iMC45LjAiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAogIG9yZy5lY2xpcHNlLmFtcC5lc2NhcGUuYXNjYXBlLmFnZjNkO2J1bmRsZS12ZXJzaW9uPSIwLjkuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsCiAgb3JnLmVjbGlwc2UuamZhY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmFwYWNoZS5jb21tb25zLmxhbmc7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zO3Jlc29sdXRpb246PW9wdGlvbmFsO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9uczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKICBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmVuZ2luZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKICBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5leHRlbnNpb24sCiAgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2Uuc3d0LApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbGwtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuYWxsLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMTIyM2NjZC4uYzA3YjYwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5hbGwtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmFsbC1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0xOCwxMCArMTgsNiBAQAogICAgICAgJWxpY2Vuc2UKICAgIDwvbGljZW5zZT4KIAotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiVBTVBVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvcmVsZWFzZXMvaW5kaWdvIi8+Ci0gICA8L3VybD4KLQogICAgPGluY2x1ZGVzCiAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW1wLmF4ZiIKICAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmRvYy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuYW1wL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5kb2MtZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAzZjQ0M2U0Li5lODVkZGRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmRvYy1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuZG9jLWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE4LDEwICsxOCw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJUFNUFVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgIDwvdXJsPgotCiAgICA8aW5jbHVkZXMKICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbXAuYWdmLmNoYXJ0LnNvdXJjZSIKICAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmV4YW1wbGVzLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLmV4YW1wbGVzLWZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNmY1NDBiMi4uM2RiYWMyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYW1wL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmFtcC5leGFtcGxlcy1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAuZXhhbXBsZXMtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMTcsMTAgKzE3LDYgQEAKICAgICAgICVsaWNlbnNlCiAgICA8L2xpY2Vuc2U+CiAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIlQU1QVXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2FtcC91cGRhdGVzL3JlbGVhc2VzL2luZGlnbyIvPgotICAgPC91cmw+Ci0KICAgIDxwbHVnaW4KICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbXAuYW1mLmV4YW1wbGVzLmVzY2FwZSIKICAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAvZmVhdHVyZXMvb3JnLmVjbGlwc2UuYW1wLnRlc3QtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAudGVzdC1mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGJhYmQyYWMuLmYzMmU4NjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAudGVzdC1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmFtcC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5hbXAudGVzdC1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC02MSwxNyArNjEsMTQgQEAKIFRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KICAgIDwvbGljZW5zZT4KIAotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiVBTVBVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvYW1wL3VwZGF0ZXMvcmVsZWFzZXMvaW5kaWdvIi8+Ci0gICA8L3VybD4KLQogICAgPHJlcXVpcmVzPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlLmVkaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiIHZlcnNpb249IjMuOC4xIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5jb21tb25zLmxhbmciLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0IiB2ZXJzaW9uPSI0LjguMSIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLmFtcC5idWlsZC1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLmFtcC5idWlsZC1mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDQ4Mjk0ZWUuLjdhYTg1ZjcgMTAwNjQ0Ci0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5hbXAuYnVpbGQtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9yZWxlbmcvb3JnLmVjbGlwc2UuYW1wLmJ1aWxkLWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTE3LDEwICsxNyw2IEBACiAgICAgICAlbGljZW5zZQogICAgPC9saWNlbnNlPgogCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9hbXAvdXBkYXRlcy9yZWxlYXNlcy9pbmRpZ28iLz4KLSAgIDwvdXJsPgotCiAgICA8aW5jbHVkZXMKICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbXAuYWxsIgogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KQEAgLTM3LDQgKzMzLDE4IEBACiAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW1wLmFtZi50YXJnZXQuZXNjYXBlM2QiCiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgogCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxhbmciCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKIDwvZmVhdHVyZT4K