ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL29wZW5jZXJ0L2V2bS9ldmlkc3BlYy9ldmlkZW5jZS9zZWFyY2gvLmdpdGlnbm9yZSBiL29yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL29wZW5jZXJ0L2V2bS9ldmlkc3BlYy9ldmlkZW5jZS9zZWFyY2gvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MWQyNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9vcGVuY2VydC9ldm0vZXZpZHNwZWMvZXZpZGVuY2Uvc2VhcmNoLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vT3NsY0ttUXVlcnlDRE9IYW5kbGVyLmphdmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL29wZW5jZXJ0L2V2bS9ldmlkc3BlYy9ldmlkZW5jZS9zZWFyY2gvT3NsY0ttUXVlcnlDRE9IYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9vcGVuY2VydC9ldm0vZXZpZHNwZWMvZXZpZGVuY2Uvc2VhcmNoL09zbGNLbVF1ZXJ5Q0RPSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODgwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9vcGVuY2VydC9ldm0vZXZpZHNwZWMvZXZpZGVuY2Uvc2VhcmNoL09zbGNLbVF1ZXJ5Q0RPSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUmV1c2UgQ29tcGFueQ0KKyAqIA0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCisgKg0KKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wDQorICogIA0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgIEx17XMgQWxvbnNvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICogICBCb3JqYSBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLnNlYXJjaDsNCisNCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsNCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247DQoraW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uQ0RPT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmNvbW1vbi5pZC5DRE9JRDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5jb21tb24uaWQuQ0RPSURVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udXRpbC5jb25uZWN0aW9uLkNET0Nvbm5lY3Rpb25VdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnNlc3Npb24uQ0RPU2Vzc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby52aWV3LkNET1ZpZXc7DQorDQoraW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOw0KKw0KK3B1YmxpYyBjbGFzcyBPc2xjS21RdWVyeUNET0hhbmRsZXIgew0KKw0KKwkvLyBEZWZhdWx0IFJlbW90ZSBVcmkgY29uZmlndXJhdGlvbjoNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVHJjQW1hc3NXZWJTZXJ2aWNlVXJsID0gImh0dHA6Ly9hdXRob3JpbmcucmV1c2Vjb21wYW55LmNvbTo5OTk5L09zbGNLbVNlcnZpY2Uuc3ZjL0luZGV4UmVxdWlyZW1lbnQiOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUcmNBbWFzc1dlYlNlcnZpY2VVcmxfUmV0cmlldmFsID0gImh0dHA6Ly9hdXRob3JpbmcucmV1c2Vjb21wYW55LmNvbTo5OTk5L09zbGNLbVNlcnZpY2Uuc3ZjL1JldHJpZXZlU2ltaWxhclJlcXVpcmVtZW50cyI7DQorDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFN0cmluZ0VtcHR5ID0gIiI7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIdHRwUG9zdFByb3RvY29sTmFtZSA9ICJQT1NUIjsNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENvbnRlbnRUeXBlUmVxdWVzdFByb3BlcnR5ID0gIkNvbnRlbnQtVHlwZSI7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKc29uQ29udGVudFR5cGVSZXF1ZXN0UHJvcGVydHlWYWx1ZSA9ICJhcHBsaWNhdGlvbi9qc29uIjsNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENvbnRlbnRMZW5ndGhSZXF1ZXN0UHJvcGVydHkgPSAiQ29udGVudC1MZW5ndGgiOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQXNjaWlGb3JtYXQgPSAiQVNDSUkiOw0KKw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmVxVGV4dFBhcmFtID0gInRleHQiOw0KKw0KKwkvLyBKc29uIHBhcnRzOg0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSnNvblN0YXJ0V2ViUmVxdWVzdCA9ICJ7XCIiOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSnNvbkVuZFdlYlJlcXVlc3QgPSAiXCJ9IjsNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpzb25BdHRyaWJ1dGVWYWx1ZVNlcGFyYXRvcldlYlJlcXVlc3QgPSAiXCI6XCIiOw0KKw0KKwkvLyBBbnN3ZXIgaGVhZGVycyAvIGZvb3RlcnM6DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxSZXNwb25zZUhlYWRlciA9ICI8c3RyaW5nIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vXCI+IjsNCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFJlc3BvbnNlRm9vdGVyID0gIjwvc3RyaW5nPiI7DQorCS8vIERlYnVnIG1lc3NhZ2VzOg0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSHR0cFdlYlJlcXVlc3RFcnJvck1lc3NhZ2UgPSAiRmFpbGVkIDogSFRUUCBlcnJvciBjb2RlIDogIjsNCisNCisJcHVibGljIHN0YXRpYyBMaXN0PENET09iamVjdD4gUnVuUXVlcnkoU3RyaW5nIHF1ZXJ5LCBDRE9TZXNzaW9uIGNkb1Nlc3Npb24pIHsNCisJCVN0cmluZyBxdWVyeVJlc3VsdCA9ICIiOw0KKwkJdHJ5IHsNCisJCQkvLyBTZXJ2aWNlIGludm9rZQ0KKwkJCXF1ZXJ5UmVzdWx0ID0gZ2V0U2ltaWxhclJlcXVpcmVtZW50c0luT3NsY0ttUmVwb3NpdG9yeShxdWVyeSk7DQorCQl9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpIHsNCisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyBmb3IgcXVlcnkgJyIgKyBxdWVyeSArICInOiAiICsgcXVlcnlSZXN1bHQpOw0KKw0KKwkJQ0RPVmlldyB2aWV3Q0RPID0gQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2Uub3BlblZpZXcoY2RvU2Vzc2lvbik7DQorCQlMaXN0PENET09iamVjdD4gY2RvT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8Q0RPT2JqZWN0PigpOw0KKwkJTGlzdDxTdHJpbmc+IGlkc0Zyb21Kc29uID0gbnVsbDsNCisJCWlmIChxdWVyeVJlc3VsdCAhPSBudWxsICYmIHF1ZXJ5UmVzdWx0ICE9ICIiKSB7DQorCQkJaWRzRnJvbUpzb24gPSBHZXRPYmplY3RzRnJvbUpzb24ocXVlcnlSZXN1bHQpOw0KKwkJCWlmIChpZHNGcm9tSnNvbiAhPSBudWxsICYmIGlkc0Zyb21Kc29uLnNpemUoKSA+IDApIHsNCisNCisJCQkJQ0RPT2JqZWN0IGNkb09iamVjdCA9IG51bGw7CQkJDQorCQkJCVN0cmluZyBjZG9JZEFzU3RyaW5nID0gbnVsbDsNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHNGcm9tSnNvbi5zaXplKCk7IGkrKykgew0KKwkJCQkJY2RvSWRBc1N0cmluZyA9IGlkc0Zyb21Kc29uLmdldChpKTsNCisJCQkJCWlmIChjZG9JZEFzU3RyaW5nICE9IG51bGwpIHsNCisJCQkJCQljZG9PYmplY3QgPSByZXNvbHZlQ0RPT2JqZWN0KGNkb0lkQXNTdHJpbmcsIHZpZXdDRE8pOw0KKwkJCQkJCWlmIChjZG9PYmplY3QgIT0gbnVsbCAmJiAhY2RvT2JqZWN0cy5jb250YWlucyhjZG9PYmplY3QpKSB7DQorCQkJCQkJCWNkb09iamVjdHMuYWRkKGNkb09iamVjdCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGNkb09iamVjdHM7DQorCX0NCisNCisJcHJpdmF0ZSBzdGF0aWMgQ0RPT2JqZWN0IHJlc29sdmVDRE9PYmplY3QoU3RyaW5nIG9iamVjdElkLCBPYmplY3QgY29udGV4dCkgew0KKwkJLy8gdGhlIG9ubHkgY29udGV4dCB3ZSBjYW4gaGFuZGxlIGF0IHRoZSBtb21lbnQgaXMgYSBDRE9WaWV3DQorCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIENET1ZpZXcpIHsNCisJCQl0cnkgew0KKwkJCQlDRE9JRCBpZCA9IENET0lEVXRpbC5yZWFkKG9iamVjdElkKTsNCisJCQkJQ0RPVmlldyB2aWV3ID0gKENET1ZpZXcpIGNvbnRleHQ7DQorCQkJCUNET09iamVjdCBvYmplY3QgPSB2aWV3LmdldE9iamVjdChpZCwgdHJ1ZSk7DQorCQkJCXJldHVybiBvYmplY3Q7DQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQkJLy8gaWdub3JlDQorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltaWxhclJlcXVpcmVtZW50c0luT3NsY0ttUmVwb3NpdG9yeShTdHJpbmcgdGV4dCkgdGhyb3dzIGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gew0KKwkJU3RyaW5nIHJlc3VsdCA9ICIiOw0KKwkJSHR0cFVSTENvbm5lY3Rpb24gY29ubjsNCisJCWNvbm4gPSBudWxsOw0KKwkJRGF0YUlucHV0U3RyZWFtIGRvaTsNCisJCWRvaSA9IG51bGw7DQorCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsNCisJCWlucHV0U3RyZWFtID0gbnVsbDsNCisJCVNjYW5uZXIgczsNCisJCXMgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmVxdWFscyhTdHJpbmdFbXB0eSkpIHsNCisNCisJCQkJLy8gQnVpbGRpbmcgUE9TVCBwYXJhbWV0ZXJzDQorCQkJCVN0cmluZ0J1aWxkZXIgcG9zdERhdGEgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKwkJCQlwb3N0RGF0YS5hcHBlbmQoSnNvblN0YXJ0V2ViUmVxdWVzdCk7DQorCQkJCXBvc3REYXRhLmFwcGVuZChSZXFUZXh0UGFyYW0pOw0KKwkJCQlwb3N0RGF0YS5hcHBlbmQoSnNvbkF0dHJpYnV0ZVZhbHVlU2VwYXJhdG9yV2ViUmVxdWVzdCk7DQorCQkJCXBvc3REYXRhLmFwcGVuZCh0ZXh0KTsNCisJCQkJcG9zdERhdGEuYXBwZW5kKEpzb25FbmRXZWJSZXF1ZXN0KTsNCisNCisJCQkJYnl0ZVtdIHBvc3REYXRhQnl0ZXMgPSBwb3N0RGF0YS50b1N0cmluZygpLmdldEJ5dGVzKEFzY2lpRm9ybWF0KTsNCisNCisJCQkJVVJMIHVybCA9IG5ldyBVUkwoVHJjQW1hc3NXZWJTZXJ2aWNlVXJsX1JldHJpZXZhbCk7DQorDQorCQkJCWNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOw0KKwkJCQljb25uLnNldFJlcXVlc3RNZXRob2QoSHR0cFBvc3RQcm90b2NvbE5hbWUpOw0KKwkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShDb250ZW50VHlwZVJlcXVlc3RQcm9wZXJ0eSwgSnNvbkNvbnRlbnRUeXBlUmVxdWVzdFByb3BlcnR5VmFsdWUpOw0KKwkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShDb250ZW50TGVuZ3RoUmVxdWVzdFByb3BlcnR5LCBTdHJpbmcudmFsdWVPZihwb3N0RGF0YUJ5dGVzLmxlbmd0aCkpOw0KKwkJCQljb25uLnNldERvT3V0cHV0KHRydWUpOw0KKwkJCQljb25uLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHBvc3REYXRhQnl0ZXMpOw0KKw0KKwkJCQlpZiAoY29ubi5nZXRSZXNwb25zZUNvZGUoKSAhPSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LKSB7DQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSHR0cFdlYlJlcXVlc3RFcnJvck1lc3NhZ2UgKyBjb25uLmdldFJlc3BvbnNlQ29kZSgpKTsNCisNCisJCQkJfSBlbHNlIHsNCisNCisJCQkJCWlucHV0U3RyZWFtID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOw0KKwkJCQkJZG9pID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7DQorCQkJCQlyZXN1bHQgPSBkb2kucmVhZExpbmUoKTsNCisNCisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmVxdWFscyhTdHJpbmdFbXB0eSkpIHsNCisJCQkJCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZShYTUxSZXNwb25zZUhlYWRlciwgU3RyaW5nRW1wdHkpOw0KKwkJCQkJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFhNTFJlc3BvbnNlRm9vdGVyLCBTdHJpbmdFbXB0eSk7DQorCQkJCQl9DQorDQorCQkJCQkvLyBzID0gbmV3IFNjYW5uZXIoaW5wdXRTdHJlYW0pOw0KKwkJCQkJLy8gcy51c2VEZWxpbWl0ZXIoRGVsaW1pdGVyKTsNCisJCQkJCS8vIHJlc3VsdCA9IHMuaGFzTmV4dEJvb2xlYW4oKSA/IHMubmV4dEJvb2xlYW4oKSA6IGZhbHNlOw0KKwkJCQl9DQorCQkJfQ0KKwkJfSBjYXRjaCAoamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBlKSB7DQorCQkJU3RyaW5nIGVycm9yTWVzc2FnZTsNCisJCQllcnJvck1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKSArICIgQCAiICsgVHJjQW1hc3NXZWJTZXJ2aWNlVXJsOw0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1lc3NhZ2UpOw0KKwkJCXRocm93IGU7DQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0gZmluYWxseSB7DQorCQkJaWYgKHMgIT0gbnVsbCkgew0KKwkJCQlzLmNsb3NlKCk7DQorCQkJCXMgPSBudWxsOw0KKwkJCX0NCisJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgew0KKwkJCQl0cnkgew0KKwkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsNCisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MSkgew0KKw0KKwkJCQl9DQorCQkJCWlucHV0U3RyZWFtID0gbnVsbDsNCisJCQl9DQorCQkJaWYgKGNvbm4gIT0gbnVsbCkgew0KKwkJCQljb25uLmRpc2Nvbm5lY3QoKTsNCisJCQkJY29ubiA9IG51bGw7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBHZXRPYmplY3RzRnJvbUpzb24oU3RyaW5nIGpzb24pIHsNCisJCWZpbmFsIEdzb24gZ3NvbjsNCisJCWdzb24gPSBuZXcgR3NvbigpOw0KKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG51bGw7DQorCQlSZWFkZXIgaW5wdXRTdHJpbmcgPSBudWxsOw0KKwkJQnVmZmVyZWRSZWFkZXIgaW5Gcm9tVXNlciA9IG51bGw7DQorCQl0cnkgew0KKwkJCWlucHV0U3RyaW5nID0gbmV3IFN0cmluZ1JlYWRlcihqc29uKTsNCisJCQlpbkZyb21Vc2VyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0U3RyaW5nKTsNCisJCQlyZXN1bHQgPSBnc29uLmZyb21Kc29uKGluRnJvbVVzZXIsIExpc3QuY2xhc3MpOw0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKGV4LmdldE1lc3NhZ2UoKSk7DQorCQkJdGhyb3cgZXg7DQorCQl9IGZpbmFsbHkgew0KKwkJCWlmIChpbnB1dFN0cmluZyAhPSBudWxsKSB7DQorCQkJCXRyeSB7DQorCQkJCQlpbnB1dFN0cmluZy5jbG9zZSgpOw0KKwkJCQkJaW5wdXRTdHJpbmcgPSBudWxsOw0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAoaW5Gcm9tVXNlciAhPSBudWxsKSB7DQorCQkJCXRyeSB7DQorCQkJCQlpbkZyb21Vc2VyLmNsb3NlKCk7DQorCQkJCQlpbkZyb21Vc2VyID0gbnVsbDsNCisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorfQ0K